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 liefertstream.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.defaultExportundMockModuleOptions.namedExportszuMockModuleOptions.exportszusammengefü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.