Technologie
Node.js 25: was wirklich neu ist, was im Ökosystem kaputtging und ob sich ein Upgrade lohnt
Ein praxisnaher Blick auf Node.js 25 (Current): V8 14.1 und Performance, Web Storage standardmäßig aktiv (und dadurch Tests/Tools kaputt), Permission Model mit --allow-net, portabler Module Compile Cache (jetzt stable), require(esm) als stable markiert, http.setGlobalProxyFromEnv(), fs.watch mit ignore, und SEA in einem Schritt per node --build-sea. Entwickler-Perspektiven mit Links + klares Fazit: jetzt upgraden oder auf LTS warten?

Prolog: Node upgegradet — und plötzlich killt „localStorage“ den Build
Es gibt zwei Arten von Node-Upgrades. Die erste: „Version hoch, alles läuft“. Die zweite: „Version hoch, und plötzlich kommen browserartige Fehler im Backend“. Node.js 25 hat viele Teams in die zweite Kategorie geschubst.
Bei Docusaurus wirkt das absurd: DOMException [SecurityError]: Cannot initialize local storage without a --localstorage-file path beim docusaurus build.[1] Ähnliche Symptome tauchen auch bei CLIs (Shopify) und Test-Runnern (Jest/Vitest) auf.[2][3][4]
Wichtig: Das ist nicht einfach „ein zufälliger Bug in eurem Repo“. Es ist eine Folge davon, dass Node 25 Web Storage per Default aktiviert — und Node-localStorage ist eben kein 1:1 Browser-Storage (file-backed, Quota, shared, unencrypted).[7][5]
Und trotzdem: Node 25 ist mehr als die Web-Storage-Saga. 25.4.0 und 25.5.0 bringen reife Verbesserungen (require(esm) stable, Compile Cache stable, --build-sea), die Migrationen spürbar vereinfachen — wenn man sie bewusst einführt.[9][10][12]
Echter Fall: docusaurus build scheitert auf Node 25.x wegen localStorage SecurityError.[1]
Mini-Timeline zu Node 25: warum 25.4 und 25.5 genauso wichtig sind wie „25.0.0“
Node 25 ist eine Current-Line (odd). Sie entwickelt sich schnell: neue Defaults, dann Edge-Cases, dann Stabilisierung.[6]
• 25.0.0: V8 14.1, Performance-Fokus, Web APIs, Permission Model, Web Storage per Default.[8]
• 25.2.0: die
localStorage-Regression ohne--localstorage-filetaucht auf (nodejs/node #60704) und trifft Toolchains.[5]• 25.4.0: require(esm) wird stable, Module Compile Cache wird stable, Ops-Features wie
http.setGlobalProxyFromEnv()kommen dazu.[9]• 25.5.0:
node --build-seakommt — SEA „in einem Schritt aus dem Core“, plus kleine, aber wichtige Ops/Monorepo-Änderungen.[12]
Kurzbegriffe, damit du nicht alle 2 Minuten googeln musst
Genug Vokabular, damit Node 25 als Text Sinn ergibt.
• Current vs LTS: odd major = Current, even major = LTS-Line. Node empfiehlt Production auf Active/Maintenance LTS.[6]
• Web Storage in Node:
localStorageist file-backed (--localstorage-file), unencrypted, hat 10MB Quota, und ist im Serverprozess shared.[7]• Permission Model: Prozess-Permissions (
--permission,--allow-net,--allow-fs-read) als „Gurt“. Kein Sandbox, keine Garantien gegen malicious code.[11]• require(esm): Brücke zwischen CJS und ESM. 25.4.0 markiert das als stable (relevant für Migrationsstrategien).[9]
• Module Compile Cache: on-disk Code Cache für schnellere Modul-Compilation, inkl.
portableMode.[10]• SEA: Single Executable Applications. 25.5.0 macht es einfacher via
--build-sea.[12][13]• Ops QoL: Proxy aus env (
http.setGlobalProxyFromEnv()), Watcher ignore (fs.watch({ ignore: ... })).[14][15]
Node 25.0.0: was in der Basis neu ist und wo der praktische Nutzen liegt
25.0.0 ist das Fundament: V8 14.1, Performance, Web APIs und Legacy-Cleanup. Die „Reife“ der Line zeigt sich in 25.4/25.5.[8][9][12]
Web Storage
Ein Default-Change, der Ecosystem-Regressions (Tools/Tests/CLIs) ausgelöst hat.[8][5][4]
Security posture
Permissions als secure-by-default, aber mit klaren Grenzen (kein Sandbox).[11]
Legacy cleanup
Major-Releases tun oft weh durch Entfernen deprecated APIs (SlowBuffer).[16]
Visueller Startpunkt der Linie: Node.js 25.0.0 (Current).[8]
Section node-25-0 screenshotWeb Storage per Default: warum es eskalierte und wie es in echten Projekten aussieht
Das Problem ist nicht, dass Web Storage „schlecht“ wäre. Das Problem ist, dass der Default geändert wurde, und Tooling auf einmal Codepfade ausführt, die nie serverseitig getestet wurden.
nodejs/node #60704 beschreibt die 25.2.0 Regression: “Cannot initialize local storage without a --localstorage-file path” und verweist auf kaputte Toolchains (webpack/jest/html-webpack-plugin).[5]
Vitest #8757 zeigt einen anderen Failure Mode: In Node 25 ist localStorage nicht mehr undefined, was Mocks in Test-Umgebungen brechen kann.[4] Jest #15888 ist ein weiterer Beleg: der Runner scheitert mit SecurityError auf Node 25.2.0.[3]
Schneller Incident-Workaround (wenn Storage nicht gebraucht wird): Web Storage temporär per Flag deaktivieren (steht in den globals docs).[7]
Team-Lektion: Auch wenn ihr „kein localStorage nutzt“, eure Dependencies könnten. Deshalb ist Current in CI als Frühwarnsystem sinnvoll.[6]
nodejs/node #60704: 25.2.0 Regression — localStorage ohne --localstorage-file kann Builds killen.[5]
Vitest #8757: Web Storage Default kann Tests brechen, weil Erwartungen an localStorage sich ändern.[4]
Jest #15888: Runner scheitert mit SecurityError auf Node 25.2.0.[3]
Node 25.4.0: require(esm) wird stable (und das ändert Migrationen)
Eine dieser Änderungen, die nicht laut ist, aber in großen Repos wochenlang Arbeit spart.
1) Warum es zählt
2) Praktisches Pattern: Adapter für default export
const pkg = require('some-esm-only-package');
const api = pkg?.default ?? pkg;
module.exports = api;Das ist ein übliches Pattern für den namespace object, wenn ESM default export liefert.[22]
3) Was es für Teams signalisiert
Stabilisierung in Current bereitet den Weg fürs Ökosystem. LTS+Current in CI bringt Nutzen ohne Prod-Risiko.[6]
Visueller Marker eines Stabilisierungspunkts: Node.js 25.4.0 (Current).[9]
Section require-esm screenshotModule Compile Cache: portable Mode und klare Doku — was es in CI/Containern bringt
Compile Cache ist eine Optimierung. Sie hilft besonders bei vielen Cold Starts oder großen Modulgraphen (Tools, CLI, Worker).
Die node:module Docs erklären Portabilität sehr konkret: Wenn absolute Pfade sich ändern, verliert der Cache an Effektivität; portable hilft beim Reuse.[10]
Minimaler Versuch:
import module from 'node:module';
module.enableCompileCache({ directory: '.node-compile-cache', portable: true });In CI lohnt es sich, das Cache-Verzeichnis explizit zu managen, damit es nicht “verdampft”.
Docs: „Portability of the compile cache“ + portable Mode mit API/env Beispielen.[10]
Node 25.5.0: `node --build-sea` macht SEA zu einem „Single-Step“ Workflow
Eine der produktivsten Änderungen in der Line: Single Executable bauen sieht nicht mehr wie ein externes Injector-Ritual aus.
1) Kerngedanke
2) Praxis-Fazit
Für CLI/Agents: weniger Dependencies und weniger fragile Release-Schritte. Aber testet auf Ziel-OS/Shells (es gibt Berichte zu Windows Command Prompt).[21]
3) Team-Hinweis
SEA ist Distribution, nicht Security. Pflege weiterhin Dependencies und Supply Chain. Current in CI bleibt dein Frühwarnsystem.[6]
25.5.0: --build-sea Abschnitt plus Command-Beispiel in den offiziellen Notes.[12]
Ops QoL: Proxy aus env — sauberer Weg für Corporate Networks
Keine „Headline“, aber ein DX-Gewinn: weniger kleine Proxy-Wrapper in Projekten mit Enterprise-CI.
Minimal:
import http from 'node:http';
const restore = http.setGlobalProxyFromEnv();
// restore();API
Hilfreich, wenn Proxy via env gesteuert wird (CI/Enterprise Networks).[14]
Ergebnis
Weniger unterschiedliche Konfigurationen pro HTTP-Client.
Docs: http.setGlobalProxyFromEnv([proxyEnv]) + built-in proxy support.[14]
Monorepo-Schmerz: `fs.watch({ ignore })` reduziert Watcher-Rauschen
In großen Repos sind Watcher ein eigener Schmerz (node_modules, .git, Generated Output). Die Docs beschreiben ignore als Option (glob/RegExp/function/array).[15]
Minimalbeispiel:
import { watch } from 'node:fs';
watch('.', {
recursive: true,
ignore: ['**/node_modules/**', '**/.git/**'],
}, () => {});Breaking changes: Node 25 bricht Dependencies durch „Legacy Cleanup“ (nicht durch neue Features)
Major-Releases tun oft weh durch Deprication-Finalisierung. SlowBuffer ist das Paradebeispiel.[16]
1) Was passierte mit SlowBuffer?
Die Deprecations Docs sagen: SlowBuffer wurde entfernt; nutze Buffer.allocUnsafeSlow(size).[16]
2) Wie es in der Praxis aussieht
Ein reales Beispiel: Backend crash auf Node 25.x durch eine Dependency Chain, die SlowBuffer.prototype nutzt.[17]
3) Schneller Pre-Upgrade Scan
rg -n "\bSlowBuffer\b" .Dann pnpm why / npm ls, um die Legacy-Kette zu finden.
Upgrade-Playbook: Node 25 so einführen, dass es Nutzen bringt (statt Schmerz)
Kurze, praxisnahe Checkliste.
• 1) Prod auf LTS, Node 25 in CI (LTS + Current Matrix).[6]
• 2) Tests mit deaktiviertem Web Storage laufen lassen, um schnell zu isolieren:
NODE_OPTIONS="--no-experimental-webstorage".[7]• 3) Wenn es bricht: schau, wo es schon bricht: nodejs/node #60704, Vitest #8757, Jest #15888.[5][4][3]
• 4) Features aus 25.4/25.5 zuerst isoliert testen (CLI/Worker), nicht „Prod Runtime umstellen und hoffen“.[9][12]
• 5) Monorepo: Watcher tunen:
fs.watch({ ignore })reduziert Last.[15]• 6) Corporate CI:
http.setGlobalProxyFromEnv()testen als globaler Proxy-Weg.[14]
Fazit: Solltest du jetzt auf Node.js 25 upgraden?
Ohne Religion: Node 25 ist super als CI-Frühwarnsystem und für bestimmte Produkte (CLI/Agents). Für Production Backends gewinnt meist LTS durch Stabilität.
CI / Compatibility
Node 25 zeigt Regressionen (Web Storage) und Legacy Cleanup (SlowBuffer) früh, ohne Prod-Incident.[5][16]
CLI / Agents
--build-sea (25.5.0) + Reife in 25.4.0 sind echte DX-Wins. Teste Ziel-OS/Shells.[12][21]
Mindset
Current existiert, damit das Ökosystem adaptiert. Wenn es nervt: in CI behalten, Prod auf LTS lassen.[6]
Sources
Quellen in Erscheinungsreihenfolge (Position = [n]).
• Docusaurus issue #11545: build broken on Node 25.2.0 due to localStorage SecurityError Quelle lesen ↗
• Shopify community: shopify-cli fails on Node 25.2.0 due to localStorage SecurityError Quelle lesen ↗
• Jest issue #15888: Jest fails with localStorage error on Node 25.2.0 Quelle lesen ↗
• Vitest issue #8757: Node v25 breaks tests with Web Storage API Quelle lesen ↗
• nodejs/node issue #60704: Regression 25.2.0 — Cannot initialize local storage without --localstorage-file path Quelle lesen ↗
• Node.js Releases: Current vs LTS policy (production guidance) Quelle lesen ↗
• Node.js Globals docs: Web Storage semantics + disable flag Quelle lesen ↗
• Node.js 25.0.0 release notes (V8 14.1, Web Storage default, performance highlights) Quelle lesen ↗
• Node.js 25.4.0 release notes (require(esm) stable, compile cache stable, ops improvements) Quelle lesen ↗
• Node.js node:module docs: module compile cache + portability Quelle lesen ↗
• Node.js Permissions docs: seat belt approach (not a sandbox) Quelle lesen ↗
• Node.js 25.5.0 release notes (--build-sea, other notable changes) Quelle lesen ↗
• Node.js Single Executable Applications docs (--build-sea flow and config) Quelle lesen ↗
• Node.js HTTP docs: http.setGlobalProxyFromEnv() Quelle lesen ↗
• Node.js Deprecations docs: SlowBuffer removed + migration note Quelle lesen ↗
• twentyhq/twenty issue: crash on Node 25 due to SlowBuffer removal via dependency chain Quelle lesen ↗
• nodejs/Release issue #1113: cadence discussion (annual majors / LTS duration) Quelle lesen ↗
• nodejs/node issue: --build-sea fails in Windows Command Prompt (shell-specific behavior) Quelle lesen ↗
• Joyee Cheung: require(esm) in Node.js — from experiment to stability Quelle lesen ↗
• Joyee Cheung: Improving SEA building (why build moved into Node.js core) Quelle lesen ↗
FAQ
Nein. Es ist Current (odd major). Node sagt explizit: Production soll auf Active oder Maintenance LTS laufen.[6]
Weil der Default geändert wurde. `localStorage` ist ohne Experimental-Flag verfügbar, aber die Node-Semantik unterscheidet sich (file, 10MB, shared). Tooling-Annahmen brechen.[7][5][4]
Web Storage temporär per `NODE_OPTIONS="--no-experimental-webstorage"` deaktivieren (oder per Flag). Das ist in den globals docs dokumentiert und wird als Workaround referenziert.[7][5]
Ja, aber teste Ziel-OS/Shells. Es gibt ein Windows Command Prompt spezifisches Issue.[21] Details siehe SEA Docs.[13]
In einem Satz: Nutze den Wert von Node 25 ohne das Prod-Risiko „frontal“ zu nehmen
Für die meisten Teams: Prod auf LTS, Node 25 in CI als Frühwarnsystem, und 25.4/25.5 Features (require(esm), Compile Cache, build-sea) zuerst in isolierten Experimenten (CLI/Worker). DX hoch, Risiko runter.