Node.js v20 est maintenant disponible ! Le 18 avril 2023, elle a été rendue publique et peut désormais être utilisée par tous. Avec cette version, Node.js devrait être beaucoup plus sûr et plus performant.

Il est important de savoir que, comme il s’agit d’une version paire, il est prévu qu’elle devienne une version de support à long terme (LTS) en octobre 2023 et qu’elle soit supportée jusqu’en avril 2026. Cependant, l’équipe Node.js recherche activement les commentaires de la communauté afin d’identifier et de corriger les éventuels problèmes avant qu’elle ne soit promue en LTS.

Cette nouvelle version de Node.js apporte des mises à jour et des fonctionnalités passionnantes que les développeurs apprécieront certainement, telles que le modèle de permission expérimental, import.meta.resolve synchrone, un exécuteur de test stable, la mise à jour du moteur JavaScript V8 à la version 11.3, qui apporte des améliorations de performance et des corrections de bogues, et bien d’autres choses encore.

Dans cet article, vous explorerez les changements introduits dans Node.js v20, en fournissant un aperçu approfondi de ses nouvelles fonctionnalités et capacités.

Démarrer avec Node.js v20

L’installation de Node.js v20 est assez similaire à celle des autres versions de Node.js. Tout ce que vous avez à faire, c’est :

  1. Télécharger le paquet d’installation depuis le site officiel de Node.js.
  2. Une fois que vous avez téléchargé le programme d’installation, exécutez-le et suivez les instructions pour terminer le processus d’installation. Ce processus est assez simple, et il vous suffit d’accepter le contrat de licence et de cliquer sur le bouton « Suivant ».
  3. Redémarrer votre système/machine une fois le processus d’installation terminé pour vous assurer que tous les changements sont pris en compte.
  4. Vérifier votre installation de Node.js en exécutant la commande suivante :
node -v
Installation de Node.js v20
Installation de Node.js v20

Si vous voyez le numéro de version (v20.0.0), cela signifie que Node.js est installé correctement et que vous êtes prêt à commencer à travailler avec Node.js v20.

Quelles sont les nouveautés de Node.js v20 ?

Examinons les 5 principales mises à jour introduites dans cette version de Node.js. Ces fonctionnalités sont les suivantes :

Modèle de permission expérimental

L’introduction du modèle de permission expérimental dans Node.js v20 est un ajout significatif qui donne aux développeurs plus de contrôle sur l’accès à des ressources spécifiques pendant l’exécution.

Cette nouvelle fonctionnalité est utile lorsque la sécurité et l’utilisation des ressources sont critiques, comme dans un environnement de production.

Le modèle de permission offre plusieurs possibilités, notamment celle de restreindre l’accès au système de fichiers, aux processus enfants, aux threads travailleurs et aux modules natifs.

Les développeurs peuvent utiliser des drapeaux tels que --allow-fs-read, --allow-fs-write, et --allow-child-process pour spécifier quelles ressources sont accessibles. Pour activer ces drapeaux, les développeurs doivent utiliser le drapeau --experimental-permission en combinaison avec les autorisations nécessaires.

Voici un exemple d’utilisation du modèle de permissions pour autoriser l’accès en lecture et en écriture à l’ensemble du système de fichiers :

$ node --experimental-permission --allow-fs-read=* --allow-fs-write=* index.js

Les développeurs peuvent également utiliser le modèle de permissions pour spécifier l’accès à des dossiers et fichiers spécifiques. Par exemple, la commande suivante autorise l’accès en écriture au dossier /tmp/:

$ node --experimental-permission --allow-fs-write=/tmp/ --allow-fs-read=/home/index.js index.js

L’un des principaux avantages du modèle de permission est la possibilité d’exercer un contrôle plus granulaire sur l’accès au système de fichiers. Par exemple, les développeurs peuvent spécifier des chemins d’accès et des caractères génériques pour autoriser l’accès à des dossiers ou à des fichiers spécifiques.

