Mis à jour le vendredi 11 août 2017
  • 10 heures
  • Difficile

Ce cours est visible gratuitement en ligne.

Ce cours existe en livre papier.

Vous pouvez obtenir un certificat de réussite à l'issue de ce cours.

Vous pouvez être accompagné et mentoré par un professeur particulier par visioconférence sur ce cours.

J'ai tout compris !

Node.js : mais à quoi ça sert ?

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Et si on commençait par répondre à toutes ces questions qui vous taraudent :

  • Pourquoi Node.js semble-t-il aussi apprécié des développeurs web ?

  • Pourquoi avoir utilisé un langage comme JavaScript ? Je croyais que c'était juste pour faire des effets dans sa page web ?

  • D'où vient cette rapidité supposée de Node.js ? A quoi ça peut me servir ?

  • Est-ce que ce truc est mature ? Qui l'utilise ? Devrais-je l'utiliser moi aussi ?

Allez, pas de chichis, on va répondre à tout ça et même plus dans ce premier chapitre. :)

Si l'aventure vous tente, vous pourrez passer à la suite avec moi et installer Node.js sur votre machine !

Du JavaScript "à la papa" à Node.js

OK, j'avoue, l'expression "JavaScript à la papa" est un peu forte. :-°
Mais il y a du vrai là-dedans : JavaScript a eu plusieurs vies. Il a eu mauvaise presse. On l'a considéré comme un "petit truc parfois bien pratique", longtemps pour "faire des effets dans sa page web". Or, JavaScript est avant tout un langage. Un langage au même titre que le C, Ruby, PHP et bien d'autres.

Aujourd'hui, JavaScript est de retour et il prend sa revanche. :pirate:
En quelque sorte, les développeurs sont en train de découvrir que ce langage qu'ils ont longtemps ignoré, parfois même méprisé, cache en fait bien son jeu.

Non, JavaScript n'est pas juste un petit langage utilitaire.
Oui, JavaScript est un langage à part, qui s'utilise vraiment différemment de Java, du C et d'un tas d'autres langages.
Oui, JavaScript peut être compliqué à utiliser, mais recèle derrière ça une vraie puissance.

Alors que ce langage a été créé en 1995 (la préhistoire de l'informatique, vous vous rendez compte !), il a depuis bien évolué. Je vous invite à (re)lire la petite histoire de JavaScript racontée par les compères Thunderseb et Nesquik69 dans leur cours sur JavaScript (chapitre d'introduction).

Je vous disais que JavaScript était un langage qui, pour moi, avait connu plusieurs vies. Pour situer les choses, je dirais même qu'il a connu 3 vies :

  1. Dans les années 90, on parlait de DHTML (Dynamic HTML). On utilisait en fait les toutes premières versions de JavaScript pour faire des petits effets dans ses pages web : afficher une image lors d'un clic sur un bouton par exemple. C'était l'époque de Netscape et d'Internet Explorer 5.5 (mon Dieu ça me rajeunit pas !).

  2. Dans les années 2000, on a commencé à utiliser le langage pour créer des interfaces côté client. C'est là que des bibliothèques comme jQuery ou Mootools sont apparues. Aujourd'hui, cet usage de JavaScript est très répandu et mature. On a pris l'habitude de manipuler le DOM (Document Object Model) pour affecter ses balises HTML en JavaScript et leur faire subir toutes sortes de traitements.

  3. Puis, aux alentours de 2010, JavaScript est entré dans une nouvelle ère. Google a commencé à rendre le langage beaucoup plus rapide avec l'apparition du navigateur Google Chrome. Avec ce navigateur est né le moteur d'exécution V8 qui a considérablement permis d'accélérer l'exécution de code JavaScript (j'y reviendrai). Des outils comme Node.js sont ensuite apparus. Les bibliothèques dont le nom finit par .js se sont multipliées : Backbone.js, Ember.js, Meteor.js. JavaScript a l'air à nouveau cool... et semble en même temps plus compliqué qu'il n'y paraissait au premier abord.

Les 3 vies de JavaScript
Les 3 vies de JavaScript

Soyons clairs : jQuery n'est pas mort et ça ne veut pas dire qu'il faut cesser de l'utiliser (par contre DHTML et Netscape sont bel et bien morts eux :p ). Les nouveaux outils JavaScript comme Node.js font des choses très différentes de jQuery et consorts. Les deux peuvent tout à fait se compléter.

Bon, mais ça apporte quoi concrètement Node.js ?

Node.js nous permet d'utiliser le langage JavaScript sur le serveur... Il nous permet donc de faire du JavaScript en dehors du navigateur !
Node.js bénéficie de la puissance de JavaScript pour proposer une toute nouvelle façon de développer des sites web dynamiques.

Je vous propose justement maintenant de rentrer dans le détail du fonctionnement de Node.js. :)

