Rails 3 Asset Pipeline
Damian Galarza http://www.damiangalarza.com @dgalarza
http://www.qfive.com @qfivesports
What is the Asset Pipeline? • Build system for your static assets • Javascript • CSS • Images
What is the Asset Pipeline? • Sass and Coffeescript support by default • Minifies and concatenates resources
Defaults source 'https://rubygems.org' gem 'rails', '3.2.5' # Gems used only for assets and not required # in production environments by default. group :assets do gem 'sass-rails', '~> 3.2.3' gem 'coffee-rails', '~> 3.2.1' # See https://github.com/sstephenson/execjs#readme for more supported runtimes # gem 'therubyracer', :platforms => :ruby gem 'uglifier', '>= 1.0.3' end gem 'jquery-rails'
Storing Assets
app/ asssets/ javascripts/ stylesheets/ images/ vendor/ assets/ javascripts/ stylesheets/ public/ assets/
app/ asssets/ javascripts/ application.js stylesheets/ application.css images/ rails.png
vendor/ assets/ javascripts/ jquery.masonry.js tagit.js stylesheets/ tagit.css
public/ assets/ application-e4b51606cd77f.js rails-e4b51606cd77fda26.png application-e4b51606cd77fd.css
Sprockets https://github.com/sstephenson/ sprockets
Sprockets Javascript //= require core.js //= require jquery.infinitescroll //= require jquery.masonry.min //= require jquery.backstretch.min //= require bootstrap-alert //= require bootstrap-dropdown //= require bootstrap-modal //= require bootstrap-tab //= require_self application.js
Sprockets CSS /** *= require "bootstrap_and_overrides"; *= require 'sprites'; *= require 'layout'; *= require 'typography'; *= require 'admin'; *= require 'clubs'; *= require 'posts'; *= require 'sharing'; *= require 'tags'; *= require 'topics'; *= require 'users'; *= require 'welcome'; *= require 'responsive'; *= require 'landing_pages'; */ application.css
Sprockets = stylesheet_link_tag "application" = javascript_include_tag "application"
Sprockets
Sprockets
Sprockets application-7e817f92bce80b73114a04de53d57b80.js
Cache-Control HTTP header to max-age=31536000 (1 year)
JS Minifcation • Handled by uglifier gem by default
Using a CDN config.action_controller.asset_host = "http://yourhost.cloudfront.net"
Referencing Assets
Sprockets Precompile • ERB files: • layout.js.erb • layout.js.coffee.erb
Referencing Assets $.backstretch('<%= asset_path("bg-image-field-large.jpg") %>');
Referencing Assets $.backstretch("/assets/field-at-night-bw-noise-4cdc7135443f06bdd3857a56a4bf7521.jpg")
Referencing Assets • sass-rails rewrite of helpers: • image-url / image - path
Referencing Assets #mobile-container { ! background: image-url('tour-program-mobile.jpg') no-repeat; }
Referencing Assets #mobile-container { ! background: url("/assets/tour-program-mobile-bdf25b7b3d9971aa362eeb90bf6b4bb6.jpg"); }
Precompiling
bundle exec rake assets:precompile
Capistrano load 'deploy/assets'
Using Compass
gem 'compass-rails'
Use @import
/** *= require "bootstrap_and_overrides"; *= require 'sprites'; *= require 'layout'; *= require 'typography'; *= require 'admin'; *= require 'clubs'; *= require 'posts'; *= require 'sharing'; *= require 'tags'; *= require 'topics'; *= require 'users'; *= require 'welcome'; *= require 'responsive'; *= require 'landing_pages'; */
@import "bootstrap_and_overrides"; @import 'sprites'; @import 'layout'; @import 'typography'; @import 'admin'; @import 'clubs'; @import 'posts'; @import 'sharing'; @import 'tags'; @import 'topics'; @import 'users'; @import 'welcome'; @import 'responsive'; @import 'landing_pages';
Organize
Not everything belongs in application.js
config.assets.precompile += %w{profile.js mobile_application.js}
Make use of dependency building
core.js //= require jquery //= require jquery.ui.autocomplete //= require jquery_ujs //= require tagit //= require underscore //= require jquery.infinitescroll //= require jquery.backstretch.min //= require bootstrap-transition //= require bootstrap-collapse //= require bootstrap-tab //= require handlebars-1.0.0.beta.6.js //= require jwplayer.js //= require relative-date //= require 'facebook' //= require 'comments' //= require 'layout' //= require 'posts' //= require 'sharing' //= require 'users' //= require_self
application.js //= require core.js //= require jquery.effects.blind //= require jquery.infinitescroll //= require jquery.masonry.min //= require jquery.backstretch.min //= require jquery.preview.full //= require jquery.truncator //= require jquery.panda-uploader.js //= require bootstrap-alert //= require bootstrap-dropdown //= require bootstrap-modal //= require bootstrap-tab //= require gmaps4rails/googlemaps //= require 'sign-in' //= require_self
mobile_application.js // Optimized mobile application js //= require core.js //= require mobile_modals.js
Dependencies #= require_tree ./posts $ -> Post.embedlyPreview('#post_link_url') Post.embedlyPreview('#post_video_url') replaceTimesWithRelativeStrings() setupTagging() setupPanda() loadVideo() setupVideoPostOptions() setupShareLinks() setupInfiniteScroll() posts.js
Questions?

Rails3 asset-pipeline