Slide 1

Slide 1 text

Rails 3.1: Asset Pipeline James Daniels Monday, September 26, 11

Slide 2

Slide 2 text

About me @danielsju6 Boston, MA Entrepreneur & Rails Developer; Founder of @marginleft, @accelgolf, lead on @appblade, over user of CamelCase, and a @techstars Boston Alum Monday, September 26, 11

Slide 3

Slide 3 text

appblade.com Makes mobile provisioning, beta tests, and enterprise deployments not suck. SERIOUSLY CHECK IT OUT. Monday, September 26, 11

Slide 4

Slide 4 text

Rails 3.1: Asset Pipeline “Like a boss” James Daniels Monday, September 26, 11

Slide 5

Slide 5 text

The problem Monday, September 26, 11

Slide 6

Slide 6 text

The problem Monday, September 26, 11

Slide 7

Slide 7 text

The problem Monday, September 26, 11

Slide 8

Slide 8 text

The problem • Third-party code mixed into yours • JS/CSS/IMG treated as second class citizens • Organization is fucked • JavaScript in views • Who uses :cache => true anyway Monday, September 26, 11

Slide 9

Slide 9 text

The problem •/public is a fucking junk drawer Monday, September 26, 11

Slide 10

Slide 10 text

Monday, September 26, 11

Slide 11

Slide 11 text

The solution /app /assets /javascripts /stylesheets /images /lib /assets /... /vendor /assets /... Monday, September 26, 11

Slide 12

Slide 12 text

The solution /app /assets /javascripts /stylesheets /images /lib /assets /... /vendor /assets /... //=  require  modernizr //=  require  jquery //=  require  jquery_ujs //=  require  jqueryui //=  require  underscore //=  require  backbone //=  require_tree  . gem ‘jquery-rails’ Monday, September 26, 11

Slide 13

Slide 13 text

The solution //=  require_tree  . requires  app/assets/javascripts/**/* Monday, September 26, 11

Slide 14

Slide 14 text

The solution /= require_tree . /= require_self /= require_directory ‘posts’ /= include ‘file’ /= depend_on ‘file.png’ /= provide ‘something’ Monday, September 26, 11

Slide 15

Slide 15 text

The solution • rails generate scaffold post invoke      assets create          app/assets/javascripts/posts.js invoke      css create          app/assets/stylesheets/users.css invoke      css create          app/assets/stylesheets/_scaffold.css Monday, September 26, 11

Slide 16

Slide 16 text

Features • Cache friendly static filenames application-­‐908e25f4bf641868d8683022a5b62f54.css • Asset organization • Links to assets • Pre-processing projects.css.scss.erb • Post-processing Monday, September 26, 11

Slide 17

Slide 17 text

Sprockets • Manifest files to load js/css app/assets/javascripts/application.js app/assets/stylesheets/application.css • Coffeescript, less, sass, scss, erb • Assets brought in by gems //=  require  modernizr //=  require  jquery //=  require  jquery_ujs //=  require  jqueryui //=  require  underscore //=  require  backbone //=  require_tree  . Monday, September 26, 11

Slide 18

Slide 18 text

Coffeescript Monday, September 26, 11

Slide 19

Slide 19 text

Coffeescript • Language that compiles to javascript hopefully Mark convinced you and me on this # Assignment: number = 42 opposite = true # Conditions: number = -42 if opposite # Functions: square = (x) -> x * x # Arrays: list = [1, 2, 3, 4, 5] # Objects: math = root: Math.sqrt square: square cube: (x) -> x * square x # Splats: race = (winner, runners...) -> print winner, runners # Existence: alert "I knew it!" if elvis? # Array comprehensions: cubes = (math.cube num for num in list) Monday, September 26, 11

Slide 20

Slide 20 text

Javascript compression • Uses execjs which needs to have a javascript runtime node.js, ‘therubyracer’, ‘mustang’, etc. • config.assets.js_compressor  =  :uglifier Monday, September 26, 11

Slide 21

Slide 21 text

Sass... FUCK YEAH! $blue: #3bbfce; $margin: 16px; .content-navigation { border-color: $blue; color: darken($blue, 9%); } .border { padding: $margin / 2; margin: $margin / 2; border-color: $blue; } Monday, September 26, 11

Slide 22

Slide 22 text

Checkout Bourbon • Vendor specific SCSS helpers #Functions -------------------------------- compact(*args) golden-ratio(*args) linear-gradient(*args) grid-width(*args) shade(*args) tint(*args) #Addons -------------------------------- animation-keyframes (fade-in, fade-out) @ button(*args) @ position(*args) #Mixins -------------------------------- animation @ animation(*args) @ animation-basic(*args) @ animation-delay(*args) @ animation-direction(*args) @ animation-duration(*args) @ animation-fill-mode(*args) @ animation-iteration-count(*args) @ animation-name(*args) @ animation-play-state(*args) @ animation-timing-function(*args) @ background-image(*args) @ border-radius(*args) @ box-shadow(*args) @ box-sizing(*args) flex-box @ box(*args) @ box-align(*args) @ box-direction(*args) @ box-flex(*args) @ box-flex-group(*args) @ box-lines(*args) @ box-ordinal-group(*args) @ box-orient(*args) @ box-pack(*args) @ display-box #More mixins -------------------------------- @ inline-block @ linear-gradient(*args) @ radial-gradient(*args) @ transform(*args) transition @ transition(*args) @ transition-delay(*args) @ transition-duration(*args) @ transition-property(*args) @ transition-timing-function(*args) Monday, September 26, 11

Slide 23

Slide 23 text

Asset dependencies /* *= require blueprint/reset *= require blueprint/typography */ body { background: url(<%= asset_path "fuck_coffeescript_this_is_cool.png" %>); } Monday, September 26, 11

Slide 24

Slide 24 text

Tilt ENGINE FILE EXTENSIONS REQUIRED LIBRARIES -------------------------- ----------------------- ---------------------------- ERB .erb, .rhtml none (included ruby stdlib) Interpolated String .str none (included ruby core) Erubis .erb, .rhtml, .erubis erubis Haml .haml haml Sass .sass haml (< 3.1) or sass (>= 3.1) Scss .scss haml (< 3.1) or sass (>= 3.1) Less CSS .less less Builder .builder builder Liquid .liquid liquid RDiscount .markdown, .mkd, .md rdiscount Redcarpet .markdown, .mkd, .md redcarpet BlueCloth .markdown, .mkd, .md bluecloth Kramdown .markdown, .mkd, .md kramdown Maruku .markdown, .mkd, .md maruku RedCloth .textile redcloth RDoc .rdoc rdoc Radius .radius radius Markaby .mab markaby Nokogiri .nokogiri nokogiri CoffeeScript .coffee coffee-script (+ javascript) Creole (Wiki markup) .wiki, .creole creole WikiCloth (Wiki markup) .wiki, .mediawiki, .mw wikicloth Yajl .yajl yajl-ruby Monday, September 26, 11

Slide 25

Slide 25 text

Production • Pre-compilation • Capistrano before :"deploy:symlink", :"deploy:assets"; desc "Compile asets" task :assets do run "cd #{release_path}; RAILS_ENV=#{rails_env} bundle exec rake assets:precompile" end Monday, September 26, 11

Slide 26

Slide 26 text

That’s all folks • gem install rails --pre • Rails guides are being updated Monday, September 26, 11

Slide 27

Slide 27 text

That’s all folks • gem install rails --pre • Rails guides are being updated Monday, September 26, 11