Fleche retour aux articles de blogNodeJS : Le V8 du JavaScript

Mots clés :

web

"Node.js a été créé par Ryan Dahl en 2009. Son développement et sa maintenance sont effectués par l'entreprise Joyent. Dahl a eu l'idée de créer Node.js après avoir observé la barre de progression d'un chargement de fichier sous Flickr : le navigateur ne savait pas quel pourcentage du fichier était chargé et devait adresser une requête au serveur web. Dahl voulait développer une méthode plus simple. Le serveur web Mongrel de Ruby a été l'autre source d'inspiration pour Dahl. Dahl avait échoué dans plusieurs projets en C, Lua et Haskell, mais, quand le moteur V8 fut diffusé, il commença à s'intéresser à JavaScript. Même si son idée d'origine était d'utiliser des entrées et sorties non bloquantes, il en reviendra un peu dans son module système car cela provoque des problèmes de chargement de bibliothèques externes."

Voici la définition donnée par Wikipédia pour le NodeJS, mais nous ne sommes pas la aujourd'hui pour de la culture générale, mais pour résoudre la problématique suivante : Comment en quelques années, et avec l'essor du Javascript, NodeJS est-il devenu le meilleur ami de beaucoup de développeurs? Quels sont les secrets derrière l'efficacité et le potentiel illimité de cette technologie qui encore aujourd'hui n'a pas de concurrence directe ?

Nous allons voir à travers cet article comment le NodeJS est venu au monde, et comment la réflexion de son créateur et l'apport quotidien de la communauté open-source fédére aujourd'hui des millions de développeurs autour de cette technologie.

Création du NodeJS