Node.js : le JavaScript côté serveur

Jusqu'ici, JavaScript avait toujours été utilisé du côté du client, c'est-à-dire du côté du visiteur qui navigue sur notre site. Le navigateur web du visiteur (Firefox, Chrome, IE...) exécute le code JavaScript et effectue des actions sur la page web.

Le schéma classique : PHP sur le serveur, JavaScript chez le client
Le schéma classique : PHP sur le serveur, JavaScript chez le client

Qu'est-ce qui change avec l'arrivée de Node.js ?

On peut toujours utiliser du JavaScript côté client pour manipuler la page HTML. Ca, ça ne change pas.

Par contre, Node.js offre un environnement côté serveur qui nous permet aussi d'utiliser le langage JavaScript pour générer des pages web. En gros, il vient en remplacement de langages serveur comme PHP, Java EE, etc.

Avec Node.js, on peut aussi utiliser du JavaScript sur le serveur !
Avec Node.js, on peut aussi utiliser du JavaScript sur le serveur !

Pourquoi Node.js semble-t-il si différent ? Parce qu'il utilise JavaScript ?

Oui, et parce que JavaScript est un langage basé sur les évènements, donc Node.js est lui-même basé sur les évènements. Du coup, c'est toute la façon d'écrire des applications web qui change ! Et c'est de là que Node.js tire toute sa puissance et sa rapidité.

Avec Node.js, vous pouvez créer des applications rapides comme :

  • Un serveur de Chat

  • Un système d'upload très rapide

  • ... et de façon générale n'importe quelle application qui doit répondre à de nombreuses requêtes rapidement et efficacement, en temps réel

JavaScript n'est pas vraiment un langage orienté objet, il est donc très loin de Java, Ruby ou Python. Ecrire une application avec Node.js demande une gymnastique d'esprit complètement différente ! C'est un peu déroutant au début pour tout vous avouer, mais quand on commence à maîtriser cet outil, on se sent un peu comme si on venait d'avoir de nouveaux super-pouvoirs qu'on ne soupçonnait pas.

Pourquoi Node.js est-il rapide ?

Si Node.js est rapide, cela tient principalement à deux choses : le moteur V8 et son fonctionnement non bloquant.

Le moteur V8

Node.js utilise le moteur d'exécution ultrarapide V8 de Google Chrome. Ce moteur V8 avait fait beaucoup parler de lui à la sortie de Google Chrome, car c'est un outil open source créé par Google qui analyse et exécute du code JavaScript très rapidement.

Le logo du moteur JavaScript V8 de Google
Le logo du moteur JavaScript V8 de Google

Jusqu'à la sortie de Chrome, la plupart des navigateurs lisaient le code JavaScript de façon peu efficace : le code était lu et interprété au fur et à mesure. Le navigateur mettait beaucoup de temps à lire le JavaScript et à le transformer en code machine compréhensible pour le processeur.

Le moteur V8 de Google Chrome, qui est réutilisé ici par Node.js, fonctionne complètement différent. Très optimisé, il fait ce qu'on appelle de la compilation JIT (Just In Time). Il transforme le code JavaScript très rapidement en code machine et l'optimise même grâce à des procédés complexes : code inlining, copy elision et j'en passe.

Vous n'avez pas besoin de connaître le fonctionnement de V8 pour utiliser Node.js. Retenez juste qu'il permet de rendre l'exécution de code JavaScript ultrarapide (et que les développeurs chez Google qui l'ont conçu sont des bons :-° ).

Le modèle non bloquant

Comme JavaScript est un langage conçu autour de la notion d'évènement, Node.js a pu mettre en place une architecture de code entièrement non bloquante.

Mais au fait, connaissez-vous la différence entre un code bloquant et un code non bloquant ? Hmmm, un peu d'explications ne peuvent pas faire de mal je vois ! ;)

Modèle bloquant vs modèle non bloquant

Imaginez un programme dont le rôle est de télécharger un fichier puis de l'afficher. Voici comment on écrirait le code dans un modèle bloquant :

Télécharger un fichier
Afficher le fichier
Faire autre chose

Les actions sont effectuées dans l'ordre. Il faut lire les lignes de haut en bas :

  1. Le programme va télécharger un fichier sur Internet

  2. Le programme affiche le fichier à l'utilisateur

  3. Puis ensuite le programme peut faire d'autres choses (effectuer d'autres actions)

