Quelles sont les nouvelles fonctionnalités de Node.js 22 ?

Node.js 22 est disponible depuis le 24 avril 2024 et sera la nouvelle version LTS à partir d'octobre :

Encore un nouveau compilateur dans le moteur V8 : maglev

L'équipe de Chrome continue d'améliorer les performances du moteur JavaScript V8, notamment utilisé par Node.js ou les navigateurs Chrome et Chrome mobile.

Un nouveau compilateur, appelé maglev, a été introduit dans le moteur V8 et Node.js en bénéficie donc depuis sa version 22.

Voici donc actuellement les différents compilateurs utilisés :

  • Ignition, l'interpréteur de base, compile tout le code JavaScript en bytecode et l'exécute.
  • Sparkplug intervient rapidement après Ignition pour compiler ce bytecode en code machine presque instantanément, offrant une amélioration significative des performances par rapport à Ignition seul.
  • Maglev se situe entre Sparkplug et TurboFan, générant du code plus optimisé que Sparkplug mais plus rapidement que TurboFan, permettant une transition en douceur vers des performances accrues sans le coût élevé en temps de compilation de TurboFan.
  • TurboFan, le compilateur optimisant le plus avancé, se concentre sur des performances maximales en utilisant les métadonnées d'exécution pour générer du code machine hautement optimisé.

Cette combinaison de technologies permet à Node.js, grâce à V8, de maximiser les performances à chaque étape d'exécution du code : Ignition pour la compilation initiale, Sparkplug pour une première optimisation rapide, Maglev pour des optimisations intermédiaires, et TurboFan pour des performances de pointe. Cette approche en plusieurs étapes garantit que le code JavaScript s'exécute aussi efficacement que possible, réduisant les temps de latence et améliorant la réactivité des application.

Voici les nouveaux benchmarks de performance partagés par l'équipe de Google chargé du V8 :

Exécution de scripts package.json avec Node.js

Node.js 22 introduit une nouvelle fonctionnalité qui permet d'exécuter directement des scripts définis dans le fichier package.json en utilisant la commande node --run <script-in-package-json>.

La commande node --run permet une exécution plus directe des scripts sans les étapes de configuration et de vérification que npm effectue. Cela peut conduire à des gains de performance, surtout dans des scénarios où les scripts doivent être exécutés fréquemment et rapidement, comme lors de tests unitaires ou de compilations de code en développement continu.

Le fichier package.json est un composant essentiel dans les projets Node.js, permettant de définir les dépendances, les scripts et les configurations du projet. Traditionnellement, les scripts définis dans package.json sont exécutés via des gestionnaires de paquets comme npm ou yarn, en utilisant des commandes telles que npm run <script>.

Avec Node.js 22, il est maintenant possible d'exécuter ces scripts directement en utilisant Node.js, ce qui offre une flexibilité supplémentaire et élimine la dépendance à des outils externes.

Voici un exemple de fichier package.json avec plusieurs scripts définis :

Pour exécuter les scripts définis dans le fichier package.json, vous pouvez désormais utiliser la commande suivante :

node --run start

Cette commande exécutera le script start défini dans le fichier package.json, qui lance index.js.

Mode watch stable

Le Mode watch a été déclaré stable, apportant une fonctionnalité essentielle pour les développeurs qui veulent automatiser le redémarrage de leurs applications lors de modifications de fichiers.

Le Mode watch est une fonctionnalité qui permet à Node.js de surveiller les modifications apportées aux fichiers dans un projet. Lorsque des changements sont détectés, le processus Node.js se redémarre automatiquement. Cela est particulièrement utile dans le développement, où les développeurs font fréquemment des modifications et souhaitent voir immédiatement les effets de ces changements sans avoir à redémarrer manuellement leur serveur.

Lorsqu'un développeur exécute Node.js avec le flag --watch, le processus surveille les fichiers spécifiés (par défaut, tous les fichiers du projet). Dès qu'un fichier est modifié, le processus redémarre, intégrant ainsi les nouvelles modifications.

Pour démarrer un fichier JavaScript en mode watch :

node --watch index.js

Nouvelles fonctions glob et globSync [expérimental]

Node.js 22 a introduit deux nouvelles fonctions dans le module fs : glob et globSync.

