RailsアプリケーションからSprocketsが受け持っている処理をNodeパッケージに移そうとした挑戦の記録です。joker1007さんの https://github.com/joker1007/rails_browserify_sample や https://speakerdeck.com/joker1007/throw-away-sprockets を参考にしました 作ったのはこちら https://github.com/katryo/katryo_rails4
Sprocketsઈͪʹઓͨ͠@katryo
View Slide
@katryoRubyͱRailsɺ͖Ͱ͢ɻ%FOLJOPWFMͱ͍͏8FCΞϓϦӡӦͯ͠·͢ɻʮ8FCΤϯδχΞͷͨΊͷ8FCαʔϏεσβΠϯ࣮ફߨ࠲ʯ ͷࡐʹͳΓ·ͨ͠
࠷ॳʹ݁
4QSPDLFUTઈͯ·ͤΜͰͨ͠
ͯ͞
4QSPDLFUTͱʁ
Rack͚ϥΠϒϥϦ• ΞηοτʹΞΫηε͢ΔͨΊͷύεཧ• SASS, CoffeeScriptͳͲͷίϯύΠϧ• ίϯύΠϧ࣌ɺϋογϡΛ༩͑ͯdigest͢Δ͜ͱͰ͖Δ• ґଘؔཧ
ศར͚ͩͲͨ·ʹࠔΔ
SprocketsΛ͍ͬͯͯࠔΔ͜ͱ• ϓϦίϯύΠϧͰམͪΔ• productionͩͱͳ͔ͥը૾͕404• CoffeeScriptҎ֎ͷAltJS͍͍ͨ• σΧΠ͠ԿͬͯΔ͔Α͘Θ͔ΒΜ
rake assets:precompileΛஔ͖͑Δ
औͬͨઓུ• gulpͰ࣮ߦλεΫΛཧ• SASS, CoffeeͷίϯύΠϧgulpͷλεΫͰ࣮ߦ• NodeͷύοέʔδnpmͰཧ• ϑϩϯτΤϯυͷϥΠϒϥϦbowerͰཧ• JSͷґଘؔBrowserifyͰղܾ
rake assets:precompileͰ͍ͬͯΔ͜ͱΛ࠶ݱͤͶͳΒͳ͍• app/assets ҎԼͷϑΝΠϧΛίϯύΠϧ• ϑΝΠϧ໊ʹϋογϡΛͯ͠digestʹ͢Δ• public/assetsҎԼʹΞηοτΛೖΕΔ• ݩͷϑΝΠϧ໊ͱdigestʹͳͬͨϑΝΠϧ໊ͱͷϚοϐϯάΛmanifest-{md5ͷϋογϡ}.jsonʹॻ͍ͯpublic/assetsʹೖΕΔ
Ͳ͏ͬͨΒrake assets:precompileΛ ସͰ͖Δͷ͔ʁ
SprocketsͷλεΫΛସ• CoffeeScript, SCSSΛίϯύΠϧ• JSΛॱ൪௨Γʹฒͯ1ͭͷϑΝΠϧʹ͢Δ• JSΛuglify• CSSΛminify• ϑΝΠϧ໊ʹϋογϡΛՃͯ͠digest͢Δ
CoffeeScript, SCSSΛ ίϯύΠϧ
gulpͰΑ͘Δͭsass = require ‘gulp-sass'gulp.task 'css', ->gulp.src ['./app/assets/stylesheets/*.scss', './bower_components/bootstrap-sass/dist/css/bootstrap.min.css'].pipe plumber().pipe sass()
ίϯύΠϧղܾ
JSΛॱ൪௨Γʹฒͯ1ͭͷϑΝΠϧʹ͢Δ
Browserify&Debowerify
Browserify• NodeͷྲّྀͰॻ͍ͨJSͷίʔυΛϒϥβ͚ʹม͢Δ• ґଘؔΛఆٛͯ͠هड़Ͱ͖Δ• ͱͱNodeύοέʔδΛϒϥβͰ͑ΔΑ͏ʹ͢ΔϥΠϒϥϦͩͬͨ• ࠓͰͦͷతͰ͑Δ
Debowerify• BowerύοέʔδΛBrowserify͕ѻ͑ΔΑ͏ʹ͢Δ• gulpͷbrowserifyλεΫͰར༻͢Δ
JSͷgulp task
entry.coffee/PEFͬΆ͘ɺґଘؔΛهड़
JSͷґଘؔղܾ
JSΛuglify => gulp-uglifyCSSΛminify => concat͔ͯ͠Βgulp-css-minify
ܰྔԽɾಡԽղܾ
ϑΝΠϧ໊ʹϋογϡΛՃͯ͠digest͢Δ
rake assets:precompileͷࣄͷͻͱͭ
digestͱʁϑΝΠϧͷ༰ΛͱʹϋογϡΛࢉग़͠ɺϑΝΠϧ໊ʹه͢Δɻsomefile.js => somefile-d2403a83.jsϑΝΠϧͷ༰͕มԽͨ͠ͱ͖͚ͩɺϑΝΠϧ໊มԽ͢ΔɻϒϥβͷΩϟογϡରࡦɺCDNରԠʹޮՌత
image_path(‘pic.jpg’)ͱ͔ͷϝιουͰɺ ಡΈࠐΉϑΝΠϧΛ ಈతʹมԽ͍ͤͯ͞Δasset_path(‘background.jpg’)
gulp-rev&gulp-rev-rails-manifest
ϑΝΠϧ໊ʹϋογϡΛՃͯ͠ɺmanifest-{md5hash}.jsonΛ࡞Δ
manifest-{md5hash}.jsonpublic/assetsͷϑΝΠϧ໊ͱɺapp/assetsͷϑΝΠϧ໊ͷରԠ͚Λهड़ɻSprockets͜ΕΛಡΜͰɺasset_pathͳͲͷύεΛϑΝΠϧ໊ͱؔ࿈͚Δ
digestղܾ ……ͱɺ͜ͷͱ͖ࢥ͍ͬͯ·ͨ͠
࠷ޙͷఢ
CSSͷasset_path
css.erb(scss.erb)ͷதͰ asset_pathΛ͍ͬͯΔbackground: url();
μϝͰͨ͠
• scss.erbɺNodeͰCSSʹίϯύΠϧͤͶͳΒͳ͍• ͔͠͠scss.erbͷasset_pathϝιουɺNodeͰཧղͰ͖ͳ͍• ແཧΆ͍……
͜ΕΛղܾ͢Δʹʁ• CSSͰɺdigestͱݩϑΝΠϧ໊ͷؔ࿈͚Λߦ͏ϝιουɺNodeͰղܾͰ͖Δॻ͖ํͰߦ͏• ؤுΕasset_pathͱ͔Λmanifest.jsonʹରԠͤͯ͞ɺcssͷॻ͖͑Λߦ͏ॲཧΛNodeͰࣗ࡞Ͱ͖ͦ͏͚ͩͲɺͪΐͬͱ໘ͦ͏
ͰCSSͰ SprocketsΛΘͳ͚Ε ͳΜͱ͔ͳΔ
ײ
SprocketsઈͪɺͰ͖ͳ͘ͳ͍͚Ͳ ͚ͬ͜͏໘Ͱͨ͠!ΔͳΒ֮ޛͯ͠Ͷˑ