- by#@tonytonyjan
by#@tonytonyjan @"RubyConf"Taiwan,"2015 1 - - PowerPoint PPT Presentation
by#@tonytonyjan @"RubyConf"Taiwan,"2015 1 - - PowerPoint PPT Presentation
by#@tonytonyjan @"RubyConf"Taiwan,"2015 1 @"RubyConf"Taiwan,"2015 2 @"RubyConf"Taiwan,"2015 3 tonytonyjan
- @"RubyConf"Taiwan,"2015
- tonytonyjan
!@tonytonyjan
- "#"Ziltag
- "#"
- "#"Ruby"on"Rails"
- "#"jaro_winkler,"exif,"xdite"gem,"etc
- "#"ConFoo"2015
- "#"Ruby"Kaigi"2014
- C
- Ruby
- Rails
- C+Extension
- JavaScript
- CSS
- @"RubyConf"Taiwan,"2015
- "Rails"
- "JS""Rails"
- @"RubyConf"Taiwan,"2015
!(1/4)
<head> <link rel="stylesheet" href="aaa.css"> <link rel="stylesheet" href="bbb.css"> <link rel="stylesheet" href="ccc.css"> <script src="aaa.js"></script> <script src="bbb.js"></script> <script src="ccc.js"></script> </head>
@"RubyConf"Taiwan,"2015 10HTTP$
@"RubyConf"Taiwan,"2015 11!(2/4)
Conca&na&on
ex.$cat *.js
<head> <link rel="stylesheet" href="all.css"> <script src="all.js"></script> </head>
@"RubyConf"Taiwan,"2015 12- @"RubyConf"Taiwan,"2015
!(3/4)
Compression
ex.$YUI$Compressor
<head> <link rel="stylesheet" href="all.min.css"> <script src="all.min.js"></script> </head>
@"RubyConf"Taiwan,"2015 14- @"RubyConf"Taiwan,"2015
!(4/4)
- <head>
<link rel="stylesheet" href="all.min.css?v2"> <script src="all.min.js?v3"></script> </head>
@"RubyConf"Taiwan,"2015 16!debug
@"RubyConf"Taiwan,"2015 17!Source!Map!
@"RubyConf"Taiwan,"2015 18- 2011$
- @"RubyConf"Taiwan,"2015
- @"RubyConf"Taiwan,"2015
Rails&3.1
!Assets!Pipeline
@"RubyConf"Taiwan,"2015 25Sprockets
@"RubyConf"Taiwan,"2015 26Sprockets**(1/4)
Transform
@"RubyConf"Taiwan,"2015 27Sprockets**(2/4)
Concat'&'Compress
@"RubyConf"Taiwan,"2015 28Sprockets**(3/4)
Digest
@"RubyConf"Taiwan,"2015 29Sprockets**(4/4)
Javascript*Templa/ng
<!-- templates/hello.jst.ejs --> <div>Hello, <span><%= name %></span>!</div>
// application.js //= require templates/hello $("#hello").html(JST["templates/hello"]({ name: "Sam" }));
@"RubyConf"Taiwan,"2015 30- @"RubyConf"Taiwan,"2015
- @"RubyConf"Taiwan,"2015
- @"RubyConf"Taiwan,"2015
- "TypeScript""CoffeeScript
- "LESS""SASS
- "ReactJS""Polymer""JST
- "bower""gem
- "MochaJasmine"
!gem!
@"RubyConf"Taiwan,"2015 36TypeScript*+>*typescript+rails LESS$%>$less%rails ReactJS()>(react)rails
@"RubyConf"Taiwan,"2015 37rails&assets.org
@"RubyConf"Taiwan,"2015 38Gemfile
source 'https://rails-assets.org' do # gem "rails-assets-#{BOWER_PKG_NAME}" gem 'rails-assets-bootstrap' gem 'rails-assets-angular' gem 'rails-assets-leaflet' end
@"RubyConf"Taiwan,"2015 39!gem
@"RubyConf"Taiwan,"2015 40!vendor/assets/
@"RubyConf"Taiwan,"2015 41!gem!
bootstrap(gem((3(
@"RubyConf"Taiwan,"2015 42!gem! !gem!
@"RubyConf"Taiwan,"2015 43- !vendor/assets
!Gemfile
@"RubyConf"Taiwan,"2015 44- @"RubyConf"Taiwan,"2015
- "JST"
- "sprockets"manifest"system"
- "Ruby""JS"
- @"RubyConf"Taiwan,"2015
- Bower,'Gulp,'npm,'Grunt,'...
!Rails
- @"RubyConf"Taiwan,"2015
Rails&+&Bower
@"RubyConf"Taiwan,"2015 51- rails&assets.org
- !Gem!
.bowerrc
{ "directory": "vendor/assets/components" }
- {
"directory": "public/components" }
@"RubyConf"Taiwan,"2015 54assets.rb
Rails.application.config.assets.paths.concnat [ 'vendor/assets/components' ]
@"RubyConf"Taiwan,"2015 55applica&on.scss
@import 'material-design-lite/src/material-design-lite'
applica&on.js
//= require jquery //= require jquery_ujs //= require turbolinks //= require material-design-lite/material
@"RubyConf"Taiwan,"2015 56- @"RubyConf"Taiwan,"2015
- "CSS""assets"
- Autoprefixer
- BrowserSync
- JSHint
- etc
!assets!
!bootstrap!
@font-face { font-family: 'Glyphicons Halflings'; src: url('../fonts/glyphicons-halflings-regular.eot'); }
@"RubyConf"Taiwan,"2015 59bower&install&bootstrap.sass
!sprockets!
@import 'bootstrap-sass/.../bootstrap-sprockets'; @import 'bootstrap-sass/.../bootstrap';
!bower!package!!sass!
@"RubyConf"Taiwan,"2015 60- AutoprefixerBrowserSyncJSHintetc
!Rails
- @"RubyConf"Taiwan,"2015
- @"RubyConf"Taiwan,"2015
Rails&+&Bower&+&gulp
@"RubyConf"Taiwan,"2015 64- @"RubyConf"Taiwan,"2015
Dan$
@"RubyConf"Taiwan,"2015 67- 1.
- 2. $gulp_asset_path$$helper
- 3. public$
katryo'
- gulp&ugify
- gulp&css&minify
- gulp&concat
- gulp&rev
- gulp&rev&rails&manifest
- 1. #sprockets#gem##assets
- 2. #asset_path##etag#string
- 3. #browserfy
- @"RubyConf"Taiwan,"2015
- @"RubyConf"Taiwan,"2015
- @"RubyConf"Taiwan,"2015
- @"RubyConf"Taiwan,"2015
- !Sprockets
!sprockets
- 1. #assets#gem##sprockets##direc1ve#processor
- 2. #compressiondiges1on#
!bowergulpnpm!
@"RubyConf"Taiwan,"2015 78!rails!
@"RubyConf"Taiwan,"2015 79!gem!
@"RubyConf"Taiwan,"2015 80!JS!
@"RubyConf"Taiwan,"2015 81- sprockets)
- @"RubyConf"Taiwan,"2015
- @"RubyConf"Taiwan,"2015
!gem
@"RubyConf"Taiwan,"2015 85- gulp&rev
- gulp&ugilfy
- gulp&css&minify
- gulp&rev&rails&manifest
!sprockets!
@"RubyConf"Taiwan,"2015 86- @"RubyConf"Taiwan,"2015
!code!
@"RubyConf"Taiwan,"2015 88gulp application.js
gulp.task 'application.js', -> gulp.src [ 'app/assets/javascripts/application/manifest.js' 'bower_components/bootstrap/dist/js/bootstrap.js' 'bower_components/material-design-lite/material.js' 'app/assets/javascripts/application/**/*.{coffee,js}' ] .pipe $.if(/\.coffee$/, $.coffee()) # pipe .pipe $.concat('application.js') .pipe gulp.dest 'app/assets/javascripts'
@"RubyConf"Taiwan,"2015 89glup serve
browserSync = require('browser-sync').create() gulp.task 'serve', -> browserSync.init proxy: 'localhost:3000'
@"RubyConf"Taiwan,"2015 90!font!
@"RubyConf"Taiwan,"2015 91!CSS
.logo { background-image: url(logo.png) }
sprockets)SCSS)helper
.logo { background-image: asset-url("logo.png") }
@"RubyConf"Taiwan,"2015 92!ERB
.logo { background-image: url("<%= asset_path 'logo.png' %>") }
!JS!!assets!
@"RubyConf"Taiwan,"2015 93!assets!
config/ini(alizers/assets.rb
Rails.application.config.assets.paths << 'vendor/assets/components' Rails.application.config.assets.paths.concat Dir['vendor/assets/components/**/*/fonts'] Rails.application.config.assets.precompile += %w[*.eot *.woff2 *.woff *.ttf *.svg] @"RubyConf"Taiwan,"2015 94!assets!
Rails.applica)on.assets.paths
/.../hello/app/assets/images /.../hello/app/assets/javascripts /.../hello/app/assets/stylesheets /.../hello/vendor/assets/components /.../hello/vendor/assets/javascripts /.../hello/vendor/assets/stylesheets /.../gems/turbolinks-2.5.3/lib/assets/javascripts /.../gems/jquery-rails-4.0.4/vendor/assets/javascripts /.../gems/coffee-rails-4.1.0/lib/assets/javascripts /.../hello/vendor/assets/components /.../hello/vendor/assets/components/bootstrap-sass/assets/fonts * /.../hello/vendor/assets/components/font-awesome-sass/assets/fonts * @"RubyConf"Taiwan,"2015 95!assets!
- url(path/to/fonts/foo.svg) -> url("<%= asset_path 'foo.svg' %>")
!assets!
!bootstrap)sass!!Mincer
@function twbs-font-path($path) { // do something like following // from "path/to/font.ext#suffix" to "<%- asset_path(path/to/font.ext)) + #suffix %>" // from "path/to/font.ext?#suffix" to "<%- asset_path(path/to/font.ext)) + ?#suffix %>" // or from "path/to/font.ext" just "<%- asset_path(path/to/font.ext)) %>" @return "<%- asset_path('#{$path}'.replace(/[#?].*$/, '')) + '#{$path}'.replace(/(^[^#?]*)([#?]?.*$)/, '$2') %>"; } @"RubyConf"Taiwan,"2015 97!assets!
gulp%replace
$ = require('gulp-load-plugins')() gulp.task 'application.css', -> gulp.src [ 'app/assets/stylesheets/application.scss' 'app/assets/stylesheets/application/**/*.{css,scss,sass}' ] .pipe $.concat 'application' .pipe $.sass includePaths: ['vendor/assets/components'] .pipe $.replace /url\((['"]?)[^\1)]*fonts\/([^\1)]+)\1\)/g, "url('<%= asset_path '$2' %>')" .pipe $.rename 'application.css.erb' .pipe gulp.dest 'app/assets/stylesheets' @"RubyConf"Taiwan,"2015 98- https://github.com/tonytonyjan/rails_gulp_bower
- @"RubyConf"Taiwan,"2015