SlideShare une entreprise Scribd logo
Dependency management
&
Package management
in JavaScript
Sebastiano Armeli
@sebarmeli
WebExpo 2013, Prague (Czech Republic)
Friday, September 20, 13
Friday, September 20, 13
@sebarmeli
Sebastiano Armeli-Battana
• realestate.com.au
• Melbourne, Australia
Friday, September 20, 13
Dependency management
&
Package management
in JavaScript
Sebastiano Armeli
@sebarmeli
WebExpo 2013, Prague (Czech Republic)
Friday, September 20, 13
Dependency
management
Friday, September 20, 13
“A dependency
happens when a
component relies on
another one”
Friday, September 20, 13
View
<< depends on >>
Model
Friday, September 20, 13
model.js
------------
(function(window){
‘use strict’;
function Model() { }
window.Model = Model;
})(window);
Friday, September 20, 13
view.js
------------
(function(window){
‘use strict’;
function View(model) {
this.model = model;
}
window.View = View;
})(window);
Friday, September 20, 13
var model = new Model();
var view = new View(model);
Friday, September 20, 13
What to
consider when
you create
a dependency?
Friday, September 20, 13
Principles of
Package Coupling
Acyclic-Dependencies
Principle
Stable-Dependencies
Principle
Friday, September 20, 13
Stable
Dependencies
Principle
Friday, September 20, 13
Friday, September 20, 13
Unstable
Stable
View
Model
Friday, September 20, 13
Model DOES NOT change
frequently
View DOES change
frequently
Friday, September 20, 13
Acyclic
Dependencies
Principle
Friday, September 20, 13
Friday, September 20, 13
View
ModelRouter
Friday, September 20, 13
Avoid Cycles!
Friday, September 20, 13
How do we
handle
dependencies?
Friday, September 20, 13
Java
-----
import java.util.*;
import javax.servlet.http.*;
Ruby
-----
require ‘net/http’
require ‘spec_helper’
Friday, September 20, 13
...and in JS ?
Friday, September 20, 13
import jQuery from ‘jquery’;
Friday, September 20, 13
import jQuery from ‘jquery’;
ES6
Friday, September 20, 13
<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
<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
<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
<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
Friday, September 20, 13
Not only one
way to order
<script>s
Friday, September 20, 13
app.js view.js
helpers.jsview2.js
helpers2.js
model.js
Friday, September 20, 13
app.js view.js
helpers.jsview2.js
helpers2.js
model.js
1
2
3
5
4
6
Friday, September 20, 13
app.js view.js
helpers.jsview2.js
helpers2.js
model.js
1
2
3
5
4
6
4
1
3
2
5
6
Friday, September 20, 13
1
4
5
2
3
0 1
1 2,3
2 5
3 4
IN-DEGREES NODE
Friday, September 20, 13
4
5
2
3
0 2,3
2 5
3 4
IN-DEGREES NODE
1
Results:
Friday, September 20, 13
4
5
2
0 2
1 5
2 4
IN-DEGREES NODE
1 - 3
Results:
Friday, September 20, 13
4
5
0 5
1 4
IN-DEGREES NODE
1 - 3 - 2
Results:
Friday, September 20, 13
4
0 4
IN-DEGREES NODE
1 - 3 - 2 - 5
Results:
Friday, September 20, 13
1
4
5
2
3
1 - 3 - 2 - 5 - 4
4 - 5 - 2 - 3 - 1
Friday, September 20, 13
http://howardlewisship.com/images/t5-service-dependencies.jpg
Friday, September 20, 13
RequireJS
Friday, September 20, 13
Friday, September 20, 13
var module = (function(){
// private variables, methods
var title = “”;
function f1() {}
return {
// public/privileged methods
getTitle: function(){
return title;
}
}
}()) ;
MODULE PATTERN
Friday, September 20, 13
define(function () {
var title = “”;
function f1() {}
return {
getTitle: function() {
return title;
}
}
});
RJS MODULE PATTERN
Friday, September 20, 13
define(id?, dependencies?, factory)
Friday, September 20, 13
index.html
js /
-- 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
index.html
js /
-- 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
require(dependencies?, factory)
Friday, September 20, 13
index.html
------------
<script src=”js/vendor/require.js”
data-main=”js/main.js”></script>
main.js
------------
require([‘view1’],function(view1){
view1.init();
});
index.html
js /
-- main.js
-- helpers.js
-- app /
-- views /
-- view1.js
-- vendor /
-- require.js
Friday, September 20, 13
Friday, September 20, 13
main.js
------------
require.config({
baseUrl: ‘./js’,
paths: {
‘view1’: ‘app/views/view1’
}
});
require([‘view1’],function(view1){
view1.init();
});
index.html
js /
-- main.js
-- helpers.js
-- app /
-- views /
-- view1.js
-- vendor /
-- require.js
Friday, September 20, 13
NO blocking!
Friday, September 20, 13
require() asynchronous
de!ne() - de!ne.amd
AMD
well suited for browser
Friday, September 20, 13
Friday, September 20, 13
Friday, September 20, 13
if ( typeof define === "function" &&
define.amd ) {
define( "jquery", [], function () {
return jQuery;
});
}
Friday, September 20, 13
Friday, September 20, 13
index.html
js /
-- 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
index.html
js /
-- 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
LOADER PLUGINS
• i18n!, async!, domReady!
• text!, css!, json!, cs!, hbs!
[plugin Module ID]![resource ID]
Friday, September 20, 13
main.js
------------
require.config({
baseUrl: ‘./js’
});
require([‘text!partials/file.txt’],
function(txt) {
// txt goes here
});
index.html
js /
-- main.js
-- vendor /
-- require.js
-- text.js
-- partials /
-- !le.txt
Friday, September 20, 13
Friday, September 20, 13
3 requests!
Friday, September 20, 13
r.js
npm install -g requirejs
OPTIMIZER
Friday, September 20, 13
r.js -o tools/build.js
Friday, September 20, 13
build.js
------------
({
appDir:'../',
mainConfigFile: '../js/main.js',
dir: "../build",
modules: [
{
name: "../main"
}
]
})
index.html
js /
-- main.js
-- helpers.js
-- app /
-- views /
-- view1.js
-- vendor /
-- require.js
tools /
-- build.js
Friday, September 20, 13
build/js/main.js
----------------
index.html
build /
-- 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.js
js/vendor/view1.js
js/vendor/../main.js
build/build.txt
----------------
Friday, September 20, 13
OPTIMIZER
1 request!
Friday, September 20, 13
Friday, September 20, 13
exports.render = function() {};
var module = require(‘view1’);
NO de!ne()
require() synchronous
Server-side approach
Friday, September 20, 13
npm install -g browserify
Friday, September 20, 13
foo.js
------------
index.html
js /
-- main.js
-- foo.js
node_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
browserify js/main.js > js/bundle.js
Friday, September 20, 13
index.html
------------
index.html
js /
-- main.js
-- foo.js
-- bundle.js
node_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
Package
management
Friday, September 20, 13
Friday, September 20, 13
“A package is a
specific piece of
software installable”
Friday, September 20, 13
Packages
One or more modules
Friday, September 20, 13
Name, Description, Version
Metadata
Packages
One or more modules
Friday, September 20, 13
Name, Description, Version
Metadata
Packages
One or more modules
Checksum
Friday, September 20, 13
Name, Description, Version
Metadata
Packages
One or more modules
Checksum
Dependencies
Friday, September 20, 13
Package Manager
is the TOOL to...
Friday, September 20, 13
Speed up your development work"ow
Friday, September 20, 13
Speed up your development work"ow
Automate common tasks
Friday, September 20, 13
Speed up your development work"ow
Automate common tasks
DRY with Repository / Registry
Friday, September 20, 13
Common Operations
Friday, September 20, 13
Installing
Friday, September 20, 13
Installing
Removing
Friday, September 20, 13
Installing
Removing
Searching
Friday, September 20, 13
Installing
Removing
Searching
Upgrading
Friday, September 20, 13
Installing
Removing
Searching
Upgrading
Publishing
Friday, September 20, 13
Package Depedencies
A
B
C
C
Friday, September 20, 13
Package Depedencies
A
B
C
C
=1.1.0
>1.2.0
Friday, September 20, 13
Package Depedencies
A
B
C
C
=1.1.0
>1.2.0
Which version
should I
download?
Friday, September 20, 13
Java Ruby Python .Net OSX Linux
Maven/Gradle Rubygems pip NuGet Homebrew yum/apt
Friday, September 20, 13
How do you
install packages
in JS ?
Friday, September 20, 13
Friday, September 20, 13
Node.js
Friday, September 20, 13
package.json
Node.js
Friday, September 20, 13
package.json
NPM registry
Node.js
Friday, September 20, 13
package.json
------------
{
"name": "my-app",
"version": "0.0.1",
"dependencies": {
"jquery": "~2.0"
},
"devDependencies": {
"qunit": "0.5.x"
}
}
index.html
package.json
js /
-- app.js
Friday, September 20, 13
npm install
Friday, September 20, 13
npm install <package>
Commands
Friday, September 20, 13
npm install <package>
Commands
npm install -g <package>
Friday, September 20, 13
npm install <package>
Commands
npm install -g <package>
npm update <package>
Friday, September 20, 13
npm list
Commands
Friday, September 20, 13
npm list
Commands
npm uninstall <package>
Friday, September 20, 13
npm list
Commands
npm uninstall <package>
npm publish <tarball>
Friday, September 20, 13
is a not Package Manager
for the CLIENT
Friday, September 20, 13
Bower
Friday, September 20, 13
Bower
Minimalistic & Agnostic
Friday, September 20, 13
Bower
Minimalistic & Agnostic
HTML/CSS/JS
Friday, September 20, 13
Bower
Minimalistic & Agnostic
HTML/CSS/JS
AMD/CommonJS/ES6 modules
Friday, September 20, 13
npm install -g bower
Friday, September 20, 13
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.html
bower.json
js /
-- app.js
Friday, September 20, 13
bower install
Friday, September 20, 13
.bowerrc
------------
{
"directory”: “js/vendor”,
“json”: “bower.json”
}
index.html
bower.json
.bowerrc
js /
-- app.js
-- vendor/
-- jquery/
-- jquery.js
-- requirejs/
-- require.js
index.html
------------
<script src=”js/vendor/jquery/jquery.js >
</script>
Friday, September 20, 13
bower install jquery#1.8.2
Git tagAlias from registry
Friday, September 20, 13
bower install jquery --save
Friday, September 20, 13
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
bower list
my-package
├── jquery#2.0.3
└── requirejs#2.1.8
Friday, September 20, 13
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
bower update jquery
bower uninstall jquery
bower info jquery
Friday, September 20, 13
bower register <package> <git_endpoint>
Friday, September 20, 13
Friday, September 20, 13
file1.js
-----------
require([‘module2’], function(){
// <use> <module2>;
});
Dependency management
Friday, September 20, 13
file1.js
-----------
var module2 = require(‘module2’);
// use module2
Dependency management
Friday, September 20, 13
source_file
-----------
<import> <module2>;
// <use> <module2>;
$ bower install jquery
Package management
Friday, September 20, 13
source_file
-----------
<import> <module2>;
// <use> <module2>;
$ npm install jquery
Package management
Friday, September 20, 13
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

