Node.js 26.4.0 'Current' bringt das node:vfs-Subsystem (Matteo Collina), ESM-Loader-Package-Maps (Maël Nison), TLS-Zertifikatkompression, TCP_KEEPINTVL/TCP_KEEPCNT und argon2 als stabil

Node.js 26.4.0 'Current' bringt das node:vfs-Subsystem (Matteo Collina), ESM-Loader-Package-Maps (Maël Nison), TLS-Zertifikatkompression, TCP_KEEPINTVL/TCP_KEEPCNT und argon2 als stabil

lschvn

Node.js 26.4.0 'Current', veröffentlicht am 2026-06-24 um 23:38 UTC von @aduh95 mit @aduh95, @targos und @jasnell als Release-Stewards, ist die zweite Current-Release im Juni auf der v26-Linie und die größte des Zyklus seit 26.3.0 am 2026-06-01. Sie liefert acht SEMVER-MINOR-Änderungen: ein minimales node:vfs-Subsystem (Matteo Collina) plus ein Folgepatch, das node:fs/promises an eingehängte VFS-Instanzen weiterleitet (PR #63537), Package-Maps für ESM-Loader-Hooks (Maël Nison, der Yarn-Erfinder), TLS certificateCompression oberhalb der OpenSSL-Kompressionsarbeit (Tim Perry), TCP_KEEPINTVL und TCP_KEEPCNT in net.Socket.setKeepAlive (Guy Bedford), vom Aufrufer bereitgestellte Buffer in fs.readFile (PR #63634, Matteo Collina), closeIdleConnections, das nun auch Pre-Request-Sockets schließt (PR #63470, semimikoh), net.BlockList auf Release-Candidate-Stabilität vorgerückt (PR #63050), und crypto.argon2 sowie crypto.encap / crypto.decap als stabil markiert (PR #63924, Filip Skokan).

Die Release landet zwei Tage nach Node.js 24.18.0 'Krypton' (LTS) am 2026-06-23, und das Timing folgt dem üblichen Muster: Die Current-Linie trägt die experimentelle Arbeit, die irgendwann in LTS zurückportiert wird. Der Buffer.poolSize-64-KiB-Default ist das kanonische Beispiel, das auf Current in 26.3.0 am 2026-06-01 und auf LTS in 24.18.0 vor zwei Tagen ausgeliefert wurde. Das VFS-Subsystem, die Package-Maps für ESM-Loader und die TLS-Zertifikatkompression sind Arbeit derselben Art: bedeutsam genug, um ihre eigene Current-Release zu verdienen, aber noch experimentell genug, um die v24-LTS-Linie nicht vor mindestens einem weiteren Zyklus zu erreichen.

node:vfs, ein neues Kernsubsystem

Die architektonisch bedeutsamste Änderung in 26.4.0 ist das neue node:vfs-Subsystem. Die PR #63115 (Matteo Collina) ergänzt eine minimale In-Process-VFS-Schicht, die vom Anwendungscode zur Laufzeit ein- und ausgehängt werden kann. Das Subsystem legt vier Funktionen offen: mount(prefix, vfsInstance), unmount(prefix), getMount(prefix) und getMounts(). Die vfsInstance ist ein JavaScript-Objekt, das eine kleine Async-Schnittstelle implementiert (readFile, stat, readdir, plus eine Handvoll weiterer), und Node.js leitet node:fs/promises-Aufrufe, deren Pfad mit dem eingehängten Präfix beginnt, an die Instanz statt an das Betriebssystem-Dateisystem weiter.

Das Folgepatch PR #63537 (Matteo Collina) verkabelt die Schicht direkt in node:fs/promises. Ein readFile('/vfs/project/src/index.ts')-Aufruf auf einem Präfix, der mit einer In-Memory-VFS-Instanz eingehängt wurde, die den Projektbaum enthält, gibt die In-Memory-Inhalte zurück, ohne die Festplatte anzufassen. Die Integration ist das laufzeitseitige Fundament für gesandboxte Ausführung: Build-Werkzeuge können einem Loader ein virtuelles Dateisystem übergeben, das den Projektbaum enthält, Serverless-Plattformen können einem Request-Handler ein virtuelles Dateisystem übergeben, das nur den Request-Scope enthält, IDE-Spracheserver können einer Debugger-Sonde ein virtuelles Dateisystem übergeben, das die zu debuggende Datei enthält. Produktionsnutzer auf der v24-LTS-Linie werden dies nicht vor mindestens einem Release-Zyklus sehen, aber die Current-Linie hat nun die Primitive, auf der die nächste Runde Werkzeug-Arbeit aufsetzen wird.

Die VFS-Instanz-Schnittstelle ist in diesem ersten Schnitt bewusst minimal. Die PR-Beschreibung ist explizit, dass Symlinks, File-Watching und Real-Path-Auflösung außerhalb des Scopes liegen und in späteren Current-Releases landen werden. Die zugehörige Dokumentations-PR beschreibt die Oberfläche als „das kleinste tragfähige VFS, das es uns erlaubt, ad-hoc-fs-Monkey-Patching in Werkzeugen zu ersetzen", und merkt an, dass die API mindestens einen Current-Zyklus durchlaufen wird, bevor sie für die Stabilisierung kandidiert.

Package-Maps für ESM-Loader-Hooks

Die zweite architektonische Änderung ist die PR #62239 (Maël Nison), die Package-Maps für die ESM-Loader-Hooks implementiert. Die Runtime hat bereits eine imports-Map im package.json-Stil, die es dem Anwendungsgraphen erlaubt, Bare-Spezifier (#internal/api, lodash/sortBy, react/jsx-runtime) aufzulösen; Loader-Hooks mussten den Map-Lookup zuvor selbst neu implementieren, weil die Auflösung intern zum Module-Loader erfolgte. Die neue API legt dieselbe Auflösung als erstklassigen Aufruf auf den Loader-Hooks offen, sodass ein Loader, der wissen muss, ob ein Spezifier zu einem remappten Pfad (oder zu einem Subpfad) aufgelöst wird, das Ergebnis direkt lesen kann, ohne die package.json selbst zu durchlaufen.

Für Build-Werkzeug-Autoren ist das das fehlende Stück, um Node.js-kompatible Import-Maps oberhalb eines Bundlers zu implementieren. Die Import-Map-Spec definiert bereits das Drahtformat, und die Browser-Implementierungen liefern Import-Maps seit Jahren aus. Node.js hatte das zugrundeliegende imports-Feld über denselben Zeitraum, aber die Loader-Hooks-API legte nie den Auflösungspfad offen, den die Host-Runtime verwendete; Loader-Autoren mussten die package.json durchlaufen und die Map neu implementieren. Maël Nison, der den Package-Manager Yarn authored hat und Hauptbeitragender zum Yarn-resolutions-Mechanismus war, ist der richtige Autor für diese Arbeit, und die PR ist das erste Mal, dass die ESM-Loader-Hooks die Package-Map-Maschinerie als erstklassige API freilegen.

Die PR-Beschreibung rahmt es als die Loader-Hooks-Seite derselben Import-Map-Arbeit, die Vite 8.1s build.chunkImportMap auf der Build-Output-Schicht ausliefert (behandelt in unserem Vite-8.1-Stable-Artikel). Vite 8.1s chunkImportMap ist eine Bundler-seitige Funktion, die eine Browser-Import-Map für die Chunk-URL-Auflösung emittiert; die Loader-Package-Maps von 26.4.0 sind die Host-Runtime-Seite, die ein Bundler konsumieren würde, wenn er unter Node.js läuft. Die beiden Stücke sind unabhängig nützlich, sitzen aber auf unterschiedlichen Schichten desselben Stacks.

TLS-Zertifikatkompression

Die dritte SEMVER-MINOR-Änderung ist die PR #62217 (Tim Perry), die eine certificateCompression-Option zu tls.createSecureContext und https.Server ergänzt. Die Option nimmt ein Array von Kompressionsalgorithmen ('zlib' und 'zstd') entgegen, und die PR verkabelt die RFC 8879-Erweiterung durch die OpenSSL-Build-Konfiguration, sodass die Kompressionsprimitiven in das Node.js-Binary gelinkt werden. Der zugehörige Commit e44b5d487e aktualisiert die OpenSSL-Build-Konfiguration zur Unterstützung der Kompression; ohne das wäre der OpenSSL-seitige Support nicht auf der Node.js-TLS-Schicht verfügbar.

TLS-Zertifikatkompression ist vor allem dann nützlich, wenn die Kette eine große Post-Quanten-Signatur enthält, was derselbe Grund ist, aus dem Chrome und Firefox sie im letzten Jahr ausgerollt haben. Server, die sie auf einer Kette aktivieren, die eine ML-DSA-65- oder ML-DSA-87-Signatur enthält (die primären NIST-FIPS-204-Signaturen), sollten einen merklich kürzeren TLS-Handshake sehen. Die PR ist auch das erste Mal, dass der OpenSSL-Build-Pfad dieselbe TLS-Oberfläche freilegt, die der BoringSSL-Pfad bereits unterstützt, was bedeutet, dass ein einzelnes Node.js-Binary dieselbe certificateCompression-Option bedienen kann, unabhängig davon, mit welchem TLS-Backend es gebaut wurde.

TCP_KEEPINTVL und TCP_KEEPCNT in setKeepAlive

Die vierte SEMVER-MINOR-Änderung ist die PR #63825 (Guy Bedford), die TCP_KEEPINTVL und TCP_KEEPCNT zu den von net.Socket.setKeepAlive(enable, initialDelay) akzeptierten Optionen ergänzt. Vor 26.4.0 akzeptierte setKeepAlive nur das Initial-Delay-Argument, und das Intervall zwischen Probes sowie die Anzahl der Probes, bevor die Verbindung als tot deklariert wurde, waren OS-Defaults. Unter Linux sind die Defaults 75 Sekunden zwischen Probes und 9 Probes bis zum Abbruch, was bedeutet, dass eine halboffene Verbindung ~11 Minuten überlebt; unter macOS sind die Defaults ähnlich. Bibliotheksautoren (Datenbanktreiber, Message-Broker, Edge-Runtimes, QUIC-Clients) konnten diese Werte nicht tunen, ohne auf ein natives Modul zurückzugreifen.

Mit den neuen Optionen kann der Anwendungscode das Probe-Intervall auf wenige Sekunden und die Anzahl auf eine kleine Zahl verkürzen, was die Konfiguration ist, die Produktions-Datenbanktreiber seit Jahren wollten. Die zugehörige PR #63951 (Guy Bedford) ergänzt net.BoundSocket, eine synchrone Primitive für frühes TCP-Binding für Codepfade, die einen Port binden müssen, bevor sie an die Event-Loop yielden. Die beiden Stücke sind die ersten substantiellen net-Änderungen auf der v26-Current-Linie und gehören zur selben Familie wie die TCP-Keep-Alive-Arbeit, die die Node.js-24.18.0-LTS-Linie ausgeliefert hat.

Crypto-Stabilisierung, QUIC, dgram und FFI

Die übrigen fünf SEMVER-MINOR-Stücke vervollständigen das Bild. Die PR #63924 (Filip Skokan) markiert crypto.argon2 (Argon2id, Argon2i, Argon2d) und crypto.encap / crypto.decap (Key-Encapsulation für ML-KEM und RSA-OAEP) als stabil. Beide standen seit dem 22.x-Zyklus hinter einem experimentellen Flag, und die Stabilisierung ist die Voraussetzung dafür, dass Bibliotheken ohne die Flags davon abhängen können. Die Release ergänzt außerdem WebCrypto-cSHAKE-Unterstützung (PR #63988, Filip Skokan), was die Web-Crypto-cSHAKE-Arbeit erweitert, die auf der v24-Linie ausgeliefert wurde.

net.BlockList rückt in den Release-Candidate-Status (PR #63050, alphaleadership), der letzte Schritt vor stabil in der nächsten Current-Release. Auf der QUIC-Seite ergänzt die PR #63536 (James M. Snell) eine listEndpoints-API, und die PR #63191 (Tim Perry) ändert den Zertifikats-Accessor so, dass er einen X509Certificate-Handle statt des rohen OpenSSL-Handles zurückgibt. dgram erhält synchrone connectSync und bindSync (PRs #63838 + #63932, Guy Bedford).

Die experimentelle Fast-FFI-Arbeit (PR #63068 + PR #63941, Paolo Insogna) landet für AArch64 und x86_64, wobei die Folge-PR #63794 (Stewart X. Addison) dieselbe Maschinerie auf riscv64 portiert. Der Pfad ist hinter --experimental-ffi verborgen, und die API wird mindestens einen Current-Zyklus durchlaufen, bevor sie für die LTS-Linie kandidiert.

Weitere Änderungen in der 26.4.0

Die Release liefert einen langen Schweif kleinerer Änderungen. Die PR #63634 (Matteo Collina) ergänzt die Unterstützung vom Aufrufer bereitgestellter Buffer für fs.readFile und fs.readFileSync, das erste Mal, dass die File-Read-API es dem Aufrufer erlaubt, den Ziel-Buffer zu übergeben, statt Node.js intern allokieren zu lassen. Die PR #63470 (semimikoh) sorgt dafür, dass http.closeIdleConnections auch Pre-Request-Sockets schließt, was einen echten Bug behebt, bei dem inaktive Keep-Alive-Sockets eine Verbindung offenhielten, nachdem der Request, der sie besaß, abgeschlossen war.

npm liefert 11.17.0 (PR #63857), sqlite geht auf 3.53.2, libffi auf 3.6.0 (PR #64040), und acorn auf 8.17.0. Die Release markiert außerdem Node.js 25 als End-of-Life in der Dokumentation und liefert einen langen Stream-Optimierungspatch (Matteo Collina, James M. Snell, Trivikram Kamat), der Allokationen auf den WHATWG-Streams-Hot-Paths reduziert, den Utf8Stream-Stall nach einem vollständigen Schreibvorgang von Multi-Byte-Daten behebt und die stream/iter-Backpressure verfeinert. Die zugehörige PR #62986 behebt Writable.toWeb() desiredSize für Non-Object-Mode-Streams, ein langjähriger Bug, der immer dann auftauchte, wenn der WHATWG-Streams-Adapter mit einem binären Stream verwendet wurde.

Der vollständige Node.js-26-Release-Plan sieht die Current-Pflege bis Oktober 2026 vor, zu welchem Zeitpunkt v26 in Active LTS eintreten wird. Produktionsnutzer auf der v24-LTS-Linie sollten mindestens das nächste Quartal auf 24.18.0 bleiben (die Node.js-24.18.0-'Krypton'-LTS-Release, die wir vor zwei Tagen behandelt haben); der v24.19.0-Folgefix wird die experimentelle Arbeit aus 26.x Current aufnehmen, sobald sie sich stabilisiert.

Häufig gestellte Fragen

Verwandte Artikel

Weitere Berichterstattung zu ähnlichen Themen und Tags.

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

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

Node.js 25.9 fügt ein experimentelles stream/iter-Modul für asynchrone Iteration über Streams hinzu, ein --max-heap-size-CLI-Flag, AsyncLocalStorage mit Using-Scopes, TurboSHAKE-Krypto und npm 11.12.1.
Node.js 24.18.0 'Krypton' LTS bringt Buffer.poolSize auf 64 KiB, TurboSHAKE und KangarooTwelve in Web Crypto sowie http.writeInformation für beliebige 1xx-Codes
runtimes

Node.js 24.18.0 'Krypton' LTS bringt Buffer.poolSize auf 64 KiB, TurboSHAKE und KangarooTwelve in Web Crypto sowie http.writeInformation für beliebige 1xx-Codes

Node.js 24.18.0 'Krypton' (LTS), veröffentlicht am 2026-06-23, liefert den aus Node.js 26.3.0 bekannten Buffer.poolSize-Default von 64 KiB auf der LTS-Linie, ergänzt Web Cryptography um die RFC-9861-Algorithmen TurboSHAKE und KangarooTwelve (PR #62183, 1.521 Ergänzungen, 13 Dateien), führt http.writeInformation für beliebige 1xx-Statuscodes ein (PR #63155, 306 Ergänzungen, 7 Dateien), legt den Start der V8-Precise-Coverage in das JS-Laufzeitsystem (Commit 8c989ec4a3), ergänzt JWK-Import/Export für die Post-Quanten-Schlüsseltypen ML-KEM und SLH-DSA (PR #62706, 842 Ergänzungen, 39 Dateien), bindet im BoringSSL-Pfad ML-DSA, ML-KEM, ChaCha20-Poly1305 und AES-KW in Web Crypto ein (PR #63255), härtet WebCrypto gegen Prototype-Pollution (PR #63363), vereinheitlicht die Schlüsselargumentnamen von crypto.diffieHellman und akzeptiert Schlüsseldaten als Eingabe (PR #62527), nimmt das in 24.16.0 eingeführte Verhalten 'stream: noop pause/resume on destroyed streams' zurück (PR #63834) und veröffentlicht am selben Tag den Minimal-Hotfix 22.23.1, der eine in der Sicherheitsrelease v22.23.0 vom 18.06. eingeführte Änderung am HTTP-Agent zurücknimmt, die an inaktiven Agent-Sockets Stream-Listener angehängt hatte.
Bun integriert den React Compiler direkt in seinen Bundler, rund 20x schneller als das Babel-Plugin
tooling

Bun integriert den React Compiler direkt in seinen Bundler, rund 20x schneller als das Babel-Plugin

PR #32504, am 20. Juni 2026 in oven-sh/bun gemergt, macht den Upstream-Rust-Port des React Compilers zu einer eingebauten `bun build`-Transformation hinter `--react-compiler` und `Bun.build({ reactCompiler: true })`. Bun portiert den Upstream-Workspace `compiler/crates/` aus `facebook/react` direkt in eine einzelne Crate `src/react_compiler/` (~62k LOC), anstatt den Weg über Babel, SWC oder Oxc zu gehen, und in einer großen React-Codebasis (rund 860 Komponenten, 1400 Memo-Slots) läuft der Compiler-Durchlauf in 465 ms gegenüber 9,15 s für das Babel-Plugin. Das Feature ist experimentell, standardmäßig deaktiviert und wird zusammen mit `reactCompilerOutputMode` (client oder ssr) und einem `scripts/sync-react-compiler.sh`-Resync-Skript ausgeliefert.

Kommentare

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

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