SlideShare une entreprise Scribd logo
1  sur  44
Télécharger pour lire hors ligne
DekNOD
Node.js, le pavé dans la mare
v1.0.0
2
Un exemple, vite !
http://tweetping.net/
1. Présentation de Node
4
Qu'est-ce que Node
 Projet créé en 2009 par Ryan Dahl (Joyent Inc.)
 Basé sur le langage JavaScript
 Sur-couche de Chrome V8
 Positionné côté serveur
 Piloté par les événements
5
GitHub : Node sur le podium
6
Ceux qui l'utilisent
7
Objectifs de Node
 Fournir une pile logicielle permettant :
 Aux développeurs web : JavaScript / navigateur
 De développer des serveurs
 Faciliter les fonctionnalités de push
 Proposer une API d'I/O suffisament bas niveau
 Privilégier les appels non bloquants
8
Chrome V8
 Moteur JavaScript open source
 Utilisé dans les navigateurs (Google Chrome)
 Ou en standalone (Node)
 Compile le JavaScript en code natif
 Optimise à la volée :
 Inlining
 Cache
 Garbage collector
9
Architecture
10
Chaîne de traitement
2. Fonctionnalités
12
Gestionnaire de packages NPM
 NPM : Node Packages Modules
 Gère les dépendances d'une application Node
 Déclarées dans package.json
 Dépôt local dans node_modules/ (cf. NODE_PATH)
 Un peu comme Maven...
 npm install : télécharge les dépendances
 npm publish : publie un module dans le dépôt central
 Scopes : local au projet, ou global
13
Modèle asynchrone vs multi-thread
14
Modèle asynchrone - impacts dans le code
// Synchrone
function loadData(id) {
var data = store.find(id);
return data;
}
var result = loadData(3);
console.log('result :', result);
console.log('continue...');
// Asynchrone
function loadData(id, callback) {
store.find(id, function(data) {
callback(data);
});
}
loadData(3, function(result) {
console.log('result :', result);
});
console.log('continue...');
15
Synchrone – moins gentil
function manageRequest(request) {
var product, model, view, content;
product = store.find(id);
if (product === null) {
content = renderer.render('notFound.html');
return content;
}
model = { id:product._id, name:product.name, price:product.price };
view = 'productDetail.html';
content = renderer.render(view, model);
if (content === null) {
return renderer.render('internalError.html');
}
return content;
}
response.write(manageRequest(request));
16
Asynchrone – moins gentil
function manageRequest(request, callback) {
var product, model, view, content;
store.find(id, function (product, err) {
if (err) {
content = renderer.render('notFound.html', function (content) { callback(content); });
return;
}
model = { id:product._id, name:product.name, price:product.price };
view = 'productDetail.html';
content = renderer.render(view, model, function (content, err) {
if (err) {
renderer.render('internalError.html', function (content) { callback(content); });
return;
}
callback(content);
});
});
}
manageRequest(request, function (content) { response.write(content); });
17
Because nothing blocks,
less-than-expert
programmers are able to
develop fast systems
nodejs.org/about
3. Modules standards
19
Net, Http
 Net permet d'agir au niveau socket
 En tant que serveur ou client
 Avec des méthodes de base
 Et des événements à écouter : connect, data, end, close
 Http : idem mais au niveau web
 S'appuie sur Net et l'interface générique EventEmitter
 Supporte SSL
20
Os, Process, Child process
 Os : informations relatives au système d'exploitation
 Type, plateforme, mémoire, cpus, interfaces réseaux
 Pas l'habitude d'avoir accès à ces infos ☺
 Process : informations du processus
 Arguments, environnement, propriétaire, entrées sorties standards
 Child process : gestion de processus
 Exec, fork, spawn
21
Path , File System
 Path : outils pour travailler sur les chemins de fichiers
☹ var monfic = 'mondir/sousdir/name.ext'
☺  var monfic = path.join('mondir', 'sousdir', 'name.ext')
 File System :
 Opérations sur les fichiers :
● Lecture répertoire, suppression, écriture, information, liens symboliques
 APIs synchrones ou asynchrones
22
Modules
 Node fournit quelques variables globales
 module, process, mais pas window
 Et un mécanisme pour rendre les choses modulaires
 Inspiration pythonesque ☺
var myModule = require('./lib/mymodule');
myModule.foo();
module.exports = {
foo: function(){
return 'bar';
}
};
/lib/mymodule.js
/app.js
4. Modules tiers
24
Les incontournables – module async
 forEach, filter, map, log
 nombreux helpers pour la gestion asynchrone
var async = require('async');
async.forEach(['a', 'b', 'c'], function (item, callback) {
if (item === 'b') {
callback(new Error('b forbidden'));
} else {
console.log(item);
callback();
}
}, function (err) {
if (err) {
console.log('Error :', err);
} else {
console.log('done');
}
});
Résultat :
a
Error : [Error: b forbidden]
c
Résultat avec forEachSeries :
a
Error : [Error: b forbidden]
25
Asynchrone multi steps – à la main
step1(params, function (result) {
step2(result, function () {
step3(result, function () {
step4(result, function () {
fini();
});
});
});
});
26
Asynchrone multi steps – pattern / module Step
step1(params, function (result) {
var n = 0;
var next = function () {
n++;
if (n === 3) {
fini();
}
};
step2(result, next);
step3(result, next);
step4(result, next);
});
Step(
function () {
step1(params, this);
},
function (result) {
step2(result, this.parallel());
step3(result, this.parallel());
step4(result, this.parallel());
},
function () {
fini();
}
);
27
Les incontournables – module commander
 Pour exposer des commandes
 Plus pratique qu'une gestion avec process.argv