Au-delà de son aspect performant et de la singularité de son fonctionnement asynchrone, NodeJS n’est pas sorti de nulle part : la construction d’un JRE (Environnement d'exécution JavaScript) d’une telle puissance se base sur plusieurs features lui permettant d’assurer une fiabilité lors de son utilisation mais aussi d’en faire une option rapide et efficace lors de l'exécution de plusieurs scripts/tâches par votre ordinateur :

  • Il est construit sur le moteur V8 de Google Chrome : Afin d'interpréter le code que l'on va écrire en JavaScript NodeJS se repose sur le moteur V8 qui équipe actuellement Chrome. Ce moteur a été amélioré grâce à la concurrence entre les navigateurs et permet de créer un script avec un langage familier tout en gardant un temps d'exécution optimal. Chromium, projet dont est issu le V8, est considéré aujourd'hui comme l'un des plus rapides et légers parmi les navigateurs populaires.
  • Un modèle basé sur le trigger d’événement : Le code que l'on va écrire va être basé sur un système d'évènement. Les objets que l'on va créer émettront des évènements lors de leur cycle de vie. Il sera ensuite possible de souscrire et d'écouter ces évènements afin d'effectuer des opérations spécifiques lorsqu'ils sont émis. C'est une méthode qui ressemble à celle que l'on utilise actuellement côté navigateur avec la méthode "addEventListener"
  • Un système asynchrone et non bloquant : Lors du déroulement d'un script il y a souvent des phases "d'attente" ou le script bloque en attendant une entrée ou une sortie. Pendant ce temps d'attente, le script ne fait rien et ne peut traiter de nouvelles tâches. Au sein de NodeJS la plupart de ces entrées/sorties vont se dérouler de manière asynchrone grâce à la librairie libuv. Ceci permet de gérer plus d'occurrences en évitant les phases d'attente.
  • Son propre écosystème : NodeJS dispose de son gestionnaire de paquets officiel NPM qui permet de télécharger et de partager des librairies. Il dispose d'une communauté très importante et d'un très grand nombre de paquets.

Avantages et inconvénients du NodeJs

Afin de comprendre plus en détail l’importance et la puissance du NodeJS, il est important de parler de plusieurs notions clés qui permettent de mieux assimiler la constitution du NodeJS : nous parlerons ici de RTA, de SPA, de Single Thread et Multi Thread et de systèmes Blocking et Non Blocking.

Alors déjà, c’est quoi RTA ?

RTA signifie “Real Time Applications”, littéralement les applications en temps réel, qui ont la particularité de devoir fréquemment effectuer des mises à jour et se renouveler.
Prenons un exemple : Les messageries instantanées telles que Messenger, whatsapp et autres Snapchat sont des RTA, en effet, il serait fâcheux pour l’utilisateur et pour l’entreprise de délivré un message plusieurs minutes après son envoi, et le nom de messagerie instantanée serait inapproprié .

Qu'est ce qu'une SPA ?

Ce sont les “Singles pages applications” ( et non, on ne parle pas de protection d’animaux ici malheureusement), autrement dit les pages codées en HTML avec un contenu dynamique, qui évoluerait en fonction de l’interaction de l’utilisateur avec cette même page. En général, on utilisera des frameworks comme Angular, Vue ou React pour créer ce genre d’applications web, c’est dire que le Javascript est omniprésent que l’on parle de front-end ou de back-end !

Multithread & Singlethead : Kesaco ?

Ces deux termes, utilisés très souvent dans la description du fonctionnement de NodeJS, sont la représentation de l'exécution des tâches : un processus multithread est un processus ou plusieurs actions seront possible en même temps, tandis qu’un single thread est au contraire un processus ou une seule action s’effectue à la fois.
Par exemple, un robot qui monte une voiture fonctionnera en single thread, il doit assembler pièce par pièce pour avoir un résultat final et ne peut pas monter la carrosserie et le moteur en même temps , alors qu’un super ordinateur peut effectuer plusieurs milliers de calculs en même temps et ne doit pas attendre que chaque calcul soit terminé pour lancer le prochain, c’est ce qu’on appelle un processus multithread

Blocking et Non-Blocking : that is the question

Littéralement bloquant et non bloquant , mais qu’est-ce que cela signifie pour un programme ?
Un système est considéré comme bloquant s’il est obligé d’attendre la fin d’une tâche avant de commencer celle d’après.
Alors qu’un système est non bloquant s’il a la capacité à lancer une tâche sans forcément attendre qu’elle se finisse pour passer à la suivante. Il pourra récupérer le résultat de la tâche quand elle sera finie et est indépendant du résultat de la tâche précédente/suivante.

Maintenant que nous avons assimilé et démystifié les différentes définitions que l’on pourrait rencontrer en parlant de NodeJS, parlons du rapport entre ces différents termes techniques et de notre JRE favori.

NodeJS : le Superman des environnements d'exécution

Super adapté aux RTA et SPA

Nodejs est un langage multithread à part entière, tout comme Java. Il y a deux threads dans Node. js, un thread est spécifiquement responsable de la boucle d'événement et l'autre est de l'exécution de votre programme
En effet, comment fonctionne Node.js ? Si un client 1 fait une requête d’un fichier au serveur, alors ce dernier lance cette requête sans attendre le résultat.
Il n’attend pas car il n’est pas bloquant. Si un autre client vient faire une autre requête, il est tout de suite capable de traiter cette requête également.
Au final , cela rend les processus beaucoup plus rapides pour les applications exécutant ce type de tâche à longueur de journée, car Node.js est capable de gérer énormément de requêtes en parallèle sans les faire attendre les unes les autres et c’est grâce à ça qu’il est particulièrement bien adapté aux SPA et RTA.
Les RTA font énormément de requêtes pour sans cesse mettre à jour les données de l’appli.
Et pour les SPA, la complexité du code réside souvent du côté client. Il n’y a pas généralement d’opérations complexes du côté serveur, les clients font pas mal de requêtes au serveur pour récupérer les données et le serveur se contente de procurer ces données pour alimenter l’appli.

Flexible

Node.js est très light comme plateforme et n’a pas beaucoup de fonctionnalités déjà intégrées :sa bibliothèque quasi infinie de modules et sa communauté travaillant au quotidien à l’enrichissement de ce langagefontt que les possibilités sont exponentielles et les limites sont (quasiment) celle du besoin et de l’imagination du développeur
La flexibilité est le maître mot du NodeJS , la possibilité pour chacun de piocher dans la ressource et de ne jamais être confronté à un manque de fonctionnalités, fait la différence comparée à certain langage avec une bibliothèque moins étoffée.
Pour finir, NodeJS dispose d’un écosystème très large de librairies open-source que nous pouvons utiliser directement dans tout projet avec le NPM (Node Package Manager). L’aspect communautaire est très important dans le monde du développement, et l’évolution quotidienne du NPM permet de (quasiment) tout le temps trouver une ressource, car elle a déjà manqué auparavant à un autre développeur, et que la solution est déjà présente pour vous.

Le NodeJS est un parent du Javascript

Comme nous avons pu le voir dans notre article sur le javascript, ce langage est très facile de compréhension tout en restant difficile à maîtriser ( comme tout autre langage), et NodeJS découle directement de ce langage assez familier pour le commun des développeurs, chevronnés et néophytes, un autre gage de qualité et de fiabilité pour tout utilisateur désirant se lancer dans l’apprentissage du NodeJS
Point clé supplémentaire, le Javascript étant un langage alliant front-end et back-end, la plupart des développeurs full-stack sont friand de cette technologie, qui en plus d’avoir un aspect pratique et performant, permet de travailler simultanément sur les deux faces du process sans avoir à jongler entre deux ou plusieurs langages.

Même convention de code, même bonne pratique, le NodeJS ne dépayse aucunement de son parent le JavaScript, un argument de taille lors du choix d’un langage de programmation pour un projet nécessitant une appréhension en 360 des enjeux finaux.

Exemple : Hello Word !

Quoi de mieux qu’un classique “Hello World” pour voir la simplicité et le potentiel du NodeJS ?v




//Creation du serveur

const server = createServer((request, response) => {

   response.writeHead(200, {'Content-Type': 'text/plain'});

   response.end('Hello World\n');

});



server.listen(3000, () => console.log('Adresse du serveur : http://localhost:3000'));

Infographie : à quel point NodeJS est il présent dans notre navigation quotidienne ?

L’infographie suivante, réalisée par le site www.similartech.com, permet de comprendre l’influence du NodeJS et son positionnement vis-à-vis de technologies comme Symfony ou ASP.net

On peut voir que plusieurs sites que beaucoup d’entre nous utilisent au quotidien sont développés avec NodeJS : Twitter, le réseau social le plus utilisé au quotidien, Paypal, la solution appartenant à Elon Musk qui a révolutionné les transactions en ligne non-bancaires, ou encore Accuweather, site de météorologie populaire, qui est un parfait exemple de RTA ( Real Time Application) nécessitant une rapidité d’actualisation en continu. Au-delà des chiffres impressionnants ( 6.2 Milliards de visites mensuelles sur Twitter), on peut voir la polyvalence du NodeJS, et son utilisation pour plusieurs types d'activités : Réseaux sociaux, gestion financière, marketplace ...

Conclusion : NodeJS , inégalable

En un mot, Node.js est l'environnement de programmation incontournable qui peut être utilisé pour créer des applications à grande échelle qui doivent prendre en charge plusieurs requêtes simultanées, sans avoir peur de surcharger ses serveurs ou d'être à court de ressources côté back-end.

Polyvalence, potentiel illimité , flexibilité, les superlatifs ne manquent pas pour décrire le NodeJs, mais le plus important à retenir reste la performance : aucun JRE ou Framework n'offre aujourd'hui une rapidité d'exécution ou un panel de possibilité aussi grand que NodeJS aujourd'hui, et il va être très compliqué dans un futur proche de trouver une alternative viable.