Dependency management & Package management in JavaScript

131
Dependency management & Package management in JavaScript Sebastiano Armeli @sebarmeli WebExpo 2013, Prague (Czech Republic) Friday, September 20, 13

description

Talk given at WebExpo (Prague) - September 2013

Transcript of Dependency management & Package management in JavaScript

Page 1: Dependency management & Package management in JavaScript

Dependency management&

Package management

in JavaScriptSebastiano Armeli

@sebarmeli

WebExpo 2013, Prague (Czech Republic)

Friday, September 20, 13

Page 2: Dependency management & Package management in JavaScript

Friday, September 20, 13

Page 3: Dependency management & Package management in JavaScript

@sebarmeliSebastiano Armeli-Battana

• realestate.com.au • Melbourne, Australia

Friday, September 20, 13

Page 4: Dependency management & Package management in JavaScript

Dependency management&

Package management

in JavaScriptSebastiano Armeli

@sebarmeli

WebExpo 2013, Prague (Czech Republic)

Friday, September 20, 13

Page 5: Dependency management & Package management in JavaScript

Dependency management

Friday, September 20, 13

Page 6: Dependency management & Package management in JavaScript

“A dependency happens when a

component relies on another one”

Friday, September 20, 13

Page 7: Dependency management & Package management in JavaScript

View

<< depends on >>

Model

Friday, September 20, 13

Page 8: Dependency management & Package management in JavaScript

model.js------------

(function(window){ ‘use strict’;

function Model() { }

window.Model = Model;

})(window);

Friday, September 20, 13

Page 9: Dependency management & Package management in JavaScript

view.js------------

(function(window){ ‘use strict’;

function View(model) { this.model = model; }

window.View = View;

})(window);

Friday, September 20, 13

Page 10: Dependency management & Package management in JavaScript

var model = new Model();

var view = new View(model);

Friday, September 20, 13

Page 11: Dependency management & Package management in JavaScript

What to consider when

you createa dependency?

Friday, September 20, 13

Page 12: Dependency management & Package management in JavaScript

Principles of Package Coupling

Acyclic-Dependencies Principle

Stable-Dependencies Principle

Friday, September 20, 13

Page 13: Dependency management & Package management in JavaScript

Stable Dependencies

PrincipleFriday, September 20, 13

Page 14: Dependency management & Package management in JavaScript

Friday, September 20, 13

Page 15: Dependency management & Package management in JavaScript

Unstable

Stable

View

Model

Friday, September 20, 13

Page 16: Dependency management & Package management in JavaScript

Model DOES NOT change frequently

View DOES change frequently

Friday, September 20, 13

Page 17: Dependency management & Package management in JavaScript

Acyclic Dependencies

PrincipleFriday, September 20, 13

Page 18: Dependency management & Package management in JavaScript

Friday, September 20, 13

Page 19: Dependency management & Package management in JavaScript

View

ModelRouter

Friday, September 20, 13

Page 20: Dependency management & Package management in JavaScript

Avoid Cycles!

Friday, September 20, 13

Page 21: Dependency management & Package management in JavaScript

How do we handle

dependencies?

Friday, September 20, 13

Page 22: Dependency management & Package management in JavaScript

Java-----

import java.util.*;import javax.servlet.http.*;

Ruby-----

require ‘net/http’require ‘spec_helper’

Friday, September 20, 13

Page 23: Dependency management & Package management in JavaScript

...and in JS ?

Friday, September 20, 13

Page 24: Dependency management & Package management in JavaScript

import jQuery from ‘jquery’;

Friday, September 20, 13

Page 25: Dependency management & Package management in JavaScript

import jQuery from ‘jquery’;ES6Friday, September 20, 13

Page 26: Dependency management & Package management in JavaScript

<script src=”file1.js”></script><script src=”file2.js”></script><script src=”file3.js”></script><script src=”file4.js”></script><script src=”file5.js”></script><script src=”file6.js”></script><script src=”file7.js”></script><script src=”file8.js”></script>

index.html------------

Friday, September 20, 13

Page 27: Dependency management & Package management in JavaScript

<script src=”file3.js”></script><script src=”file4.js”></script>

<script src=”file1.js”></script><script src=”file2.js”></script>

index.html------------

<script src=”file5.js”></script><script src=”file6.js”></script><script src=”file7.js”></script><script src=”file8.js”></script>

Friday, September 20, 13

Page 28: Dependency management & Package management in JavaScript

<script src=”file3.js”></script><script src=”file4.js”></script>

<script src=”file1.js”></script><script src=”file2.js”></script>

