Node.js, le pavé dans la mare

44
DekNOD Node.js, le pavé dans la mare v1.0.0

description

Au coeur des applications Web riches, de HTML5 ou des applications Web mobiles, JavaScript est désormais incontournable. Sa communauté très dynamique a contribué à créer un écosystème complet pour répondre aux problématiques courantes de test, qualité du code ou intégration continue comme l'a fait avant elle la communauté Java il y a pas loin de dix ans... Parmi les projets les plus observés du moment, c'est curieusement côté serveur que JavaScript fait le plus parler de lui avec Node.js, un environnement de développement Web qui cultive sa différence. Téléchargement du Coding Kata :

Transcript of Node.js, le pavé dans la mare

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