Introduction à Node.js



Arnaud "Arhuman" Assad (arhuman@gmail.com)
Aussi sur Twitter - Linkedin - Github - Blog

Au commencement il y a Javascript

  • Créé en 1995 par Brendan Eich
  • standardisé sous le nom d'ECMAScript en juin 1997
  • Fait pour concurrencer les applet Java

Node.js c'est quoi ?

  • Un super moteur (V8)
  • La killer-app de Javascript
  • Des performances et de la simplicité

A la base un moteur puissant (V8)

  • Projet de Lars Bak (2008)
  • Ecrit en C++
  • Moteur de Chrome (et Node.js)
  • Mais aussi dans CouchDB, MongoDB...

Un outil révolutionnaire

  • Projet de Ryan Lienhart Dahl (2009)
  • Implémente Common.js
  • Import de module
  • Plusieurs fois forké (io.js, ayo.js...)

Node.js la killer-app de Javascript

  • Le pendant de Ruby On Rail
  • Utilisation de Javascript coté Serveur
  • Asynchronisme
  • Boucle d'événements
  • Gestion de la mémoire (Ramasse miette)
  • Expressivité
  • Toolchain (trop?) riche

Des performances

  • Des IO ultra-rapides car asynchrones
  • Consommation mémoire réduite
  • Rapidité d'écriture (Ex. Paypal)

Node.js une solution scalable

  • Netflix
  • Twitter
  • Paypal
  • Uber
  • Linkedin
  • Ebay
  • Medium

Node.js pour quoi faire ?

  • Javascript coté serveur
  • Javascript en ligne de commande
  • Un framework polyvalent

Javascript coté serveur

  • "Javascript Fullstack"
  • Serveur Web dynamique
  • API
  • Application mobile

Node.js en ligne de commande 1/2

  • Portable
  • Polyvalent
  • Performant
  • Simple

Node.js en ligne de commande 2/2

Node.js un framework polyvalent

  • Plus d'un million de modules (juin 2019)
  • Tous les secteurs
  • Multi paradigmes
  • Multi langages

Node.js multi-paradigmes

  • Comme Javascript :
    • Programmation orientée objet
    • Programmation fonctionnelle
  • Programmation Evénementielle
  • MVC et toutes ses déclinaisons

Multi langages

  • Essentiellement des déclinaisons de Javascripts
  • Utilisation de transpiler
  • Intégré à la toolchain

Application Node.js simple



var http = require('http');

var server = http.createServer(function(req, res) {

  res.writeHead(200);

  res.end('Node est super!');

});

server.listen(8080);
                            
                    

Application Node.js (aussi) simple



const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Node est super!');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});
                            
                    

Des modules pour tout faire

  • Utilitaires
  • Sécurité
  • Programmation fonctionelle
  • IA/Machine Learning
  • Web
  • ...

Utilitaires

Sécurité

Programmation fonctionnelle

IA/Machine Learning

Des Frameworks Web puissants

Un tooling (trop?) riche

  • Task manager
  • Transpilers
  • Linters

NPM

  • Outil pour gérer les packages
  • Lié à Node
  • Des alternatives existes
    • yarn
    • bower

Utilité de NPM

  • Gestion des dépendances
  • package.json et node_modules/
  • Administration application

npm : Administration application

  • npm init
  • npm start
  • npm stop
  • npm test

npm : Gestion dépendance/packet

  • npm install
  • npm uninstall
  • npm list
  • npm login && npm publish

npm (un)install

  • npm install
    • npm install <nom_du_paquet> --save
    • npm install <nom_du_paquet>@<version> --save
    • npm install <url archive git> --save
    • ...
  • npm uninstall

npm update

  • npm update
    • npm install <nom_du_paquet> --save
    • npm install <nom_du_paquet>@<version> --save
    • ...

Versions

  • Semantic Versioning
  • Major.Minor.Patch
  • Les raccourcis Node.js
    • * correspond à >=0.0.0
      (dernière version disponible)
    • ~1.2.3 correspond à >=1.2.3 et <1.3.0
    • ^1.2.3 correspond à >=1.2.3 et <2.0.0
    • 1.* correspond à >=1.0.0 et <2.0.0
    • 1.2.3 – 2.3.4 correspond à >=1.2.3 et <=2.3.4

Commandes Node.js de base

  • node fichier.js
  • node --version
  • node --help
  • npm init && npm start/stop

Les critiques :

  • Monothread (scalabilité verticale pas terrible)
  • Fragilité
  • Cycle d'obsolescence trop rapide
  • Gestion des dépendances

Node.js monothread

  • Ne tire pas parti des architectures multi-coeurs
  • Fragile par design
  • Asynchronisme / parallélisme / Concurrentiel

Javascript est fragile

  • Faiblement typé
  • Gestion d'erreur optionnelle
  • Dépendance importante aux modules
    • Sécurité
    • Fiabilité (monothread)
    • incompatibilité
    • pas propre à node.js

Gestion des dépendances

  • taille de node_modules
  • redondance dans node_modules
  • lenteur
  • Incidents globaux
    • Is-Promise (avril 2020)
    • left-pad (mars 2016)

Et après ?

  • Deno
  • Contribuer à un projet simple
  • Devenir un Javascript ninja
    (Async/Await, Spread, Promise...)
  • Etudier le tooling
    (Transpiler, TaskRunner, Test framework...)

Questions ?

Prêts pour essayer ?

Application Node.js simple

  • EXERCICE
  • Afficher une page HTML avec
    • Titre de la page : "Ma page"
    • Titre H1 : "Node c'est super"
    • Un paragraphe contenant un texte avec un caractère accentué (éàèê...)

Un serveur web en quelques lignes

  • EXERCICE
  • Ecrire un serveur web en utilisant Node.js et express
    • Qui sert le contenu d'un répertoire statiquement via HTTP
    • Sur le port 2020
    • Le contenu doit contenir une page html

Une API simple

  • EXERCICE
  • Ecrire un serveur d'API retournant l'heure de bangkok et celle de Paris sur 2 endpoints
    • Retourne l'heure courante à Paris sur le endpoint /paris (GET)
    • Retourne l'heure courante à Bangkok sur le endpoint /bangkok (GET)
    • Ecoute sur le port 2021
    • Retourne le résultat au format json