index.html------------

<script src=”file5.js”></script><script src=”file6.js”></script><script src=”file7.js”></script><script src=”file8.js”></script>

Friday, September 20, 13

Page 29: Dependency management & Package management in JavaScript

<script src=”file4.js”></script><script src=”file3.js”></script>

<script src=”file1.js”></script><script src=”file2.js”></script>

index.html------------

<script src=”file5.js”></script><script src=”file6.js”></script><script src=”file7.js”></script><script src=”file8.js”></script>

Friday, September 20, 13

Page 30: Dependency management & Package management in JavaScript

Friday, September 20, 13

Page 31: Dependency management & Package management in JavaScript

Not only one way to order

<script>s

Friday, September 20, 13

Page 32: Dependency management & Package management in JavaScript

app.js view.js

helpers.jsview2.js

helpers2.jsmodel.js

Friday, September 20, 13

Page 33: Dependency management & Package management in JavaScript

app.js view.js

helpers.jsview2.js

helpers2.jsmodel.js

12

3

5

4

6

Friday, September 20, 13

Page 34: Dependency management & Package management in JavaScript

app.js view.js

helpers.jsview2.js

helpers2.jsmodel.js

12

3

5

4

6

4

1

3

2

5

6

Friday, September 20, 13

Page 35: Dependency management & Package management in JavaScript

1

4

5

2

3

0 1

1 2,3

2 5

3 4

IN-DEGREES NODE

Friday, September 20, 13

Page 36: Dependency management & Package management in JavaScript

4

5

2

3

0 2,3

2 5

3 4

IN-DEGREES NODE

1Results:

Friday, September 20, 13

Page 37: Dependency management & Package management in JavaScript

4

5

2

0 2

1 5

2 4

IN-DEGREES NODE

1 - 3Results:

Friday, September 20, 13

Page 38: Dependency management & Package management in JavaScript

4

5

0 5

1 4

IN-DEGREES NODE

1 - 3 - 2Results:

Friday, September 20, 13

Page 39: Dependency management & Package management in JavaScript

40 4

IN-DEGREES NODE

1 - 3 - 2 - 5Results:

Friday, September 20, 13

Page 40: Dependency management & Package management in JavaScript

1

4

5

2

3 1 - 3 - 2 - 5 - 4

4 - 5 - 2 - 3 - 1

Friday, September 20, 13

Page 41: Dependency management & Package management in JavaScript

http://howardlewisship.com/images/t5-service-dependencies.jpgFriday, September 20, 13

Page 42: Dependency management & Package management in JavaScript

RequireJS

Friday, September 20, 13

Page 43: Dependency management & Package management in JavaScript

Friday, September 20, 13

Page 44: Dependency management & Package management in JavaScript

var module = (function(){ // private variables, methodsvar title = “”;function f1() {}

return {// public/privileged methodsgetTitle: function(){return title;

}}

}()) ;

MODULE PATTERN

Friday, September 20, 13

Page 45: Dependency management & Package management in JavaScript

define(function () {

var title = “”;function f1() {}

return {

getTitle: function() {return title;

} }

});

RJS MODULE PATTERN

Friday, September 20, 13

Page 46: Dependency management & Package management in JavaScript

define(id?, dependencies?, factory)

Friday, September 20, 13

Page 47: Dependency management & Package management in JavaScript

index.htmljs /-- main.js-- helpers.js-- app / -- views / -- view1.js -- vendor / -- require.js

view1.js------------define([‘helpers’],function(helpers){return {init: function(){}

}

});

define(function(){// code here

});

helpers.js------------

Friday, September 20, 13

Page 48: Dependency management & Package management in JavaScript

index.htmljs /-- main.js-- helpers.js-- app / -- views / -- view1.js -- vendor / -- require.js

view1.js------------define([‘helpers’],function(helpers){return {init: function(){}

}

});

define(function(){// code here

});

helpers.js------------

Friday, September 20, 13

Page 49: Dependency management & Package management in JavaScript

require(dependencies?, factory)

Friday, September 20, 13

Page 50: Dependency management & Package management in JavaScript

index.html------------<script src=”js/vendor/require.js” data-main=”js/main.js”></script>

main.js------------require([‘view1’],function(view1){view1.init();

});

index.htmljs /-- main.js-- helpers.js-- app / -- views / -- view1.js -- vendor / -- require.js

Friday, September 20, 13

Page 51: Dependency management & Package management in JavaScript

Friday, September 20, 13

Page 52: Dependency management & Package management in JavaScript

