PAS7 Studio

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?

Node.js 25 — Änderungen, Developer-Reaktionen und die Frage: upgraden oder 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]

Section prologue screenshot

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-file taucht 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-sea kommt — 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: localStorage ist 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. portable Mode.[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]

V8

14.1

Die 25.0.0 Notes heben Performance-Arbeit hervor, u. a. bei JSON.stringify.[8]

Web Storage

Default an

Ein Default-Change, der Ecosystem-Regressions (Tools/Tests/CLIs) ausgelöst hat.[8][5][4]

Security posture

permissions

Permissions als secure-by-default, aber mit klaren Grenzen (kein Sandbox).[11]

Legacy cleanup

deprecations

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 screenshot

Web 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]

Section webstorage-saga screenshot

Vitest #8757: Web Storage Default kann Tests brechen, weil Erwartungen an localStorage sich ändern.[4]

Section webstorage-saga screenshot

Jest #15888: Runner scheitert mit SecurityError auf Node 25.2.0.[3]

Section webstorage-saga screenshot

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

Wenn Packages ESM-only werden, stolpert CJS-Code über ERR_REQUIRE_ESM. Eine reifere Brücke ermöglicht schrittweise Migration statt Big-Bang Rewrite.[9][22]

2) Praktisches Pattern: Adapter für default export

JS
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 screenshot

Module 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:

JS
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]

Section compile-cache screenshot

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

25.5.0 führt --build-sea ein und konsolidiert die bisherigen SEA-Schritte in einen Step direkt im Core.[12][13]

BASH
echo 'console.log("Hello")' > hello.js
echo '{ "main": "hello.js", "output": "sea" }' > sea-config.json
node --build-sea sea-config.json
./sea

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]

Section sea-build-sea screenshot

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:

JS
import http from 'node:http';

const restore = http.setGlobalProxyFromEnv();
// restore();

API

http.setGlobalProxyFromEnv()

Hilfreich, wenn Proxy via env gesteuert wird (CI/Enterprise Networks).[14]

Tipp

beim Start aufrufen

Nicht mitten in Requests; im Bootstrap von Service/CLI.[14]

Ergebnis

konsistenter

Weniger unterschiedliche Konfigurationen pro HTTP-Client.

Docs: http.setGlobalProxyFromEnv([proxyEnv]) + built-in proxy support.[14]

Section ops-qol screenshot

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:

JS
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

BASH
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.

Production Backend

Eher warten / LTS

Node empfiehlt Production auf Active/Maintenance LTS.[6]

CI / Compatibility

Jetzt hinzufügen

Node 25 zeigt Regressionen (Web Storage) und Legacy Cleanup (SlowBuffer) früh, ohne Prod-Incident.[5][16]

CLI / Agents

Upgrade ist sinnvoll

--build-sea (25.5.0) + Reife in 25.4.0 sind echte DX-Wins. Teste Ziel-OS/Shells.[12][21]

Mindset

Current darf “beißen”

Current existiert, damit das Ökosystem adaptiert. Wenn es nervt: in CI behalten, Prod auf LTS lassen.[6]

Sources

Quellen in Erscheinungsreihenfolge (Position = [n]).

FAQ

Ist Node.js 25 ein LTS-Release?

Nein. Es ist Current (odd major). Node sagt explizit: Production soll auf Active oder Maintenance LTS laufen.[6]

Warum ist Web Storage so laut eskaliert?

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]

Wie entsperre ich CI schnell, wenn localStorage alles bricht?

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]

Kann ich SEA mit --build-sea schon nutzen?

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.

Verwandte Artikel

Entdecken Sie weitere nützliche Artikel

growthFebruary 15, 2026

AI SEO / GEO im Jahr 2026: Ihre nächsten Kunden sind nicht Menschen — sondern Agents

Suche verschiebt sich von Klicks zu Antworten. Bots und AI-Agents crawlen, zitieren, empfehlen — und kaufen zunehmend. Erfahren Sie, was AI SEO / GEO bedeutet, warum klassisches SEO nicht mehr reicht und wie PAS7 Studio Marken im agentischen Web sichtbar macht.

Lesen →
telegram-media-saverJanuary 8, 2025

Automatisches Tagging und Suche für gespeicherte Links

Integration mit GDrive/S3/Notion für automatisches Tagging und schnelle Suche über Such-APIs

Lesen →
servicesJanuary 1, 2025

Bot-Entwicklung und Automatisierungs-Dienste

Professionelle Telegram-Bot-Entwicklung und Automatisierung von Geschäftsprozessen: Chatbots, KI-Assistenten, CRM-Integrationen und Prozessautomatisierung.

Lesen →
backend-engineeringFebruary 15, 2026

Bun vs Node.js im Jahr 2026: Warum sich Bun schneller anfühlt (und wie du dein Projekt vor der Migration prüfst)

Bun ist ein schnelleres All-in-one JavaScript-Toolkit: Runtime, Package Manager, Bundler und Test Runner. Hier ist, was wirklich stimmt (mit Benchmarks), was brechen kann und wie du mit @pas7-studio/bun-ready einen kostenlosen Readiness-Audit bekommst.

Lesen →

Professionelle Entwicklung für Ihr Geschäft

Wir erstellen moderne Web-Lösungen und Bots für Unternehmen. Erfahren Sie, wie wir Ihnen helfen können, Ihre Ziele zu erreichen.