rails assets revisited

15
Rails Assets Revisited Jørgen Orehøj Erichsen CTO, Holdsport.dk, Rails freelancer joerichsen @ twitter, github, et. al.

Upload: erichsen

Post on 29-Jul-2015

24 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Rails assets revisited

Rails Assets Revisited• Jørgen Orehøj Erichsen

• CTO, Holdsport.dk, Rails freelancer

• joerichsen @ twitter, github, et. al.

Page 2: Rails assets revisited

The Asset Pipeline• preprocessing

• concatenation

• minification/compression

• fingerprinting

• gzip compression

Page 3: Rails assets revisited

The Asset PipelinePros

• Great Idea

• Just Works (tm)

Cons

• only happens when performing a request

• slow, Slow, SLOW

Page 4: Rails assets revisited

A Faster and More Flexible Approach

Page 5: Rails assets revisited

Gulp• Automate and enhance your workflow

• The streaming build system

Page 6: Rails assets revisited

Gulp Filosofy• stream files through "pipes"

• very "unixy" :-)

Page 7: Rails assets revisited

Gulp Examplevar gulp = require('gulp');var concat = require('gulp-concat');

gulp.task('default', function() { gulp.src(["app/assets/stylesheets/**/*"]) .pipe(concat('application.css')) .pipe( gulp.dest("public/assets/stylesheets/") )});

Page 8: Rails assets revisited

Gulp PluginsReplacing the asset pipeline

• gulp-concat

• gulp-minify-css/gulp-uglify

• gulp-sass/gulp-coffee

• gulp-rev-all

• gulp-gzip

Page 9: Rails assets revisited

Gulp PluginsExtra stuff

• gulp-sourcemaps

• gulp-watch

• gulp-imagemin

• gulp-csslint/gulp-jslint

• gulp-bless

• gulp-filter

Page 10: Rails assets revisited

Example for Rails - part Igulp.task("js", function() { var coffeeFilter = gulpFilter(['**/*.coffee']); gulp.src(["app/assets/javascripts/**/*.coffee", "app/assets/javascripts/**/*.js"]) .pipe(coffeeFilter) .pipe(coffee()) .pipe(coffeeFilter.restore()) .pipe(concat("application.js")); .pipe(gulp.dest("public/javascripts/"))});

Page 11: Rails assets revisited

Example - Updating stuff automaticallygulp.task('watch', function() { gulp.watch("app/assets/javascripts/**/*", ['js']);});

Page 12: Rails assets revisited

Example - Productionif (["production"].indexOf(railsEnv) !== -1) { stream = stream .pipe(uglify()) .pipe(gulp.dest("public/javascripts/")) .pipe(gzip({ gzipOptions: { level: 9 } }))}

Page 13: Rails assets revisited

DEMO

Page 14: Rails assets revisited

Fix Railsclass AssetManifest def self.manifest if File.exists?("rev-manifest.json") @manifest ||= JSON.parse(File.read("rev-manifest.json")) end end

def self.stylesheet_path(url) if AssetManifest.manifest url += ".css" unless url.end_with?(".css") AssetManifest.manifest[url] || url else url end end ...

Page 15: Rails assets revisited

References• http://gulpjs.com/

• https://bugsnag.com/blog/replacing-the-rails-asset-pipeline-with-gulp

• http://viget.com/extend/gulp-rails-asset-pipeline

• http://bower.io/