Ces fonctions permettent de rechercher et de faire correspondre des chemins de fichiers en utilisant des motifs spécifiques, simplifiant ainsi la gestion des fichiers dans des projets complexes.

Le glob matching est une méthode pour rechercher des fichiers en utilisant des motifs (glob patterns). Ces motifs peuvent inclure des caractères génériques, des séquences spécifiques et des chemins de répertoires pour spécifier les fichiers ou les répertoires à rechercher.

Par exemple, le motif *.js correspond à tous les fichiers JavaScript dans un répertoire, tandis que **/*.js correspond à tous les fichiers JavaScript dans le répertoire courant et tous ses sous-répertoires.

glob : La fonction glob est asynchrone et retourne une promesse qui se résout avec les chemins de fichiers correspondants.

globSync : La fonction globSync est synchrone et retourne directement les chemins de fichiers correspondants.

Ces deux fonctions facilitent grandement la gestion et la manipulation des fichiers, en particulier dans les projets où il est nécessaire de traiter de nombreux fichiers situés dans différentes hiérarchies de répertoires.

Par exemple :

Support pour require() des modules ESM synchrones [expérimental]

Node.js 22 introduit une nouvelle fonctionnalité expérimentale qui permet d'utiliser require() pour charger des modules ECMAScript (ESM) de manière synchrone, en utilisant le drapeau --experimental-require-module.

Cette fonctionnalité vise à simplifier la transition des modules CommonJS vers les modules ESM tout en maintenant une compatibilité avec l'ancien système de modules.

Traditionnellement, Node.js utilise le système de modules CommonJS, où les modules sont chargés avec require(). Cependant, avec l'adoption croissante des modules ECMAScript (ESM), il est devenu nécessaire de faciliter l'intégration des deux systèmes. ESM utilise import et export, et se charge de manière asynchrone par défaut, ce qui peut compliquer l'interopérabilité avec le code CommonJS existant.

La nouvelle fonctionnalité --experimental-require-module permet de charger des modules ESM de manière synchrone avec require(), à condition que :

  1. Le module ESM soit explicitement marqué comme tel avec un champ "type": "module" dans le fichier package.json le plus proche ou ait une extension .mjs.
  2. Le module ESM ne contienne pas de top-level await, c'est-à-dire qu'il soit entièrement synchrone.

Augmentation du High Water Mark des flux

Le High Water Mark est une limite qui détermine la quantité de données qu'un flux peut mettre en mémoire tampon avant de considérer qu'il est plein.

Dans Node.js, les flux (streams) sont des abstractions qui permettent de lire ou d'écrire des données de manière continue et progressive. Les flux sont largement utilisés pour gérer les opérations de lecture/écriture de fichiers, les communications réseau, et bien d'autres tâches de traitement de données.

En augmentant le HWM de 16KiB à 64KiB, Node.js 22 permet à un flux de mettre en mémoire tampon une plus grande quantité de données avant de signaler qu'il est plein. Cela signifie que le flux peut traiter plus de données à la fois, réduisant ainsi le nombre d'interruptions nécessaires pour gérer les tampons.

Un HWM plus élevé peut améliorer les performances des applications qui manipulent de grandes quantités de données. En réduisant la fréquence des opérations d'entrée/sortie (I/O), cette modification permet un traitement des données plus fluide et plus efficace. Cela est particulièrement bénéfique pour les applications nécessitant un traitement intensif des flux, comme le streaming vidéo, les transferts de fichiers volumineux, et les serveurs web à haut débit.

Optimisation du signal d'interruption AbortSignal

AbortSignal est une interface utilisée pour signaler l'annulation d'une opération asynchrone. Elle fait partie de l'API AbortController, qui permet aux développeurs d'annuler une ou plusieurs opérations asynchrones en cours, comme des requêtes HTTP, des opérations de lecture/écriture de fichiers, ou d'autres tâches longues.

L'interface AbortSignal fournit une manière de surveiller l'état de l'annulation et de déclencher des actions lorsque l'annulation se produit.

Node.js a optimisé la gestion de la mémoire associée aux instances de AbortSignal. Ces optimisations permettent de réduire la consommation de mémoire en minimisant le nombre d'objets et de ressources allouées pour chaque signal d'interruption. Cela est particulièrement bénéfique dans des environnements à haute performance et dans des applications avec des contraintes de mémoire.

Suivez notre formation Node.js dès aujourd'hui !