Download - Node.js, le pavé dans la mare
![Page 1: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/1.jpg)
DekNOD
Node.js, le pavé dans la mare
v1.0.0
![Page 2: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/2.jpg)
2
Un exemple, vite !
http://tweetping.net/
![Page 3: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/3.jpg)
1. Présentation de Node
![Page 4: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/4.jpg)
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
![Page 5: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/5.jpg)
5
GitHub : Node sur le podium
![Page 6: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/6.jpg)
6
Ceux qui l'utilisent
![Page 7: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/7.jpg)
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
![Page 8: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/8.jpg)
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
![Page 9: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/9.jpg)
9
Architecture
![Page 10: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/10.jpg)
10
Chaîne de traitement
![Page 11: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/11.jpg)
2. Fonctionnalités
![Page 12: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/12.jpg)
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
![Page 13: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/13.jpg)
13
Modèle asynchrone vs multi-thread
![Page 14: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/14.jpg)
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...');
![Page 15: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/15.jpg)
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));
![Page 16: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/16.jpg)
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); });
![Page 17: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/17.jpg)
17
Because nothing blocks, less-than-expert
programmers are able to develop fast systems
nodejs.org/about
![Page 18: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/18.jpg)
3. Modules standards
![Page 19: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/19.jpg)
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
![Page 20: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/20.jpg)
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
![Page 21: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/21.jpg)
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
![Page 22: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/22.jpg)
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
![Page 23: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/23.jpg)
4. Modules tiers
![Page 24: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/24.jpg)
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 :aError : [Error: b forbidden]c
Résultat avec forEachSeries :aError : [Error: b forbidden]
![Page 25: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/25.jpg)
25
Asynchrone multi steps – à la main
step1(params, function (result) { step2(result, function () { step3(result, function () { step4(result, function () { fini(); }); }); });});
![Page 26: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/26.jpg)
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(); });
![Page 27: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/27.jpg)
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(); ...}
![Page 28: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/28.jpg)
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);
![Page 29: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/29.jpg)
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>
![Page 30: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/30.jpg)
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) }};
![Page 31: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/31.jpg)
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);});
![Page 32: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/32.jpg)
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
![Page 33: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/33.jpg)
5. Développement JavaScript
![Page 34: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/34.jpg)
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
![Page 35: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/35.jpg)
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
![Page 36: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/36.jpg)
6. Usine Logicielle
![Page 37: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/37.jpg)
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...
![Page 38: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/38.jpg)
38
Déploiement & clouds
Déployer une application Node :
En standalone
Derrière un front
Pourquoi pas un front Node...
Cloud :
Heroku, Nojitsu, AppFog, ...
![Page 39: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/39.jpg)
7. Code Kata
Web live chat
![Page 40: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/40.jpg)
8. Exemples et retours d'expérience
![Page 41: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/41.jpg)
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
![Page 42: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/42.jpg)
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...
![Page 43: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/43.jpg)
9. Questions / Réponses
![Page 44: Node.js, le pavé dans la mare](https://reader033.vdocuments.pub/reader033/viewer/2022052504/553bb97a4a7959d77b8b471c/html5/thumbnails/44.jpg)
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