Node.js 25.9: Die stream/iter-API Landet Endlich als Experimentell

Node.js 25.9: Die stream/iter-API Landet Endlich als Experimentell

lschvn5 Min. Lesezeit

Node.js 25.9.0 erschien am 1. April mit einer Reihe von Quality-of-Life-Ergänzungen, von denen mehrere seit über einem Jahr in Arbeit waren. Die Hauptfunktionen sind das neue experimentelle stream/iter-Modul und das --max-heap-size-CLI-Flag, aber es gibt noch mehr zu wissen.

stream/iter: Asynchrone Iteration für Streams

Das neue Modul experimental/streams/iter (in einer zukünftigen Version zu stabil zu befördern) fügt zwei Funktionen hinzu:

  • stream.iter(readable) — gibt einen asynchronen Iterator zurück, der Chunks von einem Readable Stream liefert
  • stream.consume(readable) — erstellt einen Writable Stream, der einen Readable drained, nützlich für Pipe-Patterns

Der praktische Effekt ist, dass Sie jetzt for await...of direkt über jeden Node.js Readable Stream verwenden können:

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

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

Dies ersetzt den Readable.from()-Workaround, den viele Entwickler verwendeten, um Streams und async Iterables zu überbrücken. Readable.from() war zum Erstellen eines Streams aus einem Iterablen gedacht — es als Stream-Konsument zu verwenden, war immer ein Hack. Die neue API macht die Absicht explizit und vermeidet den Double-Buffering-Overhead des alten Patterns.

Die consume()-Funktion ist auf Stream-Transformationen ausgerichtet:

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, der die Funktionalität implementierte, fügte auch Benchmarks in derselben PR hinzu — die API ist darauf ausgelegt, minimalen Overhead im Vergleich zu manuellem Stream-Konsum zu haben.

--max-heap-size: Harte Speichergrenzen

Node.js-Prozesse waren schon immer an V8s Heap-Limits gebunden, aber diese zu setzen erforderte entweder Umgebungsvariablen (--max-old-space-size) oder programmatische APIs. --max-heap-size ist ein unkompliziertes CLI-Flag:

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

Anders als --max-old-space-size, das nur die alte Generation kontrolliert, gilt --max-heap-size für V8s gesamten Heap inklusive Code-Generierung und neuer Generation. Dies macht es vorhersehbarer für containerisierte Workloads, bei denen Sie eine harte Speicherobergrenze wollen, auf die sich der Orchestrator verlassen kann.

Das Flag wurde von tannal beigesteuert und hatte mehrere Jahre in der Diskussion, bevor es landete.

AsyncLocalStorage Bekommt Using Scopes

AsyncLocalStorage ist seit Node.js 16 ein Grundpfeiler für request-scoped Context in Web-Frameworks. Die neue Ergänzung ist die Unterstützung von using Scopes — basierend auf dem ECMAScript Explicit Resource Management Stage-3-Vorschlag (dem Symbol.dispose-Pattern).

Das using-Schlüsselwort ruft eine [Symbol.dispose]()-Methode beim Austritt aus einem Block auf, ob normal oder via Fehler. Mit der neuen API können Sie eine AsyncLocalStorage-Instanz an einen Scope binden:

import { AsyncLocalStorage } from 'node:async_hooks';

const storage = new AsyncLocalStorage();

{
  using scope = storage.enable();
  storage.run({ requestId: 'abc123' }, () => {
    // storage.get() gibt { requestId: 'abc123' } zurück
  });
}
// Speicher wird automatisch bereinigt, wenn Scope endet

Dies eliminiert das Bedürfnis nach explizitem try/finally-Cleanup in vielen Patterns. In Hochdurchsatz-Servern, die viele kurzlebige Storage-Instanzen erstellen, verhindern Using Scopes das unbegrenzte Wachsen des AsyncLocalStorage-Stores.

Crypto: TurboSHAKE und KangarooTwelve

Das crypto-Modul erhält zwei neue Hash-Funktionen über die WebCrypto-Integration:

  • TurboSHAKE — variable Länge, geeignet für Streaming und Tree-Hashing-Anwendungen
  • KangarooTwelve — schneller 128-Bit-Hash, ein SHA-3-Abkömmling als schnellere Alternative zu SHA-256 für alltägliche Anwendungsfälle

Diese sind über die Standard-WebCrypto-SubtleCrypto.digest()-Schnittstelle unter ihren jeweiligen Algorithmen-Namen verfügbar.

Weitere Bemerkenswerte Änderungen

  • Test-Runner-Mocking konsolidiert: MockModuleOptions.defaultExport und MockModuleOptions.namedExports zu MockModuleOptions.exports zusammengeführt, mit automatischem Codemod verfügbar
  • npm auf 11.12.1 aktualisiert: enthält die neuesten npm-Funktionen und Sicherheitsfixes
  • SEA Code Cache für ESM: Single Executable Applications unterstützen jetzt Code-Caching für ESM-Entry-Points, was die Startzeit von gebündelten Node.js-Anwendungen verbessert
  • module.register() deprecated: die Legacy-Registrierungs-API ist jetzt formell deprecated (DEP0205)

Node.js 25 ist die aktuelle instabile Versionslinie; Node.js 24 wird später dieses Jahr der nächste LTS-Kandidat. Die meisten dieser Funktionen werden auf LTS-Linien zurückportiert, sobald sie sich stabilisieren.

Häufig gestellte Fragen

Verwandte Artikel

Weitere Berichterstattung zu ähnlichen Themen und Tags.

JetStream 3: Der Benchmark, der Endlich die Realität Moderner Web-Apps Abbildet
JavaScript

JetStream 3: Der Benchmark, der Endlich die Realität Moderner Web-Apps Abbildet

WebKit, Google und Mozilla haben JetStream 3 veröffentlicht — die erste größere Überarbeitung der Benchmark-Suite seit 2019. Er verzichtet auf Microbenchmarks zugunsten realistischer Workloads, überarbeitet das WebAssembly-Scoring und führt Dart, Kotlin und Rust nach Wasm kompiliert ein.
Stand von TypeScript 2026: GitHubs #1-Sprache, Project Corsa und die Supply-Chain-Rechnung
npm

Stand von TypeScript 2026: GitHubs #1-Sprache, Project Corsa und die Supply-Chain-Rechnung

Ein Rückblick auf die großen Ereignisse, die TypeScripts Position im JavaScript-Ökosystem neu geformt haben — vom Überholen auf GitHub bis zum Go-basierten Compiler-Rewrite mit 10x schnelleren Builds.
Google JSIR: Eine MLIR-basierte Zwischenrepräsentation für JavaScript-Analyse
JavaScript

Google JSIR: Eine MLIR-basierte Zwischenrepräsentation für JavaScript-Analyse

Google hat JSIR quelloffen gemacht, ein neuartiges JavaScript-Analysewerkzeug auf MLIR-Basis. Es unterstützt sowohl hochrangige Datenflussanalyse als auch verlustfreie Quellcode-Transformation — intern genutzt für Hermes-Bytecode-Dekompilierung und KI-gestützte JavaScript-Deobfuskation.

Kommentare

Anmelden Melden Sie sich an, um an der Diskussion teilzunehmen.

Noch keine Kommentare. Seien Sie der Erste, der seine Gedanken teilt.