JavaScript dependency management

34
JS dependency management in a post-Node world Oct 2013 Romain Prieto

Transcript of JavaScript dependency management

Page 1: JavaScript dependency management

JS dependencymanagementin a post-Node world

Oct 2013 Romain Prieto

Page 2: JavaScript dependency management

<script src="jquery-1.9.3.js" /><script src="underscore.js" />

<script src="premium.js" /><script src="products.js" /><script src="ui.js" />

in the old days

Page 3: JavaScript dependency management

multiple requests

Page 4: JavaScript dependency management

multiple requests

Page 5: JavaScript dependency management

dependency management

window.Premium = { calculate: function() { return [ {name: 'Income', price: 40 }, {name: 'Life', price: 60 } ]; }};

premium.js

Page 6: JavaScript dependency management

dependency management

window.UI = { refresh: function() { var all = window.Premium.calculate(); return _.sortBy(all, 'price'); }};

ui.js

Page 7: JavaScript dependency management
Page 8: JavaScript dependency management

dependency management

window.UI = function(_, premium) {

function refresh() { var all = premium.calculate(); return _.sortBy(all, 'price'); }

...

Page 9: JavaScript dependency management
Page 10: JavaScript dependency management

define('ui', ['underscore', 'premium'], function(_, premium) {

return { refresh: function() { var all = premium.calculate(); return _.sortBy(all, 'price'); } }

});

Page 11: JavaScript dependency management

run-time vs. build-time

_.js

premium.js

ui.js

dynamic loaderapp.js

Page 12: JavaScript dependency management

_ module

premium module

ui module

run-time vs. build-time bundle.js

dynamic loader

Page 13: JavaScript dependency management

require.js

Config can get complexAsync mode VS build modePay syntax price

PR

OS

CO

NS

Ensures dependent modules are loadedConfigurabilityDocumentation

Page 14: JavaScript dependency management

define('module',

['dep1', 'dep2'], function(dep1, dep2) {

return { foo: function() {}, bar: function() {} }

});

Page 15: JavaScript dependency management

http://jquery.com/download

- 1.9.0- 1.10.2- 2.0.3

version management ?

CDN or local download

Page 16: JavaScript dependency management
Page 17: JavaScript dependency management

exports.calculate = function() {

return [ { name: 'Income', price: 40 }, { name: 'Life', price: 60 } ];

};

premium.js

syntax

Page 18: JavaScript dependency management

var _ = require('underscore');var premium = require('./premium');

exports.refresh = function() { var all = premium.calculate(); return _.sortBy(all, 'price');};

ui.js

syntax

Page 19: JavaScript dependency management

var _ = require('underscore');

/* ???? */

var premium = require('./premium');

/* relative file path */

Page 20: JavaScript dependency management
Page 21: JavaScript dependency management

npm registry

$ npm install underscore --save$ npm install [email protected] --save

var _ = require('underscore');[…]var sorted = _.sortBy(all, 'price');

Page 22: JavaScript dependency management

semantic versioning

1.4.3

major minor patch

incompatible API changes

bug fi xesnewfunction

ality

Page 23: JavaScript dependency management
Page 24: JavaScript dependency management

var _ = require('underscore');var premium = require('./premium');

exports.refresh = function() { var all = premium.calculate(); return _.sortBy(all, 'price');};

ui.js

Page 25: JavaScript dependency management

underscore

premium

ui

other

build-time bundle bundle.js

dynamic loader

Page 26: JavaScript dependency management

var p = require('./premium');

it('prints the prices', function() {

sinon.stub(p, 'calculate').returns(...); ui.refresh();

});

unit testing ui-spec.js

Page 27: JavaScript dependency management

$ npm install coffeeify –-save-dev

$ browserify –t coffeeify app.coffee > bundle.js

transform modules

Page 28: JavaScript dependency management
Page 29: JavaScript dependency management

source maps

Page 30: JavaScript dependency management
Page 31: JavaScript dependency management

sharing modules ?

<script src="premium-calculator-1.3.2.js" />

Page 32: JavaScript dependency management

a private registry

public

private

Page 33: JavaScript dependency management

a private registry

$ npm install [email protected]

var premium = require('premium-calculator');

$ cd premium-calculator

$ npm publish

Page 34: JavaScript dependency management

The ecosystem is changing fast!

A lot of evolving practices

Make your own opinions :)

keep your eyes open