Node.js 25.9 : L'API stream/iter Arrive Enfin en Expérimental

Node.js 25.9 : L'API stream/iter Arrive Enfin en Expérimental

lschvn5 min de lecture

Node.js 25.9.0 est sorti le 1er avril avec un ensemble d'ajouts qualité-de-vie, plusieurs en préparation depuis plus d'un an. Les fonctionnalités principales sont le nouveau module expérimental stream/iter et le flag CLI --max-heap-size, mais il y a plus à connaître.

stream/iter : Itération Asynchrone pour les Streams

Le nouveau module experimental/streams/iter (à promouvoir en stable dans une future version) ajoute deux fonctions :

  • stream.iter(readable) — retourne un itérateur asynchrone qui produit des chunks depuis un Readable stream
  • stream.consume(readable) — crée un writable stream qui draine un readable, utile pour les motifs de piping

L'effet pratique est que vous pouvez maintenant utiliser for await...of directement sur tout Readable stream Node.js :

import { iter } from 'node:experimental/streams/iter';
import { createReadStream } from 'node:fs';

for await (const chunk of iter(createReadStream('file.txt'))) {
  process(chunk);
}

Cela remplace le contournement Readable.from() que beaucoup de développeurs utilisaient pour faire le pont entre streams et itérables asynchrones. Readable.from() était conçu pour créer un stream depuis un itérable — l'utiliser comme consommateur de stream était toujours un bidouillage. La nouvelle API rend l'intention explicite et évite le double buffering de l'ancien pattern.

La fonction consume() est orientée vers la transformation de streams :

import { consume } from 'node:experimental/streams/iter';
import { createReadStream, createWriteStream } from 'node:fs';

const writable = createWriteStream('output.txt');
await consume(createReadStream('input.txt')).pipe(writable);

James M Snell, qui a implémenté la fonctionnalité, a aussi ajouté des benchmarks dans le même PR — l'API est conçue pour avoir un overhead minimal comparé à la consommation manuelle de streams.

--max-heap-size : Limites Mémoire Dures

Les processus Node.js ont toujours été soumis aux limites du tas V8, mais les fixer nécessitait des variables d'environnement (--max-old-space-size) ou des API programmatiques. --max-heap-size est un flag CLI simple :

node --max-heap-size=512 server.js

Contrairement à --max-old-space-size, qui ne contrôle que l'ancienne génération, --max-heap-size s'applique au tas total de V8 incluant la génération de code et la nouvelle génération. Cela le rend plus prévisible pour les workloads conteneurisés où vous voulez un plafond mémoire dur sur lequel l'orchestrateur peut s'appuyer.

Le flag a été proposé par tannal après plusieurs années de discussion avant d'atterrir.

AsyncLocalStorage Gagne les Using Scopes

AsyncLocalStorage est un pilier pour le contexte scoped par requête dans les frameworks web depuis Node.js 16. Le nouvel ajout est le support des using scopes — basé sur le proposal ECMAScript Explicit Resource Management stage 3 (le pattern Symbol.dispose).

Le mot-clé using appelle une méthode Symbol.dispose à la sortie d'un bloc, que ce soit normalement ou via une erreur. Avec la nouvelle API, vous pouvez lier une instance AsyncLocalStorage à un scope :

import { AsyncLocalStorage } from 'node:async_hooks';

const storage = new AsyncLocalStorage();

{
  using scope = storage.enable();
  storage.run({ requestId: 'abc123' }, () => {
    // storage.get() returns { requestId: 'abc123' }
  });
}
// storage is automatically cleared when scope exits

Cela élimine le besoin de nettoyage try/finally explicite dans de nombreux patterns. Dans les serveurs à haut débit qui créent de nombreuses instances de stockage éphémères, les using scopes préviennent la croissance illimitée du store AsyncLocalStorage.

Crypto : TurboSHAKE et KangarooTwelve

Le module crypto gagne deux nouvelles fonctions de hachage via l'intégration WebCrypto :

  • TurboSHAKE — sortie à longueur variable, adapté au hachage en streaming et aux applications de tree hashing
  • KangarooTwelve — hash 128 bits rapide, dérivé de SHA-3 conçu comme alternative plus rapide à SHA-256 pour les usages quotidiens

Ces fonctions sont disponibles via l'interface standard SubtleCrypto.digest() sous leurs noms d'algorithme respectifs.

Autres Changements Notables

  • Refonte du mocking du test runner : MockModuleOptions.defaultExport et MockModuleOptions.namedExports fusionnés en MockModuleOptions.exports unique, avec un codemod automatisé disponible
  • npm mis à jour en 11.12.1 : inclut les dernières fonctionnalités et correctifs de sécurité npm
  • SEA code cache pour ESM : les Applications Single Executable supportent maintenant le code caching pour les points d'entrée ESM, améliorant le temps de démarrage des applications Node.js packagées
  • module.register() deprecated : l'API legacy de registration de module est maintenant formellement dépréciée (DEP0205)

Node.js 25 est la ligne de version instable actuelle ; Node.js 24 deviendra le prochain candidat LTS plus tard cette année. La plupart de ces fonctionnalités seront backportées vers les lignes LTS à mesure qu'elles se stabilisent.

Questions fréquentes

Articles connexes

Plus de couverture avec des sujets et tags en commun.

JetStream 3 : Le Benchmark Qui Reflète Enfin le Fonctionnement des Apps Web Modernes
JavaScript

JetStream 3 : Le Benchmark Qui Reflète Enfin le Fonctionnement des Apps Web Modernes

WebKit, Google et Mozilla viennent de publier JetStream 3 — la première révision majeure du benchmark depuis 2019. Il abandonne les microbenchmarks au profit de workloads réalistes, refond le scoring WebAssembly, et introduit du Dart, Kotlin et Rust compilés en Wasm.
État de TypeScript 2026 : langage #1 sur GitHub, Project Corsa et la facture de la supply chain
npm

État de TypeScript 2026 : langage #1 sur GitHub, Project Corsa et la facture de la supply chain

Un regard rétrospectif sur les événements majeurs qui ont redéfini la position de TypeScript dans l'écosystème JavaScript — du dépassement de JavaScript sur GitHub à la réécriture du compilateur en Go pour des builds 10x plus rapides.
JSIR de Google : une représentation intermédiaire basée sur MLIR pour l'analyse JavaScript
JavaScript

JSIR de Google : une représentation intermédiaire basée sur MLIR pour l'analyse JavaScript

Google a open source JSIR, un nouvel outil d'analyse JavaScript basé sur MLIR. Il supporte à la fois l'analyse de flux de données de haut niveau et la transformation source-à-source sans perte — utilisé en interne pour la décompilation du bytecode Hermes et la désobfuscation JavaScript assistée par IA.

Commentaires

Connexion Connectez-vous pour participer à la conversation.

Pas encore de commentaires. Soyez le premier à partager vos pensées.