La version 21.0 de Node.js a été publiée, une plateforme pour exécuter des applications réseau en JavaScript. Le support de la branche Node.js 21.0 sera assuré pendant 6 mois. Dans les jours à venir, la stabilisation de la branche Node.js 20 sera achevée, qui obtiendra le statut LTS et sera supportée jusqu'en avril 2026. Le support de l'ancienne branche LTS Node.js 18.0 se poursuivra jusqu'en septembre 2025, tandis que celui de la branche LTS précédente 16.0 durera jusqu'en avril 2024.
Améliorations principales :
- L'API Fetch, destinée au téléchargement de ressources sur le réseau et facilitant l'écriture de code JavaScript universel adapté aux travaux côté serveur et client, a été annoncée comme stable. L'implémentation est basée sur le code du client HTTP/1.1 undici et se rapproche au maximum d'une API similaire fournie dans les navigateurs. L'API comprend la méthode fetch() et les objets Headers, Request et Response, représentant les en-têtes HTTP, la requête et la réponse. const res = await fetch('https://nodejs.org/api/documentation.json'); if (res.ok) { const data = await res.json(); console.log(data); }
- Le support de l'API WebStreams a été stabilisé, fournissant l'accès à des flux de données reçues via le réseau. L'API permet d'ajouter des gestionnaires qui traitent les données à mesure qu'elles arrivent via le réseau, sans attendre le téléchargement complet du fichier. Dans Node.js, des objets tels que ReadableStream*, TransformStream*, WritableStream*, TextEncoderStream, TextDecoderStream, CompressionStream et DecompressionStream sont disponibles.
- Une implémentation expérimentale du client WebSocket a été ajoutée, compatible avec les navigateurs.. Pour activer le support de WebSocket, un drapeau «—experimental-websocket» a été prévu.
- Un mode expérimental par défaut a été ajouté pour l'utilisation des modules JavaScript ESM (ECMAScript Modules, utilisé dans les modules pour navigateurs) au lieu de CommonJS (spécifique à Node.js). Ce changement n'affecte pas les modules dont le format est explicitement défini par le champ «type» dans package.json, spécifié par le drapeau «—input-type» ou évident en raison de l'extension de fichier (.mjs pour ESM, .cjs pour CommonJS). Ainsi, les modules qui ne sont pas explicitement définis comme CommonJS (par exemple, avec l'extension «.js») seront considérés comme des modules ESM lorsque le nouveau mode est activé. Un drapeau «—experimental-default-type» a été proposé pour activer les nouvelles configurations des modules.
- Le moteur V8 a été mis à jour vers la version 11.8, utilisée dans Chromium 118, qui a introduit le support de la méthode ArrayBuffer.prototype.transfer, de la possibilité de regrouper des tableaux (méthode groupBy) et des instructions de traitement de constantes WebAssembly (i32.add, i32.sub, i32.mul, i64.add, i64.sub et i64.mul).
- Le support de globalPreload a été interrompu, et il est maintenant recommandé d'utiliser les appels register et initialize pour configurer les modules.
- La fonction fs.writeFile a été enrichie de l'option « flush » pour forcer l'écriture des données sur le disque après chaque opération d'écriture.
- Les performances du code lié à l'analyse des URL, à l'API fetch, aux streams, à node:fs et à HTTP ont été améliorées.
- Un objet global navigator a été ajouté. Par exemple, pour obtenir des informations sur le nombre de cœurs CPU, vous pouvez utiliser la propriété navigator.hardwareConcurrency.
- Le paramètre « --test » prend désormais en charge les masques globaux pour choisir les tests à exécuter (par exemple, vous pouvez spécifier « --test **/*.test.js »).
- Le gestionnaire de paquets npm 10.2.0 et le parseur llhttp 9.1.2 ont été mis à jour.
- Le support de Visual Studio 2019 et des versions de macOS antérieures à 11.0 a été interrompu.
La plateforme Node.js peut être utilisée à la fois pour le soutien serveur des applications Web et pour la création de programmes réseau clients et serveurs traditionnels. Pour étendre la fonctionnalité des applications Node.js, une grande collection de modules a été préparée, où l'on peut trouver des modules avec implémentation. serveurs et des clients HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, des modules pour l'intégration avec divers frameworks web, des gestionnaires WebSocket et Ajax, des connecteurs vers des SGBD (MySQL, PostgreSQL, SQLite, MongoDB), des moteurs de templates, des moteurs CSS, des implémentations d'algorithmes cryptographiques et des systèmes d'authentification (OAuth), des parseurs XML.
Pour traiter un grand nombre de requêtes simultanées, Node.js utilise un modèle d'exécution de code asynchrone basé sur le traitement d'événements en mode non-bloquant et la définition de gestionnaires de rappel (callback). Il prend en charge plusieurs méthodes de multiplexage de connexions, telles que epoll, kqueue, /dev/poll et select. La bibliothèque libuv est utilisée pour le multiplexage de connexions, qui est une couche au-dessus de libev dans les systèmes Unix et de IOCP sous Windows. La création d'un pool de threads est gérée par la bibliothèque libeio, tandis que c-ares est intégré pour exécuter des requêtes DNS en mode non-bloquant. Tous les appels système bloquants sont exécutés dans le pool de threads et, comme les gestionnaires de signaux, transmettent leurs résultats via un canal anonyme (pipe). L'exécution de code JavaScript est assurée par l'utilisation du moteur V8 développé par Google (Microsoft développe également une version de Node.js avec le moteur Chakra-Core).
En essence, Node.js ressemble aux frameworks Perl AnyEvent, Ruby Event Machine, Python Twisted et à l'implémentation des événements en Tcl, mais la boucle d'événements dans Node.js est cachée par le développeur et rappelle le traitement des événements dans une application web fonctionnant dans un navigateur. Lors de l'écriture d'applications pour Node.js, il est nécessaire de prendre en compte les particularités de la programmation orientée événements, par exemple, au lieu d'exécuter « var result = db.query('select..'); » en attendant la fin du traitement et le traitement des résultats, Node.js utilise le principe d'exécution asynchrone, c'est-à-dire que le code est transformé en « db.query('select..', function (result) { traitement du résultat }); », permettant un transfert immédiat de contrôle vers le code suivant, tandis que le résultat de la requête sera traité à mesure que les données arrivent.
Source : opennet.ru