main.js------------require.config({baseUrl: ‘./js’,

paths: {‘view1’: ‘app/views/view1’

}});

require([‘view1’],function(view1){view1.init();

});

index.htmljs /-- main.js-- helpers.js-- app / -- views / -- view1.js -- vendor / -- require.js

Friday, September 20, 13

Page 53: Dependency management & Package management in JavaScript

NO blocking!Friday, September 20, 13

Page 54: Dependency management & Package management in JavaScript

require() asynchronous

de!ne() - de!ne.amd

AMDwell suited for browser

Friday, September 20, 13

Page 55: Dependency management & Package management in JavaScript

Friday, September 20, 13

Page 56: Dependency management & Package management in JavaScript

Friday, September 20, 13

Page 57: Dependency management & Package management in JavaScript

if ( typeof define === "function" &&define.amd ) {

define( "jquery", [], function () { return jQuery;

});}

Friday, September 20, 13

Page 58: Dependency management & Package management in JavaScript

Friday, September 20, 13

Page 59: Dependency management & Package management in JavaScript

index.htmljs /-- main.js-- helpers.js-- app / -- views / -- view1.js-- vendor / -- require.js -- backbone.js -- underscore.js -- jquery.js

main.js------------require.config({baseUrl: ‘js/vendor’,

shim: {‘underscore’:{exports: ‘_’

},‘backbone’: {deps: [‘jquery’, ‘underscore’],exports: ‘Backbone’

}}

});

require([‘backbone’],function(Backbone){Backbone.history.start();

});

Friday, September 20, 13

Page 60: Dependency management & Package management in JavaScript

index.htmljs /-- main.js-- helpers.js-- app / -- views / -- view1.js-- vendor / -- require.js -- backbone.js -- underscore.js -- jquery.js

main.js------------require.config({baseUrl: ‘js/vendor’,

shim: {‘underscore’:{exports: ‘_’

},‘backbone’: {deps: [‘jquery’, ‘underscore’],exports: ‘Backbone’

}}

});

require([‘backbone’],function(Backbone){Backbone.history.start();

});

Friday, September 20, 13

Page 61: Dependency management & Package management in JavaScript

LOADER PLUGINS

• i18n!, async!, domReady!

• text!, css!, json!, cs!, hbs!

[plugin Module ID]![resource ID]

Friday, September 20, 13

Page 62: Dependency management & Package management in JavaScript

main.js------------require.config({baseUrl: ‘./js’

});

require([‘text!partials/file.txt’],function(txt) {// txt goes here

});

index.htmljs /-- main.js -- vendor / -- require.js -- text.js-- partials / -- !le.txt

Friday, September 20, 13

Page 63: Dependency management & Package management in JavaScript

Friday, September 20, 13

Page 64: Dependency management & Package management in JavaScript

3 requests!Friday, September 20, 13

Page 65: Dependency management & Package management in JavaScript

r.js

npm install -g requirejs

OPTIMIZER

Friday, September 20, 13

Page 66: Dependency management & Package management in JavaScript

r.js -o tools/build.js

Friday, September 20, 13

Page 67: Dependency management & Package management in JavaScript

build.js------------({ appDir:'../', mainConfigFile: '../js/main.js', dir: "../build", modules: [ { name: "../main" } ]})

index.htmljs /-- main.js-- helpers.js-- app / -- views / -- view1.js -- vendor / -- require.jstools /-- build.js

Friday, September 20, 13

Page 68: Dependency management & Package management in JavaScript

build/js/main.js----------------

index.htmlbuild /-- index.html-- build.txt-- js / -- main.js -- helpers.js -- app / -- views / -- view1.js -- vendor / -- require.js-- tools / -- build.js

js/vendor/../main.js----------------js/helpers.jsjs/vendor/view1.jsjs/vendor/../main.js

build/build.txt----------------

Friday, September 20, 13

Page 69: Dependency management & Package management in JavaScript

OPTIMIZER

1 request!Friday, September 20, 13

Page 70: Dependency management & Package management in JavaScript

Friday, September 20, 13

Page 71: Dependency management & Package management in JavaScript

exports.render = function() {};

var module = require(‘view1’);

NO de!ne()

require() synchronous

Server-side approach

Friday, September 20, 13

Page 72: Dependency management & Package management in JavaScript

npm install -g browserify

Friday, September 20, 13

Page 73: Dependency management & Package management in JavaScript

foo.js------------

index.htmljs /-- main.js-- foo.jsnode_modules /package.json