Maintenant, on peut écrire le même code sur un modèle non bloquant :

Télécharger un fichier
    Dès que c'est terminé, afficher le fichier
Faire autre chose

Le programme n'exécute plus les lignes dans l'ordre où elles sont écrites. Il fait ceci :

  1. Le programme lance le téléchargement d'un fichier sur Internet

  2. Le programme fait d'autres choses (le programme suit son cours)

  3. Dès que le téléchargement est terminé, le programme effectue les actions qu'on lui avait demandées : il affiche le fichier

Schématiquement, l'exécution du programme peut donc se représenter comme ça :

Le modèle non bloquant en programmation
Le modèle non bloquant en programmation

C'est justement comme ça que fonctionne Node.js. Dès que l'évènement "Fichier téléchargé" apparaît, une fonction appelée fonction de callback est appelée et effectue des actions (ici, la fonction de callback affiche le fichier).

Le modèle non bloquant avec Node.js

Bon, et avec du vrai code ça donne quoi ? Voici un exemple de programme Node.js qui télécharge un fichier sur Internet et affiche "Fichier téléchargé !" quand il a terminé :

request('http://www.site.com/fichier.zip', function (error, response, body) {
    console.log("Fichier téléchargé !");
});
console.log("Je fais d'autres choses en attendant...");

La requête de téléchargement est lancée en premier. Ensuite, le programme fait d'autres choses (ici, il affiche un message dans la console, mais il pourrait faire n'importe quoi d'autre). Dès que le téléchargement est terminé, le programme va à la ligne 2 et affiche "Fichier téléchargé !".

Mais... Comment ça marche ? Je vois une fonction en paramètre de la fonction request ! C'est une fonction dans une fonction, au secours ils sont fous ! :waw:

Hola pas de panique. :p Ce que vous voyez là est une fonction de callback. En JavaScript on peut tout à fait envoyer une fonction en paramètre d'une autre fonction. Cela signifie ici : "Exécute cette fonction quand le téléchargement est terminé".

Ici, la fonction n'a pas de nom. On dit que c'est une fonction anonyme. Mais on pourrait décomposer ce code comme ceci, le résultat serait identique :

// Résultat identique au code précédent

var callback = function (error, response, body) {
    console.log("Fichier téléchargé !");
});

request('http://www.site.com/fichier.zip', callback);
console.log("Je fais d'autres choses en attendant...");

La fonction de callback est enregistrée dans une variable. Comme toutes les fonctions, elle n'est pas exécutée tant qu'on ne l'a pas appelée.
Ensuite, on envoie cette fonction de callback en paramètre de la fonction request() pour dire : "Dès que la requête de téléchargement est terminée, appelle cette fonction de callback".

En pratique, les développeurs JavaScript mettent régulièrement des fonctions anonymes directement à l'intérieur d'autres fonctions en paramètre, comme dans mon premier code. C'est un peu étrange au début mais on s'y fait vite !

Je ne vois pas pourquoi ça rendrait le programme plus rapide. J'ai l'impression que ça le rend surtout plus compliqué !

Je vous avais dit que Node.js n'était pas simple, mais le jeu en vaut la chandelle ! Vous allez comprendre pourquoi. Imaginez qu'on demande le téléchargement de 2 fichiers à Node.js :

var callback = function (error, response, body) {
    console.log("Fichier téléchargé !");
});

request('http://www.site.com/fichier.zip', callback);
request('http://www.site.com/autrefichier.zip', callback);

Si le modèle avait été bloquant, le programme aurait :

  1. Lancé le téléchargement du fichier 1, et attendu qu'il se termine...

  2. ... puis lancé le téléchargement du fichier 2, et attendu qu'il se termine.

Or, avec Node.js, les deux téléchargements sont lancés en même temps ! Le programme n'attend pas la fin du premier téléchargement pour passer à l'instruction suivante.

Du coup, le téléchargement des 2 fichiers au total va beaucoup plus vite puisque le programme fait les 2 à la fois :

En modèle non bloquant (comme Node.js), les 2 fichiers sont téléchargés en même temps et l'ensemble finit plus vite
En modèle non bloquant (comme Node.js), les 2 fichiers sont téléchargés en même temps et l'ensemble finit plus vite

Dans les applications web, il est courant d'avoir des opérations longues et bloquantes comme :

  • Les appels aux bases de données

  • Les appels à des services web (ex : l'API de Twitter)

Node.js nous évite de perdre du temps en nous permettant de faire d'autres choses en attendant que les actions longues soient terminées !

Exemple de certificat de réussite
Exemple de certificat de réussite