Contenu connexe

Tendances

Creating the interfaces of the future with the APIs of today
Creating the interfaces of the future with the APIs of todayCreating the interfaces of the future with the APIs of today
Creating the interfaces of the future with the APIs of today
gerbille
 
YUI introduction to build hack interfaces
YUI introduction to build hack interfacesYUI introduction to build hack interfaces
YUI introduction to build hack interfaces
Christian Heilmann
 
20130528 solution linux_frousseau_nopain_webdev
20130528 solution linux_frousseau_nopain_webdev20130528 solution linux_frousseau_nopain_webdev
20130528 solution linux_frousseau_nopain_webdev
Frank Rousseau
 

Tendances (16)

Zero-config JavaScript apps with RaveJS -- SVCC fall 2014
Zero-config JavaScript apps with RaveJS -- SVCC fall 2014Zero-config JavaScript apps with RaveJS -- SVCC fall 2014
Zero-config JavaScript apps with RaveJS -- SVCC fall 2014
 
jQuery: Events, Animation, Ajax
jQuery: Events, Animation, AjaxjQuery: Events, Animation, Ajax
jQuery: Events, Animation, Ajax
 
Creating the interfaces of the future with the APIs of today
Creating the interfaces of the future with the APIs of todayCreating the interfaces of the future with the APIs of today
Creating the interfaces of the future with the APIs of today
 
How to Build SPA with Vue Router 2.0
How to Build SPA with Vue Router 2.0How to Build SPA with Vue Router 2.0
How to Build SPA with Vue Router 2.0
 
Professional web development with libraries
Professional web development with librariesProfessional web development with libraries
Professional web development with libraries
 
Android swedroid
Android swedroidAndroid swedroid
Android swedroid
 
YUI introduction to build hack interfaces
YUI introduction to build hack interfacesYUI introduction to build hack interfaces
YUI introduction to build hack interfaces
 
Angular JS blog tutorial
Angular JS blog tutorialAngular JS blog tutorial
Angular JS blog tutorial
 
Django + Vue, JavaScript de 3ª generación para modernizar Django
Django + Vue, JavaScript de 3ª generación para modernizar DjangoDjango + Vue, JavaScript de 3ª generación para modernizar Django
Django + Vue, JavaScript de 3ª generación para modernizar Django
 
Sane Async Patterns
Sane Async PatternsSane Async Patterns
Sane Async Patterns
 
An Event Apart Boston: Principles of Unobtrusive JavaScript
An Event Apart Boston: Principles of Unobtrusive JavaScriptAn Event Apart Boston: Principles of Unobtrusive JavaScript
An Event Apart Boston: Principles of Unobtrusive JavaScript
 
DrupalCon jQuery
DrupalCon jQueryDrupalCon jQuery
DrupalCon jQuery
 
YUI 3
YUI 3YUI 3
YUI 3
 
Ionic tabs template explained
Ionic tabs template explainedIonic tabs template explained
Ionic tabs template explained
 
2009 Hackday Taiwan Yui
2009 Hackday Taiwan Yui2009 Hackday Taiwan Yui
2009 Hackday Taiwan Yui
 
20130528 solution linux_frousseau_nopain_webdev
20130528 solution linux_frousseau_nopain_webdev20130528 solution linux_frousseau_nopain_webdev
20130528 solution linux_frousseau_nopain_webdev
 

En vedette

Timothy Musila
Timothy MusilaTimothy Musila
Timothy Musila
NjueMoses
 
eReading talk SJSU 2012 01
eReading talk SJSU 2012 01eReading talk SJSU 2012 01
eReading talk SJSU 2012 01
TAPintoIT
 
26 Smirks: eReading and Libraries
26 Smirks:  eReading and Libraries26 Smirks:  eReading and Libraries
26 Smirks: eReading and Libraries
TAPintoIT
 
Primeros pasos con twitter bootstrap
Primeros pasos con twitter bootstrapPrimeros pasos con twitter bootstrap
Primeros pasos con twitter bootstrap
Jorge Cuadrado
 

En vedette (20)

Dilemma 6
Dilemma 6Dilemma 6
Dilemma 6
 
Space as Service
Space as Service Space as Service
Space as Service
 
Nihonggo
NihonggoNihonggo
Nihonggo
 
Timothy Musila
Timothy MusilaTimothy Musila
Timothy Musila
 
Going mobile talk 2013 04 25
Going mobile talk 2013 04 25Going mobile talk 2013 04 25
Going mobile talk 2013 04 25
 
Enforcing coding standards
Enforcing coding standardsEnforcing coding standards
Enforcing coding standards
 
La tertulia 1995 2015 b
La tertulia 1995 2015 bLa tertulia 1995 2015 b
La tertulia 1995 2015 b
 
eReading talk SJSU 2012 01
eReading talk SJSU 2012 01eReading talk SJSU 2012 01
eReading talk SJSU 2012 01
 
Fruit
FruitFruit
Fruit
 
Drinks
DrinksDrinks
Drinks
 
26 Smirks: eReading and Libraries
26 Smirks:  eReading and Libraries26 Smirks:  eReading and Libraries
26 Smirks: eReading and Libraries
 
Idioms
IdiomsIdioms
Idioms
 
Puppymill paper
Puppymill paperPuppymill paper
Puppymill paper
 
Sunde vaner begynder med sunde valg
Sunde vaner begynder med sunde valgSunde vaner begynder med sunde valg
Sunde vaner begynder med sunde valg
 
Kanawha talk 2011 02
Kanawha talk 2011 02Kanawha talk 2011 02
Kanawha talk 2011 02
 
在巴黎设置旗舰店须知 2011——1
在巴黎设置旗舰店须知 2011——1在巴黎设置旗舰店须知 2011——1
在巴黎设置旗舰店须知 2011——1
 
Ala pr forum talk peters 2012 06e
Ala pr forum talk peters 2012 06eAla pr forum talk peters 2012 06e
Ala pr forum talk peters 2012 06e
 
Primeros pasos con twitter bootstrap
Primeros pasos con twitter bootstrapPrimeros pasos con twitter bootstrap
Primeros pasos con twitter bootstrap
 
Rich idiot’s upside down action plan: What I learned from the book
Rich idiot’s upside down action plan:  What I learned from the bookRich idiot’s upside down action plan:  What I learned from the book
Rich idiot’s upside down action plan: What I learned from the book
 
öğRenciler e twinning te neler yapabilir
öğRenciler e twinning te neler yapabiliröğRenciler e twinning te neler yapabilir
öğRenciler e twinning te neler yapabilir
 

Similaire à Dependency management & Package management in JavaScript

Webapplikationen mit Backbone.js
Webapplikationen mit Backbone.jsWebapplikationen mit Backbone.js
Webapplikationen mit Backbone.js
Sebastian Springer
 
CDI do básico ao avançado
CDI do básico ao avançadoCDI do básico ao avançado
CDI do básico ao avançado
Alberto Souza
 
BlackBerry DevCon 2011 - PhoneGap and WebWorks
BlackBerry DevCon 2011 - PhoneGap and WebWorksBlackBerry DevCon 2011 - PhoneGap and WebWorks
BlackBerry DevCon 2011 - PhoneGap and WebWorks
mwbrooks
 

Similaire à Dependency management & Package management in JavaScript (20)

Pragmatic JavaScript
Pragmatic JavaScriptPragmatic JavaScript
Pragmatic JavaScript
 
Introduction to Scrum version 3.1
Introduction to Scrum version 3.1Introduction to Scrum version 3.1
Introduction to Scrum version 3.1
 
Backbone
BackboneBackbone
Backbone
 
Einführung in AngularJS
Einführung in AngularJSEinführung in AngularJS
Einführung in AngularJS
 
Introduction to RabbitMQ | Meetup at Pivotal Labs
Introduction to RabbitMQ | Meetup at Pivotal LabsIntroduction to RabbitMQ | Meetup at Pivotal Labs
Introduction to RabbitMQ | Meetup at Pivotal Labs
 
Webapplikationen mit Backbone.js
Webapplikationen mit Backbone.jsWebapplikationen mit Backbone.js
Webapplikationen mit Backbone.js
 
JavaScript Makers: How JS is Helping Drive the Maker Movement
JavaScript Makers: How JS is Helping Drive the Maker MovementJavaScript Makers: How JS is Helping Drive the Maker Movement
JavaScript Makers: How JS is Helping Drive the Maker Movement
 
MeasureCamp IX (London) - 10 JavaScript Concepts for web analysts
MeasureCamp IX (London) - 10 JavaScript Concepts for web analystsMeasureCamp IX (London) - 10 JavaScript Concepts for web analysts
MeasureCamp IX (London) - 10 JavaScript Concepts for web analysts
 
Intro to Ember.js
Intro to Ember.jsIntro to Ember.js
Intro to Ember.js
 
Complex Architectures in Ember
Complex Architectures in EmberComplex Architectures in Ember
Complex Architectures in Ember
 
Rails 6 frontend frameworks
Rails 6 frontend frameworksRails 6 frontend frameworks
Rails 6 frontend frameworks
 
Building a Startup Stack with AngularJS
Building a Startup Stack with AngularJSBuilding a Startup Stack with AngularJS
Building a Startup Stack with AngularJS
 
CDI do básico ao avançado
CDI do básico ao avançadoCDI do básico ao avançado
CDI do básico ao avançado
 
Securing Client Side Data
 Securing Client Side Data Securing Client Side Data
Securing Client Side Data
 
BlackBerry DevCon 2011 - PhoneGap and WebWorks
BlackBerry DevCon 2011 - PhoneGap and WebWorksBlackBerry DevCon 2011 - PhoneGap and WebWorks
BlackBerry DevCon 2011 - PhoneGap and WebWorks
 
Backbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVCBackbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVC
 
Zeno rocha - HTML5 APIs para Mobile
Zeno rocha - HTML5 APIs para MobileZeno rocha - HTML5 APIs para Mobile
Zeno rocha - HTML5 APIs para Mobile
 
Loadrunner
LoadrunnerLoadrunner
Loadrunner
 
Fórum de Software Livre do Serpro RJ 2009
Fórum de Software Livre do Serpro RJ 2009Fórum de Software Livre do Serpro RJ 2009
Fórum de Software Livre do Serpro RJ 2009
 
Great Developers Steal
Great Developers StealGreat Developers Steal
Great Developers Steal
 

Plus de Sebastiano Armeli (11)

Managing a software engineering team
Managing a software engineering teamManaging a software engineering team
Managing a software engineering team
 
Enforcing coding standards in a JS project
Enforcing coding standards in a JS projectEnforcing coding standards in a JS project
Enforcing coding standards in a JS project
 
ES6: The future is now
ES6: The future is nowES6: The future is now
ES6: The future is now
 
EcmaScript 6 - The future is here
EcmaScript 6 - The future is hereEcmaScript 6 - The future is here
EcmaScript 6 - The future is here
 
Karma - JS Test Runner
Karma - JS Test RunnerKarma - JS Test Runner
Karma - JS Test Runner
 
RequireJS
RequireJSRequireJS
RequireJS
 
Lazy load Everything!
Lazy load Everything!Lazy load Everything!
Lazy load Everything!
 
MVC on the server and on the client
MVC on the server and on the clientMVC on the server and on the client
MVC on the server and on the client
 
Backbone.js in a real-life application
Backbone.js in a real-life applicationBackbone.js in a real-life application
Backbone.js in a real-life application
 
Getting started with Selenium 2
Getting started with Selenium 2Getting started with Selenium 2
Getting started with Selenium 2
 
Web Storage
Web StorageWeb Storage
Web Storage
 

Dernier

Structuring Teams and Portfolios for Success
Structuring Teams and Portfolios for SuccessStructuring Teams and Portfolios for Success
Structuring Teams and Portfolios for Success
UXDXConf
 

Dernier (20)

Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
 
Motion for AI: Creating Empathy in Technology
Motion for AI: Creating Empathy in TechnologyMotion for AI: Creating Empathy in Technology
Motion for AI: Creating Empathy in Technology
 
AI presentation and introduction - Retrieval Augmented Generation RAG 101
AI presentation and introduction - Retrieval Augmented Generation RAG 101AI presentation and introduction - Retrieval Augmented Generation RAG 101
AI presentation and introduction - Retrieval Augmented Generation RAG 101
 
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
 
The architecture of Generative AI for enterprises.pdf
The architecture of Generative AI for enterprises.pdfThe architecture of Generative AI for enterprises.pdf
The architecture of Generative AI for enterprises.pdf
 
In-Depth Performance Testing Guide for IT Professionals
In-Depth Performance Testing Guide for IT ProfessionalsIn-Depth Performance Testing Guide for IT Professionals
In-Depth Performance Testing Guide for IT Professionals
 
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
 
Free and Effective: Making Flows Publicly Accessible, Yumi Ibrahimzade
Free and Effective: Making Flows Publicly Accessible, Yumi IbrahimzadeFree and Effective: Making Flows Publicly Accessible, Yumi Ibrahimzade
Free and Effective: Making Flows Publicly Accessible, Yumi Ibrahimzade
 
Agentic RAG What it is its types applications and implementation.pdf
Agentic RAG What it is its types applications and implementation.pdfAgentic RAG What it is its types applications and implementation.pdf
Agentic RAG What it is its types applications and implementation.pdf
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
 
Speed Wins: From Kafka to APIs in Minutes
Speed Wins: From Kafka to APIs in MinutesSpeed Wins: From Kafka to APIs in Minutes
Speed Wins: From Kafka to APIs in Minutes
 
PLAI - Acceleration Program for Generative A.I. Startups
PLAI - Acceleration Program for Generative A.I. StartupsPLAI - Acceleration Program for Generative A.I. Startups
PLAI - Acceleration Program for Generative A.I. Startups
 
ODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User GroupODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User Group
 
A Business-Centric Approach to Design System Strategy
A Business-Centric Approach to Design System StrategyA Business-Centric Approach to Design System Strategy
A Business-Centric Approach to Design System Strategy
 
Introduction to Open Source RAG and RAG Evaluation
Introduction to Open Source RAG and RAG EvaluationIntroduction to Open Source RAG and RAG Evaluation
Introduction to Open Source RAG and RAG Evaluation
 
10 Differences between Sales Cloud and CPQ, Blanka Doktorová
10 Differences between Sales Cloud and CPQ, Blanka Doktorová10 Differences between Sales Cloud and CPQ, Blanka Doktorová
10 Differences between Sales Cloud and CPQ, Blanka Doktorová
 
Structuring Teams and Portfolios for Success
Structuring Teams and Portfolios for SuccessStructuring Teams and Portfolios for Success
Structuring Teams and Portfolios for Success
 
Connecting the Dots in Product Design at KAYAK
Connecting the Dots in Product Design at KAYAKConnecting the Dots in Product Design at KAYAK
Connecting the Dots in Product Design at KAYAK
 
UiPath Test Automation using UiPath Test Suite series, part 2
UiPath Test Automation using UiPath Test Suite series, part 2UiPath Test Automation using UiPath Test Suite series, part 2
UiPath Test Automation using UiPath Test Suite series, part 2
 
IESVE for Early Stage Design and Planning
IESVE for Early Stage Design and PlanningIESVE for Early Stage Design and Planning
IESVE for Early Stage Design and Planning
 

Dependency management & Package management in JavaScript