Download - Node.js, le pavé dans la mare

Transcript
Page 1: Node.js, le pavé dans la mare

DekNOD

Node.js, le pavé dans la mare

v1.0.0

Page 2: Node.js, le pavé dans la mare

2

Un exemple, vite !

http://tweetping.net/

Page 3: Node.js, le pavé dans la mare

1. Présentation de Node

Page 4: Node.js, le pavé dans la mare

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

5

GitHub : Node sur le podium

Page 6: Node.js, le pavé dans la mare

6

Ceux qui l'utilisent

Page 7: Node.js, le pavé dans la mare

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

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

9

Architecture

Page 10: Node.js, le pavé dans la mare

10

Chaîne de traitement

Page 11: Node.js, le pavé dans la mare

2. Fonctionnalités

Page 12: Node.js, le pavé dans la mare

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

13

Modèle asynchrone vs multi-thread

Page 14: Node.js, le pavé dans la mare

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

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

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

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

3. Modules standards

Page 19: Node.js, le pavé dans la mare

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

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

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

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

4. Modules tiers

Page 24: Node.js, le pavé dans la mare

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

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

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

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

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

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

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

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

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

5. Développement JavaScript

Page 34: Node.js, le pavé dans la mare

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

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

6. Usine Logicielle

Page 37: Node.js, le pavé dans la mare

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

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

7. Code Kata

Web live chat

Page 40: Node.js, le pavé dans la mare

8. Exemples et retours d'expérience

Page 41: Node.js, le pavé dans la mare

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

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

9. Questions / Réponses

Page 44: Node.js, le pavé dans la mare

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