36
Dependency Management with RequireJS http://requirejs.org/

ParisJS #10 : RequireJS

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: ParisJS #10 : RequireJS

Dependency Managementwith RequireJS

http://requirejs.org/

Page 3: ParisJS #10 : RequireJS

What are we talkin’ about?

• RequireJS.org : Script Module Loader

• Browsers && Node && Rhino

• Dependencies

• Global Pollution

• Optimization

Page 4: ParisJS #10 : RequireJS

ContextLibs of choice

jQuery

Backbone

Page 5: ParisJS #10 : RequireJS

ContextPluginsLibs of choice

jQuery

Backbone

Page 6: ParisJS #10 : RequireJS

Context PluginsLibs of choice

jQuery

Backbone

Your Code

Page 7: ParisJS #10 : RequireJS

Bad Context PluginsLibs of choice

jQuery

Backbone

Your Code

Page 8: ParisJS #10 : RequireJS

Good ContextPluginsLibs of choice

jQuery

Backbone

Your Code

Page 9: ParisJS #10 : RequireJS

DependenciesPluginsLibs of choice

jQuery

Backbone

Your Code

Page 10: ParisJS #10 : RequireJS

Solution ?<script src="jquery.min.js"></script> <script src="backbone.min.js"></script>...<script src="jquery.plugin.js"></script><script src="jquery.plugin.js"></script>...<script src="my-code.js"></script><script src="my-code.js"></script><script src="my-code.js"></script><script src="my-code.js"></script><script src="my-code.js"></script>...

Page 11: ParisJS #10 : RequireJS

Async Solution ?<script src="LAB.js"></script> <script type="text/javascript">$LAB .script('jquery.min.js') .script('backbone.min.js') ... .script('jquery.plugin.js') .script('jquery.plugin.js') .script('jquery.plugin.js') ... .script('my-code.js') .script('my-code.js') .script('my-code.js');</script>

Page 12: ParisJS #10 : RequireJS

Namespace ?

var MyNamespace = {};

MyNamespace.Config = {…};

MyNamespace.Product = function() {…};

MyNamespace.Video = function() {…};

MyNamespace.Audio = function() {…};

MyNamespace.Mail = function() {…};

Page 13: ParisJS #10 : RequireJS

AMD

Not your CPU...

Asynchronous Module Definition

https://github.com/amdjs/amdjs-api/wiki/AMD

Page 14: ParisJS #10 : RequireJS

define()

API define(id?, dependencies?, factory);

Usage

define('My-Module', ['Another-Module'], function(AnotherModule) { // Do Something

});

Page 15: ParisJS #10 : RequireJS

Example

// App/Conf.js define(function() { return { path: '...', debug: true, ... };});

Page 16: ParisJS #10 : RequireJS

Example

// App/Conf.jsdefine(function() { return { path: '...', debug: true, ... };});

Page 17: ParisJS #10 : RequireJS

Example// App/Controller/Product.jsdefine(['App/Conf', 'App/Models/Product', 'App/Views/Product'], function(Conf, Model, View) { // Locale & Private Vars !!! var myPrivateVar = {...}; // API return { show: function(productId) { console.log(Conf.path); var productView = new View(); productView.setModel(Model.getById(productId)); return productView.render(); },

... };});

Page 18: ParisJS #10 : RequireJS

Example// App/Controller/Product.jsdefine(['App/Conf', 'App/Models/Product', 'App/Views/Product'], function(Conf, Model, View) { // Locale & Private Vars !!! var myPrivateVar = {...}; // API return { show: function(productId) { console.log(Conf.path); var productView = new View(); productView.setModel(Model.getById(productId)); return productView.render(); },

... };});

Page 19: ParisJS #10 : RequireJS

Example// App/Controller/Product.jsdefine(['App/Conf', 'App/Models/Product', 'App/Views/Product'], function(Conf, Model, View) { // Locale & Private Vars !!! var myPrivateVar = {...}; // API return { show: function(productId) { console.log(Conf.path); var productView = new View(); productView.setModel(Model.getById(productId)); return productView.render(); },

... };});

Page 20: ParisJS #10 : RequireJS

Example// App/Controller/Product.jsdefine(['App/Conf', 'App/Models/Product', 'App/Views/Product'], function(Conf, Model, View) { // Locale & Private Vars !!! var myPrivateVar = {...}; // API return { show: function(productId) { console.log(Conf.path); var productView = new View(); productView.setModel(Model.getById(productId)); return productView.render(); },

... };});

Page 21: ParisJS #10 : RequireJS

Example// App/Controller/Product.jsdefine(['App/Conf', 'App/Models/Product', 'App/Views/Product'], function(Conf, Model, View) { // Locale & Private Vars !!! var myPrivateVar = {...}; // API return { show: function(productId) { console.log(Conf.path); var productView = new View(); productView.setModel(Model.getById(productId)); return productView.render(); },

