Christophe Sensebé
Développeur web
Je travaille à FMGS concept
Je prépare un titre de concepteur developeur informatique au CEFIM
J'ai appris à programmer ces dernières années, en grande partie avec node.js
Et je vais vous présenter la plateforme, son fonctionnement, ce qu'on peut faire avec et quelques ressources qui m'on servi à apprendre à m'en servir
Plateforme logicielle libre, permettant d'éxécuter du javascript coté serveur.
crée en 2009, par Ryan Dahl, en critique au modèle utilisé d'I/O utilisé par la plupart des serveurs web et de leur incapacité à gérer un très grand nombre de requêtes concurentes (au dela de 10000).
I/O bloquante
Ici on le modèle "classique" de code séquenciel dit bloquant, toute opération bloquante (appel à une base de donnée, au réseau bloque l'exécution du code sité après).
La plupart du temps ce problème est contourné en créant un nouveau thread pour chaque requête, ce qui a un coût non négligeable, surtout pour des taches courtes.
I/O non bloquante
Dans le cas de node.js, on enregistre l'opération à effectuer, sa résolution est déléguée à un pool de threads pré-instanciés, une fois celle-ci effectuée une fonction de rappel est appellée pour prendre en charge la suite des opérations. le thread principal reste libre, ce qui permet de prendre en charge un nombre de requêtes concurentes plus élevé.
Node.js est construit en combinant
Le moteur javascript v8 de chrome
Libuv une bibliothèque C multi plateforme chargée de la gestion de la boucle d'évènements, du pool de threads et de la résolution asynchrone des opérations d'I/O.
Node.js intègre un gestionnaire de paquets NPM qui permet de consommer et de distribuer les modules javascripts présents sur ses registres
Node.js est disponible pour les principaux systèmes d'exploitation, dont Linux, MacOS et Windows
Les applications Node.js sont écrites en javascript ou n'importe quel language transpilable en javascript (CoffeScript, Dart, TypeScript...)
De base node fourni une API d'assez bas niveau, qui permet d'interagir avec le système de fichiers, le reseau, la manipulation de données binaires, des fonctions cryptographiques...
Qu'il est possible d'étendre via des add-on écris en C ou C++
Fonctionnement
Pour rappel le mode de fonctionnement de node.js
Le programme javascript s'exéute sur un seul thread et pour ne pas bloquer la boucle d'évènements, on utilise un mode de programmation évènementielle en utilisant des fonctions de rappel (callbacks).
Exemples
Deux exemples pour illuster ce mode de fonctionnement
Lecture d'un fichier
const fs = require('fs' )
fs.readFile('myFile.md' , 'utf-8' , (err , data) => {
if (err ) {
console.log(err )
return
}
console.log(data)
})
j'utilise la fonction require, fournie par node pour importer le module fs (pour fileSystem)
Je fais appel à la fonction readfile du module
Ici les deux premiers paramètres sont le nom du fichier et l'encodage
Le dernier est la fonction de rappel (fonction fléchée anonyme ajout d'es6, syntaxe plus courte et ne lie pas son this)
Dans ce cas elle prend en parametre une erreur ou le resultat de l'opération, idiomatique de l'api nodejs
Serveur http
const http = require(
let server = http.createServer((request , response ) => {
response .end (
});
server .listen(8000 );
autre exemple avec le module http
Pour illustrer le fait que node.js possède une bibliothèque http intégrée qui lui permet de se passer de serveur web
Ici pour chaque requête on execute le callback suivant qui prend un objet requête et reponse qui implementent une interface Writable Stream qui permettent d'interagir aveec eux
ici je me contente de terminer la réponse en ecrivant dedans
Ensuite le serveur est mis en écoute sur le port passé en passé en paramètre
Npm le gestionnaire de paquets
Je vais maintenant vous parler de npm qui permet de profiter des nombreux modules, bibliothèques et frameworks existants pour démarrer un projet sans avoir à recoder 'from scratch'
Le fichier package.json
{
"name" : "ledserver" ,
"author" : "ChrisSensebe"
"version" : "0.0.0" ,
"private" : true ,
"scripts" : {
"start" : "node ./bin/www"
},
"dependencies" : {
"body-parser" : "~1.16.0" ,
"cookie-parser" : "~1.4.3" ,
"debug" : "~2.6.0" ,
"express" : "~4.14.1" ,
...
Le site NPM
https://www.npmjs.com/
Ici vous avez le site NPM recense les plus de 400000 paquets publiés dans le registre public de npm, ainsi que la doc
Adapté pour
Applications web en temps réel
Micro tâches
Proxi en facade de différents services
API construite sur une base servant du json (CouchDB, Mongo, Postgres
Streaming
Capacité à gérer un grand nombre de requêtes concurentes, integration facile avec les websockets
Micro taches, facile a modulariser et à distribuer
Capacité d'I/O performante et à communiquer "facilement" avec une grande variété de protocoles (http, websockets, tcp, udp...)
le même format de données et modèle dans tout le stack
Le même langage (javascript) utilisé coté serveur et coté client
Le fait que les requêtes et reponses sont utilisables comme des flux peremt d'interagir avec pendant leur traitement
Rendu coté serveur SPA
Pas un problème
Api stable
Système de release avec lts Tout les ans
Communautée active
Support de l'industrie
Support de la plateforme dans les ide
lts support actif de 18 mois + 12 mois de maintenance
Fondation node js pour promouvoir et supporter la plateforme, avec pour membres (non exaustif), ibm, intel, microsoft, google
moins adapté / défauts
API basée sur les callbacks
Applications gourmandes en temps de calcul
Calcul scientifique
Traitement audio/video
Embarqué
Utilisation avec une base relationelle
CMS
L'api basée sur les callbacks, qui amène à du code peu lisible et difficile à maintenir (callback hell ou pyramide of doom)
Le choix a été fait pour des raison de performance
Wrapper dans des promesses ou utiliser async/await (node 7.6+
Tout code bloquant, et le modèle perd de son intéret dans le cadre d'applications gourmandes en cpu
embarqué, vm javascript, perte en terme de perf, sauf prototypage
traitement A/V, calcul scientifique bibliothèques matures et utilisées dans d'autre languages (java, python, c...)
db relationelle/cms, possible mais outils plus matures dans d'autres languages
Outillage javascript
Webpack
Grunt
Gulp
cli pour react, angular, cordova
Frameworks web
Express framework "standart" pour construire des applications web en node
HAPI, alternative à express, KOA generators ou async await
Meteor permet d ecrire du code utilisable indiferement coté serveur ou coté client
Restify proche d'express, dédié à la réalisation d'API rest
Electron
Slack
Atom
Visual studio code
Postman
https://electron.atom.io/
Electron framework utilisant node et chromuim dédié à la réalisation d'applications de bureau, exemples: Slack, Atom, Visual studio code, Postman. Moins performants que d'autres languages mais permet d'utiliser les technos/compétences web pour réaliser une appli de bureau
En vrac
socket.io
PM2
Johnny-Five
socket.io -> websockets
PM2: monitoring, relancer un script, clusters, load balancing
Plateforme pour la robotique et internet of things, plus un outil de prototypage, mais permet d'utiliser des compétence de dev web pour communiquer avec des objets
Exemple avec websocket + johnny-Five
Un exemple d'utilisation de websockets et de johnny-five (plateforme pour la robotique et l'iot)
j'ai relié la présentation par websocket avec un serveur express js qui controlle une led RGB
Led ON
const five = require ("johnny-five" );
const board = new five.Board();
board.on('ready' , () => {
let led = new five.led.RGB({
pins: {
red: 6 ,
green: 5 ,
blue: 3 ,
}
});
};
Rouge
led .color ({
red : 255 ,
green : 0 ,
blue : 0
});
Vert
led .color ({
red : 0 ,
green : 255 ,
blue : 0
});
Bleu
led .color ({
red : 0 ,
green : 0 ,
blue : 255
});
Utilisation de nvm
https://github.com/creationix/nvm
Nvm est un outil en ligne de commande qui permet d'installer et de gérer plusieurs versions de node.js sur un même système.
Une page stackoverflow qui rescense des ressources pour commencer avec node.js
Un article qui est une bonne introduction
Des cours sur codeschool node, express, mongo (payant)
Cours en français sur openClassroom
Série d'articles de blog sur risingstack, qui vont de l'intro a node au déployement en production