integrating browserify with sprockets

34
Integrating Browserify and Gulp with Sprockets @spikebrehm

Upload: spike-brehm

Post on 18-Jul-2015

321 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Integrating Browserify with Sprockets

Integrating Browserify and Gulp with Sprockets

@spikebrehm

Page 2: Integrating Browserify with Sprockets

Integrating Browserify and Gulp with Sprockets

@spikebrehm

Page 3: Integrating Browserify with Sprockets

Spike Brehm ____________________________

@spikebrehm

@AirbnbNerds

Page 4: Integrating Browserify with Sprockets

Demo app

github.com/spikebrehm/sprockets-node-example

Page 5: Integrating Browserify with Sprockets

Sprockets

Page 6: Integrating Browserify with Sprockets

The Rails asset pipeline. !

Manages assets: JavaScripts, stylesheets, images.

Page 7: Integrating Browserify with Sprockets

Limitations of Sprockets

Page 8: Integrating Browserify with Sprockets

Sprockets was written by Ruby developers, not JavaScript developers.

It doesn’t solve the problems of today’s JavaScript developers.

Page 9: Integrating Browserify with Sprockets

JavaScript dependency management.

1. Local dependencies (application code).

2. External dependencies (third-party libraries).

Page 10: Integrating Browserify with Sprockets

Local dependencies.

That’s nice, but it doesn’t respect order of files relative to each other.

//= require_tree .

//= require collections/todos.js

//= require models/todo.js

//= require_tree .

Page 11: Integrating Browserify with Sprockets

Implicit vs explicit dependencies.

Have to manually specify file order, at the top-level.

vs

Each file expressing its own dependencies.

Page 12: Integrating Browserify with Sprockets

External dependencies.

If I want to add Backbone to my project, I have a few choices:

1. Install a RubyGem.

2. Copy-paste in `vendor`.

Page 13: Integrating Browserify with Sprockets

1. Install a RubyGem.

$ gem install rails-backbone

Using Ruby to install JavaScript??

Have to wait for gem maintainer to update when new version released.

External dependencies.

Page 14: Integrating Browserify with Sprockets

2. Copy-paste in `vendor`.

Go to https://github.com/jashkenas/backbone.

Download latest build.

Manually versioning — append `-1.1.2.js` to filename.

External dependencies.

Page 15: Integrating Browserify with Sprockets

Benefits to NPM

Page 16: Integrating Browserify with Sprockets

Access to the NPM ecosystem.

$ npm install backbone --save

Install any of the 100k+ modules.

$ ls node_modules/backbone

Page 17: Integrating Browserify with Sprockets

Benefits to CommonJS

Page 18: Integrating Browserify with Sprockets

Explicit dependencies.

var Backbone = require('backbone'); var Todo = require(‘./todo'); !var Todos = Backbone.Collection.extend({ model: Todo, … });

Page 19: Integrating Browserify with Sprockets

Explicit dependencies.

Page 20: Integrating Browserify with Sprockets

Browserify

Page 21: Integrating Browserify with Sprockets

Browserify* Use CommonJS to require() modules in the browser.

Page 22: Integrating Browserify with Sprockets

Browserify* Package dependencies from node_modules into our bundle.

Page 23: Integrating Browserify with Sprockets

*or Webpack.

Webpack is like Browserify, but with more bells-and-whistles included by default.

Used by Instagram, Facebook, Yahoo!.

Page 24: Integrating Browserify with Sprockets

Build-time errors

Page 25: Integrating Browserify with Sprockets

Source maps

Page 26: Integrating Browserify with Sprockets

Integrating Browserify into Sprockets

Page 27: Integrating Browserify with Sprockets

Using “Tilt”.

Tilt is the plugin system Sprockets uses to handle .coffee, .sass, etc.

We’ll create custom handler for `.bundle.js` files.

Page 28: Integrating Browserify with Sprockets

BrowserifyTemplate

class BrowserifyTemplate < Tilt::Template

Shells out to Browserify running in Node.

$ ./script/assets/tasks/bundle.js --path app/assets/ javascripts/commonjs/manifest.bundle.js

Page 29: Integrating Browserify with Sprockets

Request for `/assets/commonjs/manifest.bundle.js` comes to Rails ->

Sprockets handles request, calls `BrowserifyTemplate` ->

Shells out to `./script/assets/tasks/bundle.js` ->

Calls Browserify, outputs to STDOUT ->

`BrowserifyTemplate` captures STDOUT ->

Hands output back to Sprockets

Page 30: Integrating Browserify with Sprockets

Enhancing Our Build Pipeline with Browserify Transforms

Page 31: Integrating Browserify with Sprockets

ES6

We can use the “6to5” project to convert ES6 code into ES5 code.

$ npm install --save 6to5ify

Page 32: Integrating Browserify with Sprockets

Why Ditch Gulp?

Page 33: Integrating Browserify with Sprockets

“Why we should stop using Grunt & Gulp”http://blog.keithcirkel.co.uk/why-we-should-stop-using-grunt/

1. For our Sprockets integration, we just want to output to STDOUT, not to a file.

2. Unnecessary overhead — adds ~75ms to each run.

3. Desire to simplify our build system.

Page 34: Integrating Browserify with Sprockets

Thanks! !

More resources available at http://spike.technology

!

@spikebrehm @AirbnbNerds