Slide 1

Slide 1 text

Mark J Smith - @mark_js FutureLearn - @FutureLearn Demystifying
 The
 Rails
 Asset
 Pipeline

Slide 2

Slide 2 text

–Robin Ward, co-founder of Discourse “My feeling was for a long time that the asset pipeline was the worst possible way to manage assets… except for every other way.” https://meta.discourse.org/t/future-thoughts-discourses-javascript-ember-app/16715

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

Assets

Slide 5

Slide 5 text

!"" app $ !"" assets $ $ !"" images $ $ $ &"" main_logo.svg $ $ !"" javascripts $ $ $ !"" admin.js $ $ $ !"" application.js $ $ $ !"" behaviors $ $ $ $ !"" ajax_form_submit.js.coffee $ $ $ $ &"" autocomplete.js.coffee $ $ $ &"" components $ $ $ &"" select_boxes.js.coffee $ $ &"" stylesheets $ $ !"" application.css $ $ !"" components $ $ $ !"" avatars.css.scss $ $ $ !"" modals.css.scss $ $ $ &"" panels.css.scss $ $ !"" typography.css.scss $ $ !"" utils $ $ $ &"" icons.css.scss $ $ &"" vairables.css.scss | ... ... ... &"" vendor &"" assets !"" javascripts $ !"" jquery.form_validation.js $ &"" slider_plugin.js &"" stylesheets !"" icomoon.css &"" slider_plugin.css

Slide 6

Slide 6 text

<%= javascript_link_tag ‘application’ %> <%= stylesheet_link_tag ‘application’ %> = javascript_link_tag ‘application’ = stylesheet_link_tag ‘application’

Slide 7

Slide 7 text

!"" app $ !"" assets $ $ !"" images $ $ $ &"" main_logo.svg $ $ !"" javascripts $ $ $ !"" admin.js $ $ $ !"" application.js $ $ $ !"" behaviors $ $ $ $ !"" ajax_form_submit.js.coffee $ $ $ $ &"" autocomplete.js.coffee $ $ $ &"" components $ $ $ &"" select_boxes.js.coffee $ $ &"" stylesheets $ $ !"" application.css $ $ !"" components $ $ $ !"" avatars.css.scss $ $ $ !"" modals.css.scss $ $ $ &"" panels.css.scss $ $ !"" typography.css.scss $ $ !"" utils $ $ $ &"" icons.css.scss $ $ &"" vairables.css.scss ... ... &"" vendor &"" assets !"" javascripts $ !"" jquery.form_validation.js $ &"" slider_plugin.js &"" stylesheets !"" icomoon.css &"" slider_plugin.css

Slide 8

Slide 8 text

Easy.

Slide 9

Slide 9 text

Rails - http://github.com/rails/rails Sprockets - http://github.com/sstephenson/sprockets Sprockets-Rails - http://github.com/rails/sprockets-rails

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

<%= javascript_link_tag ‘application’ %> <%= stylesheet_link_tag ‘application’ %> - javascript_link_tag ‘application’ - stylesheet_link_tag ‘application’

Slide 12

Slide 12 text

Rails actionview/lib/action_view/helpers/asset_tag_helper.rb ! Sprockets-Rails lib/sprockets/rails/helper.rb

Slide 13

Slide 13 text

Rails actionview/lib/action_view/helpers/asset_tag_helper.rb ! Sprockets-Rails lib/sprockets/rails/helper.rb

Slide 14

Slide 14 text

*Demo*

Slide 15

Slide 15 text

// This is a manifest file that'll be compiled into application.js, which will include all the files // listed below. // // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path. // // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the // compiled file. // // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details // about supported directives. // //= require jquery //= require jquery_ujs //= require turbolinks //= require_tree .

Slide 16

Slide 16 text

Sprockets lib/sprockets/directive_processor.rb

Slide 17

Slide 17 text

<%= javascript_link_tag ‘application’ %> ! Sprockets-Rails lib/sprockets/rails/helper.rb

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

Sprockets lib/sprockets/server.rb ! Sprockets-Rails lib/sprockets/railtie.rb

Slide 20

Slide 20 text

Sprockets lib/sprockets/resolve

Slide 21

Slide 21 text

!"" app $ !"" assets $ $ !"" images $ $ $ &"" main_logo.svg $ $ !"" javascripts $ $ $ !"" admin.js $ $ $ !"" application.js $ $ $ !"" behaviors $ $ $ $ !"" ajax_form_submit.js.coffee $ $ $ $ &"" autocomplete.js.coffee $ $ $ &"" components $ $ $ &"" select_boxes.js.coffee $ $ &"" stylesheets $ $ !"" application.css $ $ !"" components $ $ $ !"" avatars.css.scss $ $ $ !"" modals.css.scss $ $ $ &"" panels.css.scss $ $ !"" typography.css.scss $ $ !"" utils $ $ $ &"" icons.css.scss $ $ &"" vairables.css.scss ... ... &"" vendor &"" assets !"" javascripts $ !"" jquery.form_validation.js $ &"" slider_plugin.js &"" stylesheets !"" icomoon.css &"" slider_plugin.css

Slide 22

Slide 22 text

Processors

Slide 23

Slide 23 text

! register_preprocessor 'text/css', DirectiveProcessor register_preprocessor 'application/javascript', DirectiveProcessor ! register_bundle_processor 'application/javascript', Bundle register_bundle_processor 'text/css', Bundle ! register_compressor 'text/css', :sass, LazyProcessor.new { SassCompressor } register_compressor 'text/css', :scss, LazyProcessor.new { SassCompressor } register_compressor 'text/css', :yui, LazyProcessor.new { YUICompressor } register_compressor 'application/javascript', :closure, LazyProcessor.new { ClosureCompressor } register_compressor 'application/javascript', :uglifier, LazyProcessor.new { UglifierCompressor } register_compressor 'application/javascript', :uglify, LazyProcessor.new { UglifierCompressor } register_compressor 'application/javascript', :yui, LazyProcessor.new { YUICompressor } ! # Mmm, CoffeeScript register_engine '.coffee', LazyProcessor.new { CoffeeScriptTemplate }, mime_type: 'application/javascript' ! # JST engines register_engine '.jst', LazyProcessor.new { JstProcessor }, mime_type: 'application/javascript' register_engine '.eco', LazyProcessor.new { EcoTemplate }, mime_type: 'application/javascript' register_engine '.ejs', LazyProcessor.new { EjsTemplate }, mime_type: 'application/javascript' ! # CSS engines register_engine '.sass', LazyProcessor.new { SassTemplate }, mime_type: 'text/css' register_engine '.scss', LazyProcessor.new { ScssTemplate }, mime_type: 'text/css' ! # Other register_engine '.erb', LazyProcessor.new { ERBTemplate }, mime_type: 'text/plain' !

Slide 24

Slide 24 text

*Demo*

Slide 25

Slide 25 text

In Production

Slide 26

Slide 26 text

No mounted server = no Sprockets

Slide 27

Slide 27 text

rake assets:precompile

Slide 28

Slide 28 text

rake assets:precompile Sprockets-Rails lib/sprockets/rails/task.rb

Slide 29

Slide 29 text

application.js, application.css, **/**.(![js|css])*

Slide 30

Slide 30 text

rake assets:precompile

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

Fin.