var Foo = function() { // do something};

module.exports = Foo;

main.js------------var Foo = require(‘./foo’);

var foo = new Foo();

Friday, September 20, 13

Page 74: Dependency management & Package management in JavaScript

browserify js/main.js > js/bundle.js

Friday, September 20, 13

Page 75: Dependency management & Package management in JavaScript

index.html------------

index.htmljs /-- main.js-- foo.js-- bundle.jsnode_modules /package.json

bundle.js------------;(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){var Foo = function(){ console.log("AA");};module.exports = Foo;

},{}],2:[function(require,module,exports){var Foo = require('./foo');

var foo = new Foo();},{"./foo":1}]},{},[2])

<script src=”js/bundle.js”></script>

Friday, September 20, 13

Page 76: Dependency management & Package management in JavaScript

Package management

Friday, September 20, 13

Page 77: Dependency management & Package management in JavaScript

Friday, September 20, 13

Page 78: Dependency management & Package management in JavaScript

“A package is a specific piece of

software installable”

Friday, September 20, 13

Page 79: Dependency management & Package management in JavaScript

PackagesOne or more modules

Friday, September 20, 13

Page 80: Dependency management & Package management in JavaScript

Name, Description, Version

Metadata

PackagesOne or more modules

Friday, September 20, 13

Page 81: Dependency management & Package management in JavaScript

Name, Description, Version

Metadata

PackagesOne or more modules

Checksum

Friday, September 20, 13

Page 82: Dependency management & Package management in JavaScript

Name, Description, Version

Metadata

PackagesOne or more modules

Checksum

Dependencies

Friday, September 20, 13

Page 83: Dependency management & Package management in JavaScript

Package Manageris the TOOL to...

Friday, September 20, 13

Page 84: Dependency management & Package management in JavaScript

Speed up your development work"ow

Friday, September 20, 13

Page 85: Dependency management & Package management in JavaScript

Speed up your development work"ow

Automate common tasks

Friday, September 20, 13

Page 86: Dependency management & Package management in JavaScript

Speed up your development work"ow

Automate common tasks

DRY with Repository / Registry

Friday, September 20, 13

Page 87: Dependency management & Package management in JavaScript

Common Operations

Friday, September 20, 13

Page 88: Dependency management & Package management in JavaScript

Installing

Friday, September 20, 13

Page 89: Dependency management & Package management in JavaScript

Installing

Removing

Friday, September 20, 13

Page 90: Dependency management & Package management in JavaScript

Installing

Removing

Searching

Friday, September 20, 13

Page 91: Dependency management & Package management in JavaScript

Installing

Removing

Searching

Upgrading

Friday, September 20, 13

Page 92: Dependency management & Package management in JavaScript

Installing

Removing

Searching

Upgrading

Publishing

Friday, September 20, 13

Page 93: Dependency management & Package management in JavaScript

Package Depedencies

A

B

C

C

Friday, September 20, 13

Page 94: Dependency management & Package management in JavaScript

Package Depedencies

A

B

C

C

=1.1.0

>1.2.0

Friday, September 20, 13

Page 95: Dependency management & Package management in JavaScript

Package Depedencies

A

B

C

C

=1.1.0

>1.2.0

Which version should I

download?

Friday, September 20, 13

Page 96: Dependency management & Package management in JavaScript

Java Ruby Python .Net OSX Linux

Maven/Gradle Rubygems pip NuGet Homebrew yum/apt

Friday, September 20, 13

Page 97: Dependency management & Package management in JavaScript

How do you install packages

in JS ?Friday, September 20, 13

Page 98: Dependency management & Package management in JavaScript

Friday, September 20, 13

Page 99: Dependency management & Package management in JavaScript

Node.js

Friday, September 20, 13

Page 100: Dependency management & Package management in JavaScript

package.json

Node.js

Friday, September 20, 13

Page 101: Dependency management & Package management in JavaScript

package.json

NPM registry

Node.js

Friday, September 20, 13

Page 102: Dependency management & Package management in JavaScript

package.json------------{ "name": "my-app", "version": "0.0.1", "dependencies": { "jquery": "~2.0" }, "devDependencies": { "qunit": "0.5.x" }}

index.htmlpackage.jsonjs /-- app.js

Friday, September 20, 13

Page 103: Dependency management & Package management in JavaScript

npm install

Friday, September 20, 13

Page 104: Dependency management & Package management in JavaScript

npm install <package>

Commands

Friday, September 20, 13

Page 105: Dependency management & Package management in JavaScript

npm install <package>

Commands

npm install -g <package>

Friday, September 20, 13

Page 106: Dependency management & Package management in JavaScript

