Fonctionnement de Node.js

Effectué

Comme vous l’avez appris dans l’unité précédente, le runtime JavaScript Node.js est un wrapper autour d’un moteur JavaScript appelé V8. Étant donné que Node.js peut interpréter et exécuter du code JavaScript sur un ordinateur hôte en dehors d’un navigateur, le runtime dispose d’un accès direct aux E/S, au système de fichiers et au réseau du système d’exploitation. Cette unité explique comment Node.js gère les tâches entrantes.

Node.js est basé sur une boucle d’événements à thread unique. Ce modèle d’architecture gère efficacement les opérations simultanées. Concurrence fait référence à la capacité de la boucle d’événements à exécuter des fonctions de rappel JavaScript une fois d’autres travaux terminés.

Dans ce modèle d’architecture :

  • Un seul thread signifie que JavaScript n’a qu’une seule pile des appels et ne peut effectuer qu’une seule opération à la fois.
  • La boucle d’événements exécute le code, collecte et traite les événements, puis exécute les tâches subordonnées suivantes dans la file d’attente d’événements.

Un thread dans ce contexte est une séquence unique d’instructions programmées que le système d’exploitation peut gérer de manière indépendante.

Dans Node.js, les opérations d’E/S telles que la lecture ou l’écriture dans un fichier sur le disque, ou l’appel d’un réseau à un serveur distant, sont considérées comme des opérations bloquantes. Une opération de blocage bloque toutes les tâches suivantes jusqu’à ce que l’opération soit terminée avant que l’opération suivante puisse se poursuivre. Dans un modèle non bloquant, la boucle d’événements peut exécuter plusieurs opérations d’E/S en même temps.

Le nom boucle d’événements décrit l’utilisation du mécanisme « occupé-en attente » qui attend de façon synchrone qu’un message arrive avant de le traiter. L’exemple suivant illustre une implémentation de boucle d’événements :

while (queue.wait()) {
  queue.process();
}

Architecture de Node.js

Node.js utilise une architecture pilotée par les événements dans laquelle une boucle d’événements gère l’orchestration et un pool de workers bloque les tâches. La boucle d’événements permet à Node.js de gérer des opérations simultanées. Le diagramme suivant illustre le fonctionnement d’une boucle d’événements, à un niveau élevé :

Diagramme montrant comment Node.js utilise une architecture pilotée par les événements où une boucle d’événements gère l’orchestration et un pool de workers bloque les tâches.

Les phases principales d’une boucle d’événements sont les suivantes :

  • Minuteurs traite les rappels planifiés par setTimeout() et setInterval().
  • Rappels exécute les rappels en attente.
  • Interrogation récupère les événements d’E/S entrantes et exécute les rappels liés aux E/S.
  • Vérification permet d’exécuter les rappels immédiatement après la fin de la phase d’interrogation.
  • Fermeture des rappels ferme les événements (par exemple, socket.destroy()) et les rappels (par exemple, socket.on('close', ...)).

Node.js utilise le pool de Workers pour gérer les tâches bloquantes telles que les opérations d’E/S bloquantes et les tâches nécessitant beaucoup de ressources de processeur.

En résumé, la boucle d’événements exécute les rappels JavaScript inscrits pour les événements. Elle est également chargée de satisfaire les demandes asynchrones non bloquantes telles que les E/S réseau.

Performances

JavaScript peut produire les mêmes résultats de performances que les langages de bas niveau tels que C, en raison des améliorations de performances rendues possibles par le moteur V8. Node.js tire également parti de la nature unique pilotée par les événements de JavaScript qui rend la composition des tâches serveur rapide et performante.

Programmation asynchrone

Pour prendre en charge le puissant modèle de programmation basé sur les événements, Node.js dispose d’un ensemble intégré d’API d’E/S non bloquantes pour gérer les tâches courantes, telles que la manipulation de système de fichiers et de base de données. Ces API sont fournies par la bibliothèque libuv. Quand vous demandez à Node.js de lire le contenu d’un fichier à partir d’un disque, Node.js ne bloque pas l’attente de la préparation du disque et des descripteurs de fichiers. Au lieu de cela, l’interface d’E/S non bloquantes notifie Node.js lorsque le fichier est prêt. Les E/S non bloquantes fonctionnent de la même façon lorsque le navigateur notifie votre code qu’un événement de souris ou de clavier a été déclenché, ou lorsqu’une réponse XMLHttpRequest (XHR) est reçue à partir d’un point de terminaison distant.

Diagramme montrant l’ensemble intégré d’API d’E/S non bloquantes que Node.js utilise pour gérer les tâches courantes.

Installer et utiliser Node.js

Vous pouvez installer Node.js de plusieurs façons. Voici quelques-unes des options les plus courantes :

  • taller avec un exécutable : Le Node.js télécharge page à https://nodejs.org/en/download/ fournit des packages d’installation pour différents systèmes d’exploitation.

  • Installer via brew : Homebrew, ou brew, est un gestionnaire de packages populaire pour Linux et macOS.

  • Installer via NVM : Node Version Manager (nvm) vous aide non seulement à installer la version de Node.js souhaitée, mais également à gérer votre installation. L’option nvm n’est pas abordée dans cette section.

Examinons plus en détail les étapes requises pour télécharger et installer Node.js et vérifier la réussite de l’installation.

Installer avec un exécutable

Voici un extrait de la page d’installation disponible à l’emplacement de téléchargement https://nodejs.org/en/download/ :

Capture d’écran de la page d’installation de Node.js présentant les programmes d’installation et le code source disponibles.

Notez les différents programmes d’installation disponibles pour différents systèmes d’exploitation tels que Windows, macOS et Linux. Vous pouvez également télécharger deux versions de code source différentes :

  • LTS signifie « Long-Term Support » et est décrit comme étant « recommandé pour la plupart des utilisateurs ». LTS est destiné à une utilisation professionnelle où des mises à jour fréquentes peuvent ne pas être possibles ou ne sont pas souhaitables.

  • Actuel correspond au code source qui est en cours de développement. Des ajouts de fonctionnalités et des modifications avec rupture peuvent se produire. Le code doit adhérer à la gestion de versions sémantique.

Basez votre choix de version sur les exigences de votre entreprise. Par exemple, si vous mettez souvent à jour, la version actuelle peut être adaptée à votre cas.

Pour en savoir plus sur les différents types de versions, lisez la section Types de versions.

Installer via le gestionnaire de package brew sur Linux ou macOS

Si vous n’avez pas installé brew, exécutez cette commande dans votre terminal Linux ou macOS :

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

Une fois que vous avez téléchargé brew, entrez la commande suivante dans votre terminal pour démarrer l’installation :

brew install node

Cette commande télécharge tous les fichiers binaires nécessaires et installe Node.js sur votre système.

Vérifier l’installation

Une fois l’installation de Node.js terminée, exécutez la commande suivante dans votre terminal pour vérifier la réussite de l’installation :

node --version

La commande doit afficher la version actuelle au format suivant :

v[major version].[minor version].[patch version]

Les crochets [] dans cet exemple indiquent que les résultats peuvent varier en fonction de la version que vous avez installée sur votre système.