Quoi de neuf dans Node.js v20 (Test Runner, Permission Model, SEA, V8 JS Engine 11.3)

Publié: 2023-04-28

Node.js v20 est maintenant disponible ! Le 18 avril 2023, il a été rendu public et peut désormais être utilisé par tous. Avec cette version, Node.js devrait être beaucoup plus sécurisé et plus performant.

Il est important de savoir - puisqu'il s'agit d'une version paire, elle devrait devenir une version de support à long terme (LTS) en octobre 2023 et sera prise en charge jusqu'en avril 2026. Cependant, l'équipe Node.js recherche activement la communauté commentaires pour identifier et résoudre les problèmes avant qu'il ne soit promu à LTS.

Cette nouvelle version de Node.js apporte des mises à jour et des fonctionnalités intéressantes que les développeurs apprécieront sûrement, telles que le modèle d'autorisation expérimental, import.meta.resolve synchrone, un testeur stable, met à jour le moteur JavaScript V8 vers la version 11.3, apportant des améliorations de performances et des bugs. correctifs, et bien plus encore.

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

Premiers pas avec Node.js v20

L'installation de Node.js v20 est assez similaire aux autres versions de Node.js. Tout ce que vous avez à faire est de :

  1. Téléchargez le package d'installation à partir du site Web 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émarrez votre système/machine une fois le processus d'installation terminé pour vous assurer que toutes les modifications prennent effet.
  4. Vérifiez votre installation Node.js en exécutant la commande suivante :
 node -v
Vérifier l'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 correctement installé et que vous êtes prêt à commencer à travailler avec Node.js v20.

Node.js v20 est arrivé ! Découvrez le modèle d'autorisation, l'import.meta.resolve synchrone, l'exécuteur de test stable et d'autres fonctionnalités et mises à jour intéressantes ici ️ Cliquez pour tweeter

Quoi de neuf dans Node.js v20 ?

Explorons les 5 mises à jour majeures introduites avec cette version de Node.js. Ces fonctionnalités incluent :

Modèle d'autorisation expérimental

L'introduction du modèle d'autorisation expérimental dans Node.js v20 est un ajout important 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 d'autorisation est livré avec plusieurs capacités, notamment la restriction de l'accès au système de fichiers, child_process, worker_threads et les addons 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 indicateurs, les développeurs doivent utiliser l'indicateur --experimental-permission en combinaison avec les autorisations requises.

Voici un exemple d'utilisation du modèle d'autorisation 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 d'autorisation 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 d'autorisation 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 et des modèles de caractères génériques pour autoriser l'accès à des dossiers ou fichiers spécifiques.

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

La commande ci-dessus accorde un 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 autorisation 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 d'autorisation, vous disposez d'un contrôle plus précis 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 crucial de noter que le modèle d'autorisation est encore expérimental et peut changer dans les futures versions de Node.js. Il est conseillé de rester à jour avec la documentation du modèle d'autorisation et de faire preuve de prudence lors de l'utilisation de ces fonctionnalités expérimentales.

Testeur stable

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

Le lanceur de test stable comprend désormais plusieurs blocs de construction, tels que describe , it / test et hooks, pour la création et la structuration des fichiers de test, ainsi que la moquerie, le mode montre et la possibilité d'exécuter plusieurs fichiers de test en parallèle à l'aide du node --test commande node --test .

Voici un exemple d'utilisation de l'exécuteur 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 lanceur de test propose des reporters de test configurables et personnalisés via l'indicateur --test-reporter , une couverture de test expérimentale via l'indicateur --experimental-test-coverage et des capacités de simulation.

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

Plus d'informations peuvent être trouvées dans cette demande d'extraction fusionnée.

Moteur JavaScript V8 mis à jour vers 11.3

Le moteur JavaScript V8, qui alimente Node.js, a été mis à jour vers la version 11.3 dans Node.js v20. Cela améliore les performances et introduit de nouvelles fonctionnalités de langage. Certaines des nouvelles fonctionnalités de cette mise à jour incluent :

  • String.prototype.isWellFormed et toWellFormed : Ces méthodes sont particulièrement utiles pour garantir un format de chaîne correct. Cela permet de garantir que l'entrée de la chaîne utilisateur est au format UTF-16 correct, ce qui réduit les erreurs à l'ère des emojis.
  • Méthodes qui modifient Array et TypedArray par copie : cela peut être utile pour créer des copies modifiées de tableaux sans affecter les données d'origine, ce qui est particulièrement pertinent dans les cas où vous devez conserver les données d'origine à des fins de comparaison ou à d'autres fins.
  • Redimensionnable ArrayBuffer et évolutif SharedArrayBuffer : offre une plus grande flexibilité, permettant une allocation de mémoire plus efficace.
  • Indicateur RegExp v avec notation d'ensemble et propriétés des chaînes : ajoute des fonctionnalités pour les expressions régulières.
  • WebAssembly tail call : fournit un moyen d'optimiser certains types d'appels de fonction.

Ces mises à jour illustrent l'engagement continu de la communauté de développement Node.js à améliorer les performances et les fonctionnalités.

Importation synchrone.meta.resolve()

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, similaire au comportement du navigateur, permettant une exécution plus efficace.

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

Le comportement synchrone de import.meta.resolve() permet une exécution de code plus efficace, en particulier lorsqu'il s'agit de grandes quantités de données. En tant qu'auteur, vous pouvez définir les crochets de résolution en tant que fonctions asynchrones ou de synchronisation, selon vos préférences. Le code d'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)

Les applications exécutables uniques expérimentales (SEA) sont 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 en tant que fichier exécutable unique.

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 seule application exécutable nécessite l'injection d'un blob préparé par Node.js à partir d'une configuration JSON plutôt que d'injecter le fichier JS brut.

Un blob est un fichier qui contient des données binaires, dans ce cas, préparé 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 le SEA, ce qui ouvre de nouveaux cas d'utilisation.

Voici un exemple de fichier sea-config.jso :

 { "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 obliger les utilisateurs à installer Node.js. La 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 à OpenJS World.

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

Performance

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

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

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++.

Saviez-vous que Node.js v20 apporte un exécuteur de test stable et natif ? Il est temps de tester votre code plus efficacement ! Découvrez-le ️ Cliquez pour tweeter

Résumé

Dans cet article, vous avez appris certaines 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 test runner et l'introduction du modèle d'autorisation expérimental et 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).

Souhaitez-vous essayer la dernière version de Node.js ? Vous pouvez le faire en déployant votre application Node.js sur Kinsta et obtenez vos premiers 20 $ sur nous. Nous prenons déjà en charge Node.js v20, ce qui signifie que vous pouvez tester ses nouvelles fonctionnalités et capacités dès aujourd'hui.

Maintenant c'est ton tour! Quelles fonctionnalités ou améliorations trouvez-vous les plus intéressantes dans Node.js v20 ? Y en a-t-il d'importants que nous avons peut-être oubliés? Faites le nous savoir dans les commentaires.