écrit devant
Node.js 20 est sorti le 18 avril 2023 et entrera en support à long terme (alias version LTS) en octobre 2023. Nous pouvons le télécharger et l'expérimenter ici : https://nodejs.org/en/download/current/
Dans Node.js 20, il existe de nombreux nouveaux changements et points forts, notamment le nouveau modèle d'autorisation Node.js, la import.meta.resolve
version synchrone et stable test_runner
, le moteur V8 mis à niveau vers la version 11.3, etc.
amélioration des performances
Node.js 20 a effectué de nombreuses optimisations de performances pendant l'exécution, notamment URL
des modules, fetch()
des fonctions et EventTarget
des modules.
La surcharge d' initialisation EventTarget
est réduite de moitié et tous les sous-systèmes qui dépendent de ce module sont accessibles plus rapidement.
De plus, V8 Fast API
(une API pour les fonctions C d'appel rapide, voir ici pour plus de détails ) est également utilisée pour améliorer les performances des API telles que URL.canParse()
et les minuteries.
Dans le même temps, il sera Ada
mis à jour vers la version 2.0, qui est un C++
excellent analyseur d'URL écrit en , pour de meilleures performances d'analyse d'URL.
stream
Enfin, l'équipe de développement optimise également les performances des décodeurs , URL
, URLSearchParams
et string en refactorisant .
Nouveaux changements et faits saillants
modèle d'autorisation
Le modèle d'autorisations Node.js est actuellement encore une fonctionnalité expérimentale et est utilisé pour restreindre l'accès à des ressources spécifiques pendant l'exécution. Plus précisément, il comprend les fonctions suivantes :
- Utilisation
--allow-fs-read
et--allow-fs-write
restriction d'accès au système de lecture et d'écriture de fichiers - Utiliser
--allow-child-process
un accès restreint à child_process - Utiliser
--allow-worker
un accès restreint à worker_threads --no-addons
L'accès aux plugins natifs est limité à l'aide
En introduisant --allow-fs-read
et --allow-fs-write
, les développeurs Node.js ont plus de contrôle sur l'accès au système de fichiers. Ces fonctionnalités expérimentales permettent un contrôle plus précis de l'accès au système de fichiers par les processus Node.js.
Pour activer ces indicateurs, les développeurs peuvent utiliser --experimental-permission
, suivi des autorisations requises. Par exemple, exécutez la commande suivante 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
Cette commande prend également en charge les modèles de caractères génériques, par exemple, la commande suivante autorise l'accès en lecture à tous les fichiers et dossiers /home/
du répertoire commençant par test :test
$ node --experimental-permission --allow-fs-read=/home/test* index.js
Les modèles de caractères génériques peuvent également être utilisés pour autoriser l'accès à plusieurs fichiers ou dossiers à la fois. Par exemple, la commande suivante autorise l'accès en lecture à tous les fichiers et dossiers du répertoire /home/ commençant par test :
$ node --experimental-permission --allow-fs-write=/tmp/ --allow-fs-read=/home/index.js index.js
Lorsque le modèle d'autorisations est activé, vous pouvez utiliser process.permission
pour vérifier les autorisations.
process.permission.has("fs.write"); // true
process.permission.has("fs.write", "/home/nodejs/protected-folder"); // true
Documentation détaillée : https://nodejs.org/api/permissions.html#process-based-permissions
PR associé : https://github.com/nodejs/node/pull/44004
Le chargeur ESM est sur le point d'entrer dans la phase stable
Dans Node.js, nous pouvons charger le module ESM via ESM loader
le crochet de cycle de vie, qui est ce formulaire. --experimental-loader=./foo.mjs
Et maintenant, Node.js 20 prend en charge l'exécution de modules chargés dans un thread dédié isolé du thread principal. Cela fournit une portée distincte pour les modules chargés et garantit qu'il n'y a pas de contamination croisée entre les modules chargés et le code d'application. De plus, pour être cohérent avec le comportement du navigateur, import.meta.resolve()
la valeur par défaut est désormais de revenir de manière synchrone.
Ce sont ESM loader
les derniers changements en suspens avant d'entrer dans la phase stable. Lorsque les changements ci-dessus seront stables, l'officiel marquera ces fonctions comme stables. Cela jette les bases d'une utilisation plus large des applications ESM par Node.js.
PR connexe : https://github.com/nodejs/node/pull/44710
Moteur V8 version 11.3
Node.js 20 a mis à niveau le moteur V8 vers 11.3 (partie de Chromium 113). Le nouveau moteur apporte les nouvelles fonctionnalités suivantes :
- Soutien
String.prototype.isWellFormed
ettoWellFormed
.isWellFormed
Utilisé pour vérifier si la chaîne est un Unicode légal ettoWellFormed
convertira une chaîne en Unicode.
- Fournit des fonctions qui modifient Array et TypedArray et renvoient une copie du tableau muté.
- Les fonctions existantes
Array.prototype
etTypedArray.prototype
modifient directement le tableau reçu. Au lieu de cela, la nouvelle fonction renvoie une copie modifiée du tableau reçu, laissant le tableau d'origine inchangé. Ces nouvelles fonctions sont utiles dans les styles de programmation où les données sont immuables.
- Les fonctions existantes
- Redimensionnable ArrayBuffer et Growable SharedArrayBuffer.
- Les expressions régulières prennent en charge
v
les indicateurs et+
les extensions.- Cette modification ajoute des opérations d'ensemble sur les chaînes, les littéraux de chaîne et les propriétés Unicode aux expressions régulières. Avec ces modifications, les développeurs peuvent utiliser des expressions régulières pour faire correspondre des chaînes avec des caractères Unicode spécifiques.
- Exemple : utiliser
/[\p{Script_Extensions=Greek}&&\p{Letter}]/v
pour correspondre à toutes les lettres grecques.
- Appels de queue WebAssembly.
PR connexe : https://github.com/nodejs/node/pull/47251
Le module Test Runner est entré dans la phase stable
test_runner
Le module est entré dans la phase stable dans Node.js 20. Il est principalement utilisé pour écrire et exécuter des fichiers de test, notamment :
describe
//it
fonctionstest
et crochets pour les fichiers de test.- fausses données.
- Surveiller le mode de changement de fichier (mode montre).
node --test
Prend en charge l'exécution de plusieurs fichiers de test en parallèle.
Voici test_runner
un exemple de fichier test utilisé :
import {
test, mock } from "node:test";
import assert from "node:assert";
import fs from "node:fs";
mock.method(fs, "readFile", async () => "Hello ZY");
test("synchronous passing test", async (t) => {
// This test passes because it does not throw an exception.
assert.strictEqual(await fs.readFile("zy.txt"), "Hello ZY");
});
PR connexe : https://github.com/nodejs/node/pull/46983
Le blob doit être transmis lors de la préparation d'une seule application exécutable
Les applications exécutables uniques (SEA) font référence aux programmes qui peuvent être exécutés directement dans le système d'exploitation sans dépendre de l'environnement Node.js. Généralement, les développeurs choisiront pkg
, boxednode
et d'autres solutions communautaires pour empaqueter une application Node.js dans un fichier exécutable. Node.js a créé une équipe associée en 2022 pour fournir une solution officielle de génération SEA. Pour l'instant, les fonctions liées au SEA sont encore des fonctions expérimentales .
Dans Node.js 20, la création d'une seule application exécutable nécessite désormais l'injection d'un blob préparé par Node.js à partir d'une configuration JSON au lieu de fichiers JS bruts, une modification permettant d'intégrer plusieurs ressources partagées dans SEA.
Par exemple:
mer-config.json
{
"main": "hello.js",
"output": "sea-prep.blob"
}
Cela écrira le blob dans un fichier sea-prep.blob
.
$ node --experimental-sea-config sea-config.json
De cette façon, ce blob peut être injecté dans le binaire.
PR connexe : https://github.com/nodejs/node/pull/47125
API de chiffrement Web
Dans Node.js 20, les paramètres de fonction de l'API Web Crypto sont modifiés selon la norme WebIDL, afin qu'ils soient alignés avec d'autres implémentations de l'API Web Crypto telles que les navigateurs. Cela améliore encore l'interopérabilité de l'API Web Crypto de Node.js avec d'autres implémentations.
PR connexe : https://github.com/nodejs/node/pull/46067
Prend en charge les fenêtres ARM64
Node.js prend en charge tellement de plates-formes et d'architectures que les développeurs s'attendent à ce qu'il fonctionne dans n'importe quel environnement. La bonne nouvelle est que Node.js 20 prend désormais en charge l'exécution sur ARM64 Windows !
PR connexe : https://github.com/nodejs/node/pull/47233
Nouveaux développements dans WASI (Web Assembly System Interface)
Bien que les fonctionnalités liées à WASI soient encore expérimentales dans Node.js , dans Node.js 20, nous n'avons plus besoin d'utiliser les options de ligne de commande pour activer WASI. De plus, new WASI()
lors de l'instanciation d'un objet WASI, un version
paramètre doit être passé par défaut pour clarifier sa version correspondante.
Mettre à jour Node.js
Node.js 14 arrivera en fin de vie en avril 2023, et Node.js 16 (LTS) arrivera en fin de vie en septembre 2023.
Il est donc temps de commencer à penser à mettre à jour Node.js vers Node.js 18 (LTS) ou Node.js 20 (bientôt LTS) !