... };});

Page 22: ParisJS #10 : RequireJS

Scope vs. Global Pollution// App/Controller/Product.jsdefine(['App/Conf', 'App/Models/Product', 'App/Views/Product'], function(Conf, Model, View) { // Locale & Private Vars !!! var myPrivateVar = {...}; // API return { show: function(productId) { console.log(Conf.path); var productView = new View(); productView.setModel(Model.getById(productId)); return productView.render(); },... };});

Page 23: ParisJS #10 : RequireJS

Plugins Example// App/View/Product.jsdefine([ 'order!FirstModule', 'order!SecondModule', 'i18n!fr/some-i18n-bundle', 'text!some-text-file.txt', 'cs!some-coffee', 'tpl!App/View/Product.tpl'], function(First, Second, bundle, text, coffee, productTpl) { // API return Backbone.View.extend({ render: function() { return productTpl({ model: this.model.toJSON() }); } });});

Page 24: ParisJS #10 : RequireJS

Order Plugin// App/View/Product.jsdefine([

'order!FirstModule', // Keep execution order 'order!SecondModule', // requirejs.org/docs/api.html#order 'i18n!fr/some-i18n-bundle', 'text!some-text-file.txt', 'cs!some-coffee', 'tpl!App/View/Product.tpl'], function(First, Second, bundle, text, coffee, productTpl) { // API return Backbone.View.extend({ render: function() { return productTpl({ model: this.model.toJSON() }); } });});

Page 25: ParisJS #10 : RequireJS

i18n Plugin// App/View/Product.jsdefine([

'order!FirstModule', 'order!SecondModule', 'i18n!fr/some-i18n-bundle', // Load i18n bundle 'text!some-text-file.txt', // requirejs.org/docs/api.html#i18n 'cs!some-coffee', 'tpl!App/View/Product.tpl'], function(First, Second, bundle, text, coffee, productTpl) { // API return Backbone.View.extend({ render: function() { return productTpl({ model: this.model.toJSON() }); } });});

Page 26: ParisJS #10 : RequireJS

Text Plugin// App/View/Product.jsdefine([

'order!FirstModule', 'order!SecondModule', 'i18n!fr/some-i18n-bundle', 'text!some-text-file.txt', // Guess what ? 'cs!some-coffee', // requirejs.org/docs/api.html#text 'tpl!App/View/Product.tpl'], function(First, Second, bundle, text, coffee, productTpl) { // API return Backbone.View.extend({ render: function() { return productTpl({ model: this.model.toJSON() }); } });});

Page 27: ParisJS #10 : RequireJS

CoffeeScript Plugin// App/View/Product.jsdefine([

'order!FirstModule', 'order!SecondModule', 'i18n!fr/some-i18n-bundle', 'text!some-text-file.txt', 'cs!some-coffee', // returns compiled CoffeeScript ! 'tpl!App/View/Product.tpl' // github.com/jrburke/require-cs], function(First, Second, bundle, text, coffee, productTpl) { // API return Backbone.View.extend({ render: function() { return productTpl({ model: this.model.toJSON() }); } });});

Page 28: ParisJS #10 : RequireJS

Template Plugin// App/View/Product.jsdefine([

'order!FirstModule', 'order!SecondModule', 'i18n!fr/some-i18n-bundle', 'text!some-text-file.txt', // My Favorite Plugin ! (mine...) 'cs!some-coffee', // Returns a compiled template ! 'tpl!App/View/Product.tpl' // github.com/ZeeAgency/requirejs-tpl], function(First, Second, bundle, text, coffee, productTpl) { // API return Backbone.View.extend({ render: function() { return productTpl({ model: this.model.toJSON() }); } });});

Page 29: ParisJS #10 : RequireJS

Optimization

node r.js -o name=bootstrap out=built.js baseUrl=js

http://requirejs.org/docs/optimization.html

Page 30: ParisJS #10 : RequireJS

Remember ?PluginsLibs of choice

jQuery

Backbone

Your Code

Page 31: ParisJS #10 : RequireJS

Optimized !Ready for ProductionLibs of choice

jQuery

Page 32: ParisJS #10 : RequireJS

Optimized !Ready for ProductionLibs of choice

jQuery

CoffeeScript ?

Page 33: ParisJS #10 : RequireJS

Optimized !Ready for ProductionLibs of choice

jQuery

CoffeeScript ?Templates ?

Page 34: ParisJS #10 : RequireJS

Optimized !Ready for ProductionLibs of choice

jQuery

CoffeeScript ?Templates ?

Compiled & Minifiedso browser doesn’t need to...

Page 35: ParisJS #10 : RequireJS

Optimized !Ready for ProductionLibs of choice

jQuery

CoffeeScript ?Templates ?

Compiled & Minified

Page 36: ParisJS #10 : RequireJS

Thx !