$ node --experimental-permission --allow-fs-read=/home/user/* index.js

La commande ci-dessus autorise l’accès en lecture à tous les dossiers du répertoire /home/user/.

La propriété permission de l’objet processus peut également être utilisée pour vérifier si une permission spécifique a été accordée au moment de l’exécution. Par exemple, si vous souhaitez vérifier si votre processus Node.js a un accès en lecture à un dossier spécifique, /home/user/documents, vous pouvez utiliser le code suivant :

if (process.permission.has('fs.read', '/home/user/documents')) {
  console.log('Read access granted to /home/user/documents');
} else {
  console.log('Read access not granted to /home/user/documents');
}

En utilisant le modèle de permission, vous disposez d’un contrôle plus fin sur l’accès au système de fichiers de vos processus Node.js, ce qui peut conduire à une meilleure sécurité et à une utilisation plus efficace des ressources.

Il est essentiel de noter que le modèle de permission est encore expérimental et qu’il est susceptible d’être modifié dans les prochaines versions de Node.js. Il est conseillé de rester à jour avec la documentation du modèle de permission et de faire preuve de prudence lors de l’utilisation de ces fonctionnalités expérimentales.

Test Runner stable

Node.js v20 inclut une version stable du module test_runner qui permet aux développeurs de construire et d’exécuter des suites de tests JavaScript rapidement et facilement sans installer de dépendances supplémentaires.

Le gestionnaire de test stable comprend maintenant plusieurs blocs de construction, tels que describe, it/test, et des crochets, pour la création et la structuration des fichiers de test, ainsi que le mocking, le mode watch, et la possibilité d’exécuter plusieurs fichiers de test en parallèle à l’aide de la commande node --test.

Voici un exemple d’utilisation du moteur de test :

import { test, mock } from 'node:test';
import assert from 'node:assert';
import fs from 'node:fs';

mock.method(fs, 'readFile', async () => "Hello World");
test('synchronous passing test', async (t) => {
  // This test passes because it does not throw an exception.
  assert.strictEqual(await fs.readFile('a.txt'), "Hello World");
});

Le programme d’exécution des tests offre des rapporteurs de tests configurables et personnalisés via le drapeau --test-reporter, une couverture de test expérimentale via le drapeau --experimental-test-coverage et des capacités de mocking.

Bien qu’il ne soit pas destiné à remplacer les frameworks de test complets tels que Jest ou Mocha, le gestionnaire de test stable offre un moyen simple et rapide de créer des suites de tests. Il a été amélioré de manière significative depuis son introduction dans Node.js v19, et grâce aux tests et aux retours des utilisateurs finaux, il a été marqué comme stable dans Node.js v20.

Vous trouverez plus d’informations dans cette demande d’extension fusionnée.

Mise à jour du moteur JavaScript V8 vers la version 11.3

Le moteur JavaScript V8, qui alimente Node.js, a été mis à jour à la version 11.3 dans Node.js v20. Cette mise à jour permet d’améliorer les performances et d’introduire de nouvelles fonctionnalités de langage. Voici quelques-unes des nouvelles fonctionnalités de cette mise à jour :

  • String.prototype.isWellFormed et toWellFormed: Ces méthodes sont particulièrement utiles pour garantir un format de chaîne correct. Elles permettent de s’assurer que les chaînes saisies par l’utilisateur sont au bon format UTF-16, ce qui réduit les erreurs à l’ère des emojis.
  • Méthodes qui modifient les tableaux et les tableaux typés par copie : Cette méthode peut être utile pour créer des copies modifiées de tableaux sans affecter les données d’origine, ce qui est particulièrement utile lorsque vous devez conserver les données d’origine à des fins de comparaison ou autres.
  • Resizable ArrayBuffer et growable SharedArrayBuffer: offre une plus grande flexibilité, permettant une allocation de mémoire plus efficace.
  • RegExp v flag with set notation and properties of strings : ajoute des fonctionnalités pour les expressions régulières.
  • WebAssembly tail call : permet d’optimiser certains types d’appels de fonction.

Ces mises à jour témoignent de l’engagement continu de la communauté des développeurs de Node.js en faveur de l’amélioration des performances et des fonctionnalités.

Import.meta.resolve() synchrone

Dans Node.js v20, import.meta.resolve() a été introduit, ce qui facilite l’écriture de scripts qui ne sont pas sensibles à l’emplacement. Cette fonction renvoie de manière synchrone, comme dans les navigateurs, ce qui permet une exécution plus efficace.

Les crochets de résolution du chargeur d’utilisateurs peuvent toujours être définis comme une fonction asynchrone, mais import.meta.resolve() renverra toujours de manière synchrone pour le code de l’application même si des crochets de résolution asynchrones sont chargés.

Le comportement synchrone de import.meta.resolve() permet une exécution plus efficace du code, en particulier lorsqu’il s’agit de traiter de grandes quantités de données. En tant qu’auteur, vous pouvez définir les crochets de résolution comme des fonctions asynchrones ou synchrones, selon votre préférence. Le code de l’application s’exécutera toujours de manière synchrone, qu’il y ait ou non des crochets de résolution asynchrones chargés.

Applications expérimentales à exécutable unique (SEA)

Experimental Single Executable Applications (SEA) est une nouvelle fonctionnalité introduite dans Node.js v20 qui permet de regrouper votre application avec le binaire Node.js, permettant aux utilisateurs finaux de la distribuer et de l’exécuter sous la forme d’un seul fichier exécutable.

Il s’agit d’une demande de longue date de la part de la communauté, et l’équipe a affiné l’approche au cours de l’année écoulée.

Dans Node.js v20, la création d’une application exécutable unique nécessite l’injection d’un blob préparé par Node.js à partir d’une configuration JSON plutôt que l’injection du fichier JS brut.

Un blob est un fichier qui contient des données binaires, dans ce cas, préparées par Node.js, et il est injecté dans le binaire. Cette modification a été apportée pour permettre l’intégration de plusieurs ressources coexistantes dans la SEA, ce qui ouvre de nouveaux cas d’utilisation.

Voici un exemple de fichier sea-config.json:

{ 
      "main": "myscript.js", 
      "output": "sea-prep.blob" 
}

Lorsqu’il est exécuté avec la commande node --experimental-sea-config sea-config.json, le blob est écrit dans le fichier sea-prep.blob, qui peut ensuite être injecté dans le binaire.

La fonctionnalité SEA permet aux développeurs de distribuer des applications Node.js sans que les utilisateurs aient besoin d’installer Node.js. Cette fonctionnalité a été créée par Darshan Sen, qui a remporté le prix Outstanding Contribution from a New Arrival dans le cadre des JavaScriptLandia Awards à l’OpenJS World.

Microsoft, membre de la fondation OpenJS, étudie cette fonctionnalité comme moyen de réduire les attaques vectorielles et de renforcer l’architecture Node.js pour une meilleure expérience. Bien que la fonction SEA soit encore expérimentale, elle représente un nouveau développement passionnant pour la communauté Node.js.

Performances de Node.js

Node.js v20 est accompagné d’améliorations significatives de son runtime, avec un accent renouvelé sur les performances par l’équipe de performance Node.js nouvellement formée. Les améliorations comprennent des optimisations des parties centrales du moteur d’exécution, telles que URL, fetch(), et EventTarget.

L’une des améliorations notables est la réduction du coût d’initialisation de EventTarget, qui a été divisé par deux, ce qui permet un accès plus rapide à tous les sous-systèmes qui l’utilisent. En outre, les appels V8 Fast API ont été utilisés pour améliorer les performances d’API telles que URL.canParse() et les temporisateurs.

Un autre changement spécifique est l’inclusion de la version 2.0 mise à jour d’Ada, un analyseur d’URL rapide et conforme aux spécifications, écrit en C++.

Résumé

Dans cet article, vous avez découvert quelques-unes des principales fonctionnalités (expérimentales et stables) et améliorations apportées par Node.js v20, telles que les améliorations du moteur JavaScript V8, les performances, le gestionnaire de tests et l’introduction d’un modèle de permission expérimental, ainsi que les applications à exécution unique.

Il est important de savoir que Node.js v14 arrivera en fin de vie en avril 2023, il est donc conseillé de commencer à planifier la mise à niveau vers Node.js v18 (LTS) ou vNode.js 20 (bientôt LTS).

Vous souhaitez tester la dernière version de Node.js ? Vous pouvez le faire en déployant votre application Node.js sur Kinsta et en obtenant vos premiers 20 $ chez nous. Nous supportons déjà Node.js v20, ce qui signifie que vous pouvez tester ses nouvelles fonctionnalités et capacités dès aujourd’hui.

À vous de jouer ! Quelles sont les fonctionnalités ou les améliorations que vous trouvez les plus intéressantes dans Node.js v20 ? Y en a-t-il d’importantes que nous n’avons pas remarquées ? Faites-nous en part dans les commentaires.

Joel Olawanle Kinsta

Joel is a Frontend developer working at Kinsta as a Technical Editor. He is a passionate teacher with love for open source and has written over 200 technical articles majorly around JavaScript and it's frameworks.