commander
.version(version)
.option('-f, --force', 'force on non-empty directory')
.option('-r, --refresh', 'refresh files')
...
.parse(process.argv);
appPath = commander.args.shift() || process.cwd();
if (commander.force) {
force();
...
}
28
Les incontournables – module Express
 Framework pour application web Node :
 Minimaliste et flexible
 Basé sur le middleware connect
 Définition de routes sophistiquées
 Injection de moteur de rendu : jade, ejs, consolidate
var express = require('express');
var app = express();
app.get('/hello.txt', function(req, res){
res.send('Hello World');
});
app.listen(3000);
29
Les incontournables – module i18n
 Module de traduction léger
 Stockage en json
 Facilité d'intégration avec Express
var express = require('express')
, i18n = require('i18n');
i18n.configure({
locales:['en', 'fr'],
register: global
});
app.locals({
__: i18n.__,
__n: i18n.__n
});
app.configure(function() {
app.use(i18n.init);
...
});
var welcome = __('Welcome');
<body>
<h1><%= __('Welcome') %></h1>
</body>
30
Les incontournables – module mongoose
 API mongodb pour Node :
 Adaptée au côté asynchrone de Node
 Convient à de nombreuses situations : local, distant, cloud
var mongoose = require('mongoose')
, db = require('./db');
var contactDao = {
entityName:'contact',
schema:mongoose.Schema({
firstName:{ type:String }, lastName:{ type:String }, phoneNumber:{ type:String }
}),
getModel:function () {
return db.connection.model(contactDao.entityName, contactDao.schema)
}
};
31
Simple db helper
var mongoose = require('mongoose')
, db = {
connection:null,
connect:function () {
db.connection = mongoose.connect('mongodb://localhost:27017/db');
},
close:function () {
if (db.connection !== null) {
mongoose.disconnect();
db.connection = null;
return true;
}
return false;
}
};
db.connect();
process.on('exit', function (code) {
var result = db.close();
console.log('disconnecting db : ', result);
});
32
Les incontournables – module socket.io
 Pour jouer avec les web sockets
 Modes dégradés pour les navigateurs
 Ajax, Adobe Flash Socket, iframe
 Facilité d'intégration avec Express
var io = require('socket.io').listen(80);
io.sockets.on('connection',
function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event',
function (data) {
console.log(data);
});
});
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
</script>
serveur client
5. Développement JavaScript
34
IDE et debug
 La qualité de l'offre des IDEs est limitée
 Langage non typé, trop dynamique
 Eclipse : top avec Java, bof avec JS
 Faire sans :
 On se contente d'un éditeur (vi, textmate, ...), parfois amélioré
 Faire avec :
 Le choix du moment : WebStorm (Jetbrains)
 Mode Debug (si vraiment nécessaire ☺) :
 En ligne de commande (à-la-gdb)
 Dans WebStorm : plus confortable
35
Monter en compétence sur JavaScript
 Résister aux tentations
 Se concentrer sur le meilleur
 Et sur le résultat obtenu
 JavaScript Koans :
 Inspiré de Ruby
6. Usine Logicielle
37
Les composantes essentielles d'une Usine
 Qualité du code : jslint, jshint
 Tests unitaires : mocha, qunit, jstd, jasmine, maven
 Couverture du code : jscoverage, coverjs
 Minifiers et autres compilateurs : less, coffee script, ...
 Outil de build : grunt
 Solutions efficaces pour chaque besoin
 Pas toujours pour l'ensemble...
38
Déploiement & clouds
 Déployer une application Node :
 En standalone
 Derrière un front
 Pourquoi pas un front Node...
 Cloud :
 Heroku, Nojitsu, AppFog, ...
7. Code Kata
Web live chat
8. Exemples et retours d'expérience
41
Node en synthèse
 Node réinvente les roues des frameworks web
 Un environnement auto-suffisant et très typé
 Le JavaScript en réponse à tous les besoins
42
Node en synthèse (suite)
 Node impose un modèle non bloquant / mono thread :
 Adapté aux applications réseaux légères et rapides
 Solution de choix pour une application web :
 Dont la compléxité est surtout côté client
 Un éco-système très prolifique
 Mais jeune...
9. Questions / Réponses
44
Notre offre JavaScript
 Développement client avec JavaScript et Ajax
 réf. JASI – 3 jours
 Développement JavaScript avancé
 réf. JAJA – 2 jours
 Développer une application Web Full JavaScript
 réf. STAX – 4 jours
 Programmer avec jQuery
 réf. RESI – 2 jours

Contenu connexe

Tendances

Développer sereinement avec Node.js
Développer sereinement avec Node.jsDévelopper sereinement avec Node.js
Développer sereinement avec Node.jsJulien Giovaresco
 
Frameworks : A history of violence
Frameworks : A history of violenceFrameworks : A history of violence
Frameworks : A history of violenceFrancois Zaninotto
 
Initiation à Express js
Initiation à Express jsInitiation à Express js
Initiation à Express jsAbdoulaye Dieng
 
La migration continue vers Symfony
La migration continue vers SymfonyLa migration continue vers Symfony
La migration continue vers SymfonyFrancois Zaninotto
 
CocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - EpitezCocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - EpitezCocoaHeads France
 