npm install <package>

Commands

npm install -g <package>

npm update <package>

Friday, September 20, 13

Page 107: Dependency management & Package management in JavaScript

npm list

Commands

Friday, September 20, 13

Page 108: Dependency management & Package management in JavaScript

npm list

Commands

npm uninstall <package>

Friday, September 20, 13

Page 109: Dependency management & Package management in JavaScript

npm list

Commands

npm uninstall <package>

npm publish <tarball>

Friday, September 20, 13

Page 110: Dependency management & Package management in JavaScript

is a not Package Manager

for the CLIENT

Friday, September 20, 13

Page 111: Dependency management & Package management in JavaScript

Bower

Friday, September 20, 13

Page 112: Dependency management & Package management in JavaScript

BowerMinimalistic & Agnostic

Friday, September 20, 13

Page 113: Dependency management & Package management in JavaScript

BowerMinimalistic & Agnostic

HTML/CSS/JS

Friday, September 20, 13

Page 114: Dependency management & Package management in JavaScript

BowerMinimalistic & Agnostic

HTML/CSS/JS

AMD/CommonJS/ES6 modules

Friday, September 20, 13

Page 115: Dependency management & Package management in JavaScript

npm install -g bower

Friday, September 20, 13

Page 116: Dependency management & Package management in JavaScript

bower.json------------{ "name": "my-app", "version": "0.0.1", "ignore": [ "build", "Gruntfile.js", "package.json", "bower.json" ],

"main": ["js/app.js"], "dependencies": { "requirejs": "~2.1.8", // >=2.1.8 < 2.2.0 "jquery": "~2.0" // >=2.0.0 < 2.1.0 }, "devDependencies": { "qunit": "^1.12.0" // >=1.12.0 < 2.0.0 }}

index.htmlbower.jsonjs /-- app.js

Friday, September 20, 13

Page 117: Dependency management & Package management in JavaScript

bower install

Friday, September 20, 13

Page 118: Dependency management & Package management in JavaScript

.bowerrc------------{ "directory”: “js/vendor”, “json”: “bower.json”}

index.htmlbower.json.bowerrcjs /-- app.js-- vendor/ -- jquery/ -- jquery.js -- requirejs/ -- require.js

index.html------------<script src=”js/vendor/jquery/jquery.js ></script>

Friday, September 20, 13

Page 119: Dependency management & Package management in JavaScript

bower install jquery#1.8.2

Git tagAlias from registry

Friday, September 20, 13

Page 120: Dependency management & Package management in JavaScript

bower install jquery --save

Friday, September 20, 13

Page 121: Dependency management & Package management in JavaScript

bower install git://github.com/jquery/jquery.git#1.8.3

bower install ../my-package

Git endpoint + Git tag

Local package

bower install https://github.com/jquery/jquery.git

Git endpoint

Friday, September 20, 13

Page 122: Dependency management & Package management in JavaScript

bower list

my-package├── jquery#2.0.3└── requirejs#2.1.8

Friday, September 20, 13

Page 123: Dependency management & Package management in JavaScript

bower list

my-package├── jquery#1.8.2 incompatible with ~2.0.0 (2.0.3 available)└── requirejs#2.1.8

my-package├── jquery#2.0.3└── requirejs#2.1.8

Friday, September 20, 13

Page 124: Dependency management & Package management in JavaScript

bower update jquery

bower uninstall jquery

bower info jquery

Friday, September 20, 13

Page 125: Dependency management & Package management in JavaScript

bower register <package> <git_endpoint>

Friday, September 20, 13

Page 126: Dependency management & Package management in JavaScript

Friday, September 20, 13

Page 127: Dependency management & Package management in JavaScript

file1.js-----------require([‘module2’], function(){

// <use> <module2>;

});

Dependency management

Friday, September 20, 13

Page 128: Dependency management & Package management in JavaScript

file1.js-----------var module2 = require(‘module2’);

// use module2

Dependency management

Friday, September 20, 13

Page 129: Dependency management & Package management in JavaScript

source_file-----------

<import> <module2>;

// <use> <module2>;

$ bower install jquery

Package managementFriday, September 20, 13

Page 130: Dependency management & Package management in JavaScript

source_file-----------

<import> <module2>;

// <use> <module2>;

$ npm install jquery

Package managementFriday, September 20, 13

Page 131: Dependency management & Package management in JavaScript

http://requirejs.com

http://bower.io/

@sebarmeli

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

https://npmjs.org/WebExpo 2013, Prague (Czech Republic)

Friday, September 20, 13