Synchroniser ses applications plus rapidement avec du low-code
Synchroniser ses applications plus rapidement avec du low-codeSynchroniser ses applications plus rapidement avec du low-code
Synchroniser ses applications plus rapidement avec du low-codegplanchat
 
Petit déjeuner OCTO Technology - Nouvelles Architectures Web Front-End et APIs
Petit déjeuner OCTO Technology - Nouvelles Architectures Web Front-End et APIsPetit déjeuner OCTO Technology - Nouvelles Architectures Web Front-End et APIs
Petit déjeuner OCTO Technology - Nouvelles Architectures Web Front-End et APIsOCTO Technology
 
Backday xebia - Chercher la performance efficacement
Backday xebia - Chercher la performance efficacement Backday xebia - Chercher la performance efficacement
Backday xebia - Chercher la performance efficacement Publicis Sapient Engineering
 
Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsHugo Hamon
 
WS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaOlivier BAZOUD
 
HTML5... La révolution maintenant!
HTML5... La révolution maintenant!HTML5... La révolution maintenant!
HTML5... La révolution maintenant!CARA_Lyon
 
Run java vs ruby
Run java vs rubyRun java vs ruby
Run java vs rubypinguin666
 
XebiConFr - 15 - Apache Mesos, ou comment exploiter les ressources de votre d...
XebiConFr - 15 - Apache Mesos, ou comment exploiter les ressources de votre d...XebiConFr - 15 - Apache Mesos, ou comment exploiter les ressources de votre d...
XebiConFr - 15 - Apache Mesos, ou comment exploiter les ressources de votre d...Publicis Sapient Engineering
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileIppon
 
Breizhjug spring batch 2011
Breizhjug spring batch 2011Breizhjug spring batch 2011
Breizhjug spring batch 2011Olivier BAZOUD
 
Cours 1/3 "Architecture Web"
Cours 1/3 "Architecture Web"Cours 1/3 "Architecture Web"
Cours 1/3 "Architecture Web"Adyax
 
Intégration continue & Qualité logicielle
Intégration continue & Qualité logicielleIntégration continue & Qualité logicielle
Intégration continue & Qualité logicielleDavid Buros
 

Tendances (20)

Développer sereinement avec Node.js
Développer sereinement avec Node.jsDévelopper sereinement avec Node.js
Développer sereinement avec Node.js
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
Frameworks : A history of violence
Frameworks : A history of violenceFrameworks : A history of violence
Frameworks : A history of violence
 
Initiation à Express js
Initiation à Express jsInitiation à Express js
Initiation à Express js
 
La migration continue vers Symfony
La migration continue vers SymfonyLa migration continue vers Symfony
La migration continue vers Symfony
 
CocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - EpitezCocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - Epitez
 
Synchroniser ses applications plus rapidement avec du low-code
Synchroniser ses applications plus rapidement avec du low-codeSynchroniser ses applications plus rapidement avec du low-code
Synchroniser ses applications plus rapidement avec du low-code
 
Petit déjeuner OCTO Technology - Nouvelles Architectures Web Front-End et APIs
Petit déjeuner OCTO Technology - Nouvelles Architectures Web Front-End et APIsPetit déjeuner OCTO Technology - Nouvelles Architectures Web Front-End et APIs
Petit déjeuner OCTO Technology - Nouvelles Architectures Web Front-End et APIs
 
Backday xebia - Chercher la performance efficacement
Backday xebia - Chercher la performance efficacement Backday xebia - Chercher la performance efficacement
Backday xebia - Chercher la performance efficacement
 
Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec Jenkins
 
Introduction à Angular 2
Introduction à Angular 2Introduction à Angular 2
Introduction à Angular 2
 
WS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - Xebia
 
HTML5... La révolution maintenant!
HTML5... La révolution maintenant!HTML5... La révolution maintenant!
HTML5... La révolution maintenant!
 
Run java vs ruby
Run java vs rubyRun java vs ruby
Run java vs ruby
 
Python + ansible = ♥
Python + ansible = ♥Python + ansible = ♥
Python + ansible = ♥
 
XebiConFr - 15 - Apache Mesos, ou comment exploiter les ressources de votre d...
XebiConFr - 15 - Apache Mesos, ou comment exploiter les ressources de votre d...XebiConFr - 15 - Apache Mesos, ou comment exploiter les ressources de votre d...
XebiConFr - 15 - Apache Mesos, ou comment exploiter les ressources de votre d...
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
 
Breizhjug spring batch 2011
Breizhjug spring batch 2011Breizhjug spring batch 2011
Breizhjug spring batch 2011
 
Cours 1/3 "Architecture Web"
Cours 1/3 "Architecture Web"Cours 1/3 "Architecture Web"
Cours 1/3 "Architecture Web"
 
Intégration continue & Qualité logicielle
Intégration continue & Qualité logicielleIntégration continue & Qualité logicielle
Intégration continue & Qualité logicielle
 

En vedette

Emmanuel todd
Emmanuel toddEmmanuel todd
Emmanuel toddalafonta
 
Comment allier média sociaux, productivité & rentabilité
Comment allier média sociaux, productivité & rentabilitéComment allier média sociaux, productivité & rentabilité
Comment allier média sociaux, productivité & rentabilitéFetch Capital Humain
 
Textos del Padre Federico Salvador Ramón – 55
Textos del Padre Federico Salvador Ramón – 55Textos del Padre Federico Salvador Ramón – 55
Textos del Padre Federico Salvador Ramón – 55Antonio García Megía
 
Drupal Références OpenAccess
Drupal Références OpenAccessDrupal Références OpenAccess
Drupal Références OpenAccessopenaccessfr
 
Textos del Padre Federico Salvador Ramón - 4
Textos del Padre Federico Salvador Ramón - 4Textos del Padre Federico Salvador Ramón - 4
Textos del Padre Federico Salvador Ramón - 4Antonio García Megía
 
Optimiser son profil Tiki'mee
Optimiser son profil Tiki'meeOptimiser son profil Tiki'mee
Optimiser son profil Tiki'meeLa Boite à Image
 

En vedette (20)

Emmanuel todd
Emmanuel toddEmmanuel todd
Emmanuel todd
 
Comment allier média sociaux, productivité & rentabilité
Comment allier média sociaux, productivité & rentabilitéComment allier média sociaux, productivité & rentabilité
Comment allier média sociaux, productivité & rentabilité
 
Vieux Lyon
Vieux LyonVieux Lyon
Vieux Lyon
 
Declaracion Villahermosa
Declaracion VillahermosaDeclaracion Villahermosa
Declaracion Villahermosa
 
ModelacióN EconóMica Del Cambio ClimáTico01
ModelacióN EconóMica Del Cambio ClimáTico01ModelacióN EconóMica Del Cambio ClimáTico01
ModelacióN EconóMica Del Cambio ClimáTico01
 
ediificaciones sustentables Panamá
ediificaciones sustentables Panamáediificaciones sustentables Panamá
ediificaciones sustentables Panamá
 
Gnomon Iya09 V15
Gnomon Iya09 V15Gnomon Iya09 V15
Gnomon Iya09 V15
 
Mapas Mentaleso2009
Mapas Mentaleso2009Mapas Mentaleso2009
Mapas Mentaleso2009
 
Textos del Padre Federico Salvador Ramón – 55
Textos del Padre Federico Salvador Ramón – 55Textos del Padre Federico Salvador Ramón – 55
Textos del Padre Federico Salvador Ramón – 55
 
Programa Especifrico Cambio Climatico 1
Programa Especifrico Cambio Climatico 1Programa Especifrico Cambio Climatico 1
Programa Especifrico Cambio Climatico 1
 
Drupal Références OpenAccess
Drupal Références OpenAccessDrupal Références OpenAccess
Drupal Références OpenAccess
 
Mapastec.Tecnologicos Para La Actividad Empresarial
Mapastec.Tecnologicos Para La Actividad EmpresarialMapastec.Tecnologicos Para La Actividad Empresarial
Mapastec.Tecnologicos Para La Actividad Empresarial
 
Los Azufres
Los AzufresLos Azufres
Los Azufres
 
Nota Economias 2050
Nota Economias 2050Nota Economias 2050
Nota Economias 2050
 
Contacts utiles biotechs
Contacts utiles biotechsContacts utiles biotechs
Contacts utiles biotechs
 
3 demdoc
3 demdoc3 demdoc
3 demdoc
 
Textos del Padre Federico Salvador Ramón - 4
Textos del Padre Federico Salvador Ramón - 4Textos del Padre Federico Salvador Ramón - 4
Textos del Padre Federico Salvador Ramón - 4
 
La Critica Y El Desarrollo Del Conocim
La Critica Y El Desarrollo Del ConocimLa Critica Y El Desarrollo Del Conocim
La Critica Y El Desarrollo Del Conocim
 
5 majsit
5 majsit5 majsit
5 majsit
 
Optimiser son profil Tiki'mee
Optimiser son profil Tiki'meeOptimiser son profil Tiki'mee
Optimiser son profil Tiki'mee
 

Similaire à Node.js, le pavé dans la mare

Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonyVincent Composieux
 
Partie 2: Angular
Partie 2: AngularPartie 2: Angular
Partie 2: AngularHabib Ayad
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hoodsvuillet
 
Patterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptPatterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptMicrosoft Technet France
 
Intégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CIIntégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CIHugo Hamon
 
Function oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech daysFunction   oop - bonnes pratiques ms tech days
Function oop - bonnes pratiques ms tech daysJean-Pierre Vincent
 
L'Open Web en tant que pierre angulaire du développement multi-objets
L'Open Web en tant que pierre angulaire du développement multi-objetsL'Open Web en tant que pierre angulaire du développement multi-objets
L'Open Web en tant que pierre angulaire du développement multi-objetsThomas Bassetto
 
Cours yeoman backbone box2d
Cours yeoman backbone box2dCours yeoman backbone box2d
Cours yeoman backbone box2dhugomallet
 
Firefox OS de la théorie à la pratique - OSDC
Firefox OS de la théorie à la pratique - OSDCFirefox OS de la théorie à la pratique - OSDC
Firefox OS de la théorie à la pratique - OSDCChristophe Villeneuve
 
Firefox OS, le web de demain - Epita - 2014-06-06
Firefox OS, le web de demain - Epita - 2014-06-06Firefox OS, le web de demain - Epita - 2014-06-06
Firefox OS, le web de demain - Epita - 2014-06-06Frédéric Harper
 
Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Ruau Mickael
 
Enib cours c.a.i. web - séance #6 : introduction à node js
Enib   cours c.a.i. web - séance #6 : introduction à node jsEnib   cours c.a.i. web - séance #6 : introduction à node js
Enib cours c.a.i. web - séance #6 : introduction à node jsHoracio Gonzalez
 
Initiation au développement mobile sous Android
Initiation au développement mobile sous AndroidInitiation au développement mobile sous Android
Initiation au développement mobile sous AndroidAbdelkader Rhouati
 
Notions de base de JavaScript
Notions de base de JavaScriptNotions de base de JavaScript
Notions de base de JavaScriptKristen Le Liboux
 
Titanium studio et les modules
Titanium studio et les modulesTitanium studio et les modules
Titanium studio et les modulesGautier Pialat
 

Similaire à Node.js, le pavé dans la mare (20)

Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
 
12-Factor
12-Factor12-Factor
12-Factor
 
Partie 2: Angular
Partie 2: AngularPartie 2: Angular
Partie 2: Angular
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hood
 
Patterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptPatterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScript
 
Johnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScriptJohnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScript
 
Introduction à node.js
Introduction à node.js Introduction à node.js
Introduction à node.js
 
Intégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CIIntégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CI
 
Function oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech daysFunction   oop - bonnes pratiques ms tech days
Function oop - bonnes pratiques ms tech days
 
L'Open Web en tant que pierre angulaire du développement multi-objets
L'Open Web en tant que pierre angulaire du développement multi-objetsL'Open Web en tant que pierre angulaire du développement multi-objets
L'Open Web en tant que pierre angulaire du développement multi-objets
 
Cours yeoman backbone box2d
Cours yeoman backbone box2dCours yeoman backbone box2d
Cours yeoman backbone box2d
 
Firefox OS de la théorie à la pratique - OSDC
Firefox OS de la théorie à la pratique - OSDCFirefox OS de la théorie à la pratique - OSDC
Firefox OS de la théorie à la pratique - OSDC
 
Firefox OS, le web de demain - Epita - 2014-06-06
Firefox OS, le web de demain - Epita - 2014-06-06Firefox OS, le web de demain - Epita - 2014-06-06
Firefox OS, le web de demain - Epita - 2014-06-06
 
Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?
 
Enib cours c.a.i. web - séance #6 : introduction à node js
Enib   cours c.a.i. web - séance #6 : introduction à node jsEnib   cours c.a.i. web - séance #6 : introduction à node js
Enib cours c.a.i. web - séance #6 : introduction à node js
 
Catalogue PFE 2019
Catalogue PFE 2019Catalogue PFE 2019
Catalogue PFE 2019
 
Initiation au développement mobile sous Android
Initiation au développement mobile sous AndroidInitiation au développement mobile sous Android
Initiation au développement mobile sous Android
 
Notions de base de JavaScript
Notions de base de JavaScriptNotions de base de JavaScript
Notions de base de JavaScript
 
Titanium studio et les modules
Titanium studio et les modulesTitanium studio et les modules
Titanium studio et les modules
 
Native script
Native scriptNative script
Native script
 

Plus de Valtech

Valtech - Réalité virtuelle : analyses, perspectives, démonstrations
Valtech - Réalité virtuelle : analyses, perspectives, démonstrationsValtech - Réalité virtuelle : analyses, perspectives, démonstrations
Valtech - Réalité virtuelle : analyses, perspectives, démonstrationsValtech
 
CES 2016 - Décryptage et revue des tendances
CES 2016 - Décryptage et revue des tendancesCES 2016 - Décryptage et revue des tendances
CES 2016 - Décryptage et revue des tendancesValtech
 
Stéphane Roche - Agilité en milieu multiculturel
Stéphane Roche - Agilité en milieu multiculturelStéphane Roche - Agilité en milieu multiculturel
Stéphane Roche - Agilité en milieu multiculturelValtech
 
Valtech - Internet of Things & Big Data : un mariage de raison
Valtech - Internet of Things & Big Data : un mariage de raisonValtech - Internet of Things & Big Data : un mariage de raison
Valtech - Internet of Things & Big Data : un mariage de raisonValtech
 
Tendances digitales et créatives // Cannes Lions 2015
Tendances digitales et créatives // Cannes Lions 2015Tendances digitales et créatives // Cannes Lions 2015
Tendances digitales et créatives // Cannes Lions 2015Valtech
 
Valtech - Du BI au Big Data, une révolution dans l’entreprise
Valtech - Du BI au Big Data, une révolution dans l’entrepriseValtech - Du BI au Big Data, une révolution dans l’entreprise
Valtech - Du BI au Big Data, une révolution dans l’entrepriseValtech
 
Valtech / Adobe - Résultats du Baromètre Marketing Digital 2015
Valtech / Adobe - Résultats du Baromètre Marketing Digital 2015Valtech / Adobe - Résultats du Baromètre Marketing Digital 2015
Valtech / Adobe - Résultats du Baromètre Marketing Digital 2015Valtech
 
Valtech - Architecture Agile des SI
Valtech - Architecture Agile des SIValtech - Architecture Agile des SI
Valtech - Architecture Agile des SIValtech
 
Valtech - Big Data en action
Valtech - Big Data en actionValtech - Big Data en action
Valtech - Big Data en actionValtech
 
Tendances mobiles et digitales du MWC 2015
Tendances mobiles et digitales du MWC 2015Tendances mobiles et digitales du MWC 2015
Tendances mobiles et digitales du MWC 2015Valtech
 
CES 2015 : Décryptage et tendances / Objets connectés
CES 2015 : Décryptage et tendances / Objets connectésCES 2015 : Décryptage et tendances / Objets connectés
CES 2015 : Décryptage et tendances / Objets connectésValtech
 
Valtech - Big Data en action
Valtech - Big Data en actionValtech - Big Data en action
Valtech - Big Data en actionValtech
 
Valtech - Economie Collaborative
Valtech - Economie CollaborativeValtech - Economie Collaborative
Valtech - Economie CollaborativeValtech
 
Valtech - Adobe - Résultats du Baromètre Digital Marketing 2014
Valtech - Adobe - Résultats du Baromètre Digital Marketing 2014Valtech - Adobe - Résultats du Baromètre Digital Marketing 2014
Valtech - Adobe - Résultats du Baromètre Digital Marketing 2014Valtech
 
[Veille thématique et décryptage] Cannes Lions 2014
[Veille thématique et décryptage] Cannes Lions 2014[Veille thématique et décryptage] Cannes Lions 2014
[Veille thématique et décryptage] Cannes Lions 2014Valtech
 
Valtech - Usages et technologie SaaS
Valtech - Usages et technologie SaaSValtech - Usages et technologie SaaS
Valtech - Usages et technologie SaaSValtech
 
[ Revue Innovations ] Valtech - Mobile World Congress
[ Revue Innovations ] Valtech - Mobile World Congress[ Revue Innovations ] Valtech - Mobile World Congress
[ Revue Innovations ] Valtech - Mobile World CongressValtech
 
Valtech - Digitalisation du Point de Vente - Toulouse - Février 2014
Valtech - Digitalisation du Point de Vente - Toulouse - Février 2014Valtech - Digitalisation du Point de Vente - Toulouse - Février 2014
Valtech - Digitalisation du Point de Vente - Toulouse - Février 2014Valtech
 
[ Veille de tendances ] Valtech : Objets connectés
[ Veille de tendances ] Valtech : Objets connectés[ Veille de tendances ] Valtech : Objets connectés
[ Veille de tendances ] Valtech : Objets connectésValtech
 
Valtech - Sharepoint et le cloud Azure
Valtech - Sharepoint et le cloud AzureValtech - Sharepoint et le cloud Azure
Valtech - Sharepoint et le cloud AzureValtech
 

Plus de Valtech (20)

Valtech - Réalité virtuelle : analyses, perspectives, démonstrations
Valtech - Réalité virtuelle : analyses, perspectives, démonstrationsValtech - Réalité virtuelle : analyses, perspectives, démonstrations
Valtech - Réalité virtuelle : analyses, perspectives, démonstrations
 
CES 2016 - Décryptage et revue des tendances
CES 2016 - Décryptage et revue des tendancesCES 2016 - Décryptage et revue des tendances
CES 2016 - Décryptage et revue des tendances
 
Stéphane Roche - Agilité en milieu multiculturel
Stéphane Roche - Agilité en milieu multiculturelStéphane Roche - Agilité en milieu multiculturel
Stéphane Roche - Agilité en milieu multiculturel
 
Valtech - Internet of Things & Big Data : un mariage de raison
Valtech - Internet of Things & Big Data : un mariage de raisonValtech - Internet of Things & Big Data : un mariage de raison
Valtech - Internet of Things & Big Data : un mariage de raison
 
Tendances digitales et créatives // Cannes Lions 2015
Tendances digitales et créatives // Cannes Lions 2015Tendances digitales et créatives // Cannes Lions 2015
Tendances digitales et créatives // Cannes Lions 2015
 
Valtech - Du BI au Big Data, une révolution dans l’entreprise
Valtech - Du BI au Big Data, une révolution dans l’entrepriseValtech - Du BI au Big Data, une révolution dans l’entreprise
Valtech - Du BI au Big Data, une révolution dans l’entreprise
 
Valtech / Adobe - Résultats du Baromètre Marketing Digital 2015
Valtech / Adobe - Résultats du Baromètre Marketing Digital 2015Valtech / Adobe - Résultats du Baromètre Marketing Digital 2015
Valtech / Adobe - Résultats du Baromètre Marketing Digital 2015
 
Valtech - Architecture Agile des SI
Valtech - Architecture Agile des SIValtech - Architecture Agile des SI
Valtech - Architecture Agile des SI
 
Valtech - Big Data en action
Valtech - Big Data en actionValtech - Big Data en action
Valtech - Big Data en action
 
Tendances mobiles et digitales du MWC 2015
Tendances mobiles et digitales du MWC 2015Tendances mobiles et digitales du MWC 2015
Tendances mobiles et digitales du MWC 2015
 
CES 2015 : Décryptage et tendances / Objets connectés
CES 2015 : Décryptage et tendances / Objets connectésCES 2015 : Décryptage et tendances / Objets connectés
CES 2015 : Décryptage et tendances / Objets connectés
 
Valtech - Big Data en action
Valtech - Big Data en actionValtech - Big Data en action
Valtech - Big Data en action
 
Valtech - Economie Collaborative
Valtech - Economie CollaborativeValtech - Economie Collaborative
Valtech - Economie Collaborative
 
Valtech - Adobe - Résultats du Baromètre Digital Marketing 2014
Valtech - Adobe - Résultats du Baromètre Digital Marketing 2014Valtech - Adobe - Résultats du Baromètre Digital Marketing 2014
Valtech - Adobe - Résultats du Baromètre Digital Marketing 2014
 
[Veille thématique et décryptage] Cannes Lions 2014
[Veille thématique et décryptage] Cannes Lions 2014[Veille thématique et décryptage] Cannes Lions 2014
[Veille thématique et décryptage] Cannes Lions 2014
 
Valtech - Usages et technologie SaaS
Valtech - Usages et technologie SaaSValtech - Usages et technologie SaaS
Valtech - Usages et technologie SaaS
 
[ Revue Innovations ] Valtech - Mobile World Congress
[ Revue Innovations ] Valtech - Mobile World Congress[ Revue Innovations ] Valtech - Mobile World Congress
[ Revue Innovations ] Valtech - Mobile World Congress
 
Valtech - Digitalisation du Point de Vente - Toulouse - Février 2014
Valtech - Digitalisation du Point de Vente - Toulouse - Février 2014Valtech - Digitalisation du Point de Vente - Toulouse - Février 2014
Valtech - Digitalisation du Point de Vente - Toulouse - Février 2014
 
[ Veille de tendances ] Valtech : Objets connectés
[ Veille de tendances ] Valtech : Objets connectés[ Veille de tendances ] Valtech : Objets connectés
[ Veille de tendances ] Valtech : Objets connectés
 
Valtech - Sharepoint et le cloud Azure
Valtech - Sharepoint et le cloud AzureValtech - Sharepoint et le cloud Azure
Valtech - Sharepoint et le cloud Azure
 

Node.js, le pavé dans la mare

  • 1. DekNOD Node.js, le pavé dans la mare v1.0.0
  • 4. 4 Qu'est-ce que Node  Projet créé en 2009 par Ryan Dahl (Joyent Inc.)  Basé sur le langage JavaScript  Sur-couche de Chrome V8  Positionné côté serveur  Piloté par les événements
  • 7. 7 Objectifs de Node  Fournir une pile logicielle permettant :  Aux développeurs web : JavaScript / navigateur  De développer des serveurs  Faciliter les fonctionnalités de push  Proposer une API d'I/O suffisament bas niveau  Privilégier les appels non bloquants
  • 8. 8 Chrome V8  Moteur JavaScript open source  Utilisé dans les navigateurs (Google Chrome)  Ou en standalone (Node)  Compile le JavaScript en code natif  Optimise à la volée :  Inlining  Cache  Garbage collector
  • 12. 12 Gestionnaire de packages NPM  NPM : Node Packages Modules  Gère les dépendances d'une application Node  Déclarées dans package.json  Dépôt local dans node_modules/ (cf. NODE_PATH)  Un peu comme Maven...  npm install : télécharge les dépendances  npm publish : publie un module dans le dépôt central  Scopes : local au projet, ou global
  • 13. 13 Modèle asynchrone vs multi-thread
  • 14. 14 Modèle asynchrone - impacts dans le code // Synchrone function loadData(id) { var data = store.find(id); return data; } var result = loadData(3); console.log('result :', result); console.log('continue...'); // Asynchrone function loadData(id, callback) { store.find(id, function(data) { callback(data); }); } loadData(3, function(result) { console.log('result :', result); }); console.log('continue...');
  • 15. 15 Synchrone – moins gentil function manageRequest(request) { var product, model, view, content; product = store.find(id); if (product === null) { content = renderer.render('notFound.html'); return content; } model = { id:product._id, name:product.name, price:product.price }; view = 'productDetail.html'; content = renderer.render(view, model); if (content === null) { return renderer.render('internalError.html'); } return content; } response.write(manageRequest(request));
  • 16. 16 Asynchrone – moins gentil function manageRequest(request, callback) { var product, model, view, content; store.find(id, function (product, err) { if (err) { content = renderer.render('notFound.html', function (content) { callback(content); }); return; } model = { id:product._id, name:product.name, price:product.price }; view = 'productDetail.html'; content = renderer.render(view, model, function (content, err) { if (err) { renderer.render('internalError.html', function (content) { callback(content); }); return; } callback(content); }); }); } manageRequest(request, function (content) { response.write(content); });
  • 17. 17 Because nothing blocks, less-than-expert programmers are able to develop fast systems nodejs.org/about
  • 19. 19 Net, Http  Net permet d'agir au niveau socket  En tant que serveur ou client  Avec des méthodes de base  Et des événements à écouter : connect, data, end, close  Http : idem mais au niveau web  S'appuie sur Net et l'interface générique EventEmitter  Supporte SSL
  • 20. 20 Os, Process, Child process  Os : informations relatives au système d'exploitation  Type, plateforme, mémoire, cpus, interfaces réseaux  Pas l'habitude d'avoir accès à ces infos ☺  Process : informations du processus  Arguments, environnement, propriétaire, entrées sorties standards  Child process : gestion de processus  Exec, fork, spawn
  • 21. 21 Path , File System  Path : outils pour travailler sur les chemins de fichiers ☹ var monfic = 'mondir/sousdir/name.ext' ☺  var monfic = path.join('mondir', 'sousdir', 'name.ext')  File System :  Opérations sur les fichiers : ● Lecture répertoire, suppression, écriture, information, liens symboliques  APIs synchrones ou asynchrones
  • 22. 22 Modules  Node fournit quelques variables globales  module, process, mais pas window  Et un mécanisme pour rendre les choses modulaires  Inspiration pythonesque ☺ var myModule = require('./lib/mymodule'); myModule.foo(); module.exports = { foo: function(){ return 'bar'; } }; /lib/mymodule.js /app.js
  • 24. 24 Les incontournables – module async  forEach, filter, map, log  nombreux helpers pour la gestion asynchrone var async = require('async'); async.forEach(['a', 'b', 'c'], function (item, callback) { if (item === 'b') { callback(new Error('b forbidden')); } else { console.log(item); callback(); } }, function (err) { if (err) { console.log('Error :', err); } else { console.log('done'); } }); Résultat : a Error : [Error: b forbidden] c Résultat avec forEachSeries : a Error : [Error: b forbidden]
  • 25. 25 Asynchrone multi steps – à la main step1(params, function (result) { step2(result, function () { step3(result, function () { step4(result, function () { fini(); }); }); }); });
  • 26. 26 Asynchrone multi steps – pattern / module Step step1(params, function (result) { var n = 0; var next = function () { n++; if (n === 3) { fini(); } }; step2(result, next); step3(result, next); step4(result, next); }); Step( function () { step1(params, this); }, function (result) { step2(result, this.parallel()); step3(result, this.parallel()); step4(result, this.parallel()); }, function () { fini(); } );
  • 27. 27 Les incontournables – module commander  Pour exposer des commandes  Plus pratique qu'une gestion avec process.argv commander .version(version) .option('-f, --force', 'force on non-empty directory') .option('-r, --refresh', 'refresh files') ... .parse(process.argv); appPath = commander.args.shift() || process.cwd(); if (commander.force) { force(); ... }
  • 28. 28 Les incontournables – module Express  Framework pour application web Node :  Minimaliste et flexible  Basé sur le middleware connect  Définition de routes sophistiquées  Injection de moteur de rendu : jade, ejs, consolidate var express = require('express'); var app = express(); app.get('/hello.txt', function(req, res){ res.send('Hello World'); }); app.listen(3000);
  • 29. 29 Les incontournables – module i18n  Module de traduction léger  Stockage en json  Facilité d'intégration avec Express var express = require('express') , i18n = require('i18n'); i18n.configure({ locales:['en', 'fr'], register: global }); app.locals({ __: i18n.__, __n: i18n.__n }); app.configure(function() { app.use(i18n.init); ... }); var welcome = __('Welcome'); <body> <h1><%= __('Welcome') %></h1> </body>
  • 30. 30 Les incontournables – module mongoose  API mongodb pour Node :  Adaptée au côté asynchrone de Node  Convient à de nombreuses situations : local, distant, cloud var mongoose = require('mongoose') , db = require('./db'); var contactDao = { entityName:'contact', schema:mongoose.Schema({ firstName:{ type:String }, lastName:{ type:String }, phoneNumber:{ type:String } }), getModel:function () { return db.connection.model(contactDao.entityName, contactDao.schema) } };
  • 31. 31 Simple db helper var mongoose = require('mongoose') , db = { connection:null, connect:function () { db.connection = mongoose.connect('mongodb://localhost:27017/db'); }, close:function () { if (db.connection !== null) { mongoose.disconnect(); db.connection = null; return true; } return false; } }; db.connect(); process.on('exit', function (code) { var result = db.close(); console.log('disconnecting db : ', result); });
  • 32. 32 Les incontournables – module socket.io  Pour jouer avec les web sockets  Modes dégradés pour les navigateurs  Ajax, Adobe Flash Socket, iframe  Facilité d'intégration avec Express var io = require('socket.io').listen(80); io.sockets.on('connection', function (socket) { socket.emit('news', { hello: 'world' }); socket.on('my other event', function (data) { console.log(data); }); }); <script src="/socket.io/socket.io.js"></script> <script> var socket = io.connect('http://localhost'); socket.on('news', function (data) { console.log(data); socket.emit('my other event', { my: 'data' }); }); </script> serveur client
  • 34. 34 IDE et debug  La qualité de l'offre des IDEs est limitée  Langage non typé, trop dynamique  Eclipse : top avec Java, bof avec JS  Faire sans :  On se contente d'un éditeur (vi, textmate, ...), parfois amélioré  Faire avec :  Le choix du moment : WebStorm (Jetbrains)  Mode Debug (si vraiment nécessaire ☺) :  En ligne de commande (à-la-gdb)  Dans WebStorm : plus confortable
  • 35. 35 Monter en compétence sur JavaScript  Résister aux tentations  Se concentrer sur le meilleur  Et sur le résultat obtenu  JavaScript Koans :  Inspiré de Ruby
  • 37. 37 Les composantes essentielles d'une Usine  Qualité du code : jslint, jshint  Tests unitaires : mocha, qunit, jstd, jasmine, maven  Couverture du code : jscoverage, coverjs  Minifiers et autres compilateurs : less, coffee script, ...  Outil de build : grunt  Solutions efficaces pour chaque besoin  Pas toujours pour l'ensemble...
  • 38. 38 Déploiement & clouds  Déployer une application Node :  En standalone  Derrière un front  Pourquoi pas un front Node...  Cloud :  Heroku, Nojitsu, AppFog, ...
  • 39. 7. Code Kata Web live chat
  • 40. 8. Exemples et retours d'expérience
  • 41. 41 Node en synthèse  Node réinvente les roues des frameworks web  Un environnement auto-suffisant et très typé  Le JavaScript en réponse à tous les besoins
  • 42. 42 Node en synthèse (suite)  Node impose un modèle non bloquant / mono thread :  Adapté aux applications réseaux légères et rapides  Solution de choix pour une application web :  Dont la compléxité est surtout côté client  Un éco-système très prolifique  Mais jeune...
  • 43. 9. Questions / Réponses
  • 44. 44 Notre offre JavaScript  Développement client avec JavaScript et Ajax  réf. JASI – 3 jours  Développement JavaScript avancé  réf. JAJA – 2 jours  Développer une application Web Full JavaScript  réf. STAX – 4 jours  Programmer avec jQuery  réf. RESI – 2 jours