Edge Runtime vs Node Runtime in Next.js: Wann was einsetzen
AI generated
</>
{ }
React · Next.js · Edge Runtime · Node.js
Edge Runtime vs Node Runtime in Next.js
Kaltstart, Node-APIs und die richtige Wahl pro Route

Die Edge Runtime verspricht minimale Kaltstartzeiten und globale Verteilung, verzichtet dafür aber auf zentrale Node-APIs. Die Node Runtime bietet volle Kompatibilität, kostet aber Latenz bei global verteilten Nutzern. Wer pro Route bewusst entscheidet, holt aus beiden Modellen das Beste heraus.

18 Min. Lesezeit Edge · Node · Kaltstart · Datenbank Next.js 14/15 · Vercel

1. Edge Runtime und Node Runtime: die Grundlagen

Next.js unterstützt zwei verschiedene Ausführungsumgebungen für Server-Code: die Edge Runtime und die Node Runtime. Die Node Runtime ist die klassische, vollständige Node.js-Umgebung, mit Zugriff auf das gesamte Node-Ökosystem, alle npm-Pakete und native Module. Die Edge Runtime hingegen ist eine bewusst reduzierte JavaScript-Umgebung, die auf Web-Standard-APIs basiert und dafür ausgelegt ist, an vielen geografisch verteilten Standorten gleichzeitig mit minimaler Startzeit ausgeführt zu werden.

Der fundamentale Unterschied zwischen Edge Runtime und Node Runtime liegt nicht in der Programmiersprache, beide führen JavaScript beziehungsweise TypeScript aus, sondern im zugrunde liegenden Ausführungsmodell. Die Node Runtime läuft typischerweise in wenigen, dafür leistungsfähigen Rechenzentren, während die Edge Runtime auf V8-Isolates setzt, demselben Isolationsmechanismus, den auch Cloudflare Workers nutzen, um Code an Hunderten von Standorten weltweit vorzuhalten, physisch näher am Nutzer.

Diese Unterscheidung ist auch deshalb relevant, weil sie sich nicht auf Next.js beschränkt: Andere Frameworks wie Remix oder SvelteKit bieten ähnliche Konzepte unter anderen Namen an, meist ebenfalls mit einer Trennung zwischen einer schlanken, Web-API-basierten Ausführungsumgebung und einer vollständigen Node-Umgebung. Wer das Muster einmal in Next.js verstanden hat, überträgt dieses Wissen direkt auf verwandte Entscheidungen in anderen modernen Meta-Frameworks.

Für Next.js-Entwickler bedeutet das: Route Handler, Middleware und Server Components können jeweils unabhängig konfigurieren, ob sie in der Edge Runtime oder der Node Runtime laufen. Diese Wahl ist keine globale Projekt-Einstellung, sondern eine bewusste Entscheidung pro Route, die auf den tatsächlichen Anforderungen der jeweiligen Funktionalität basieren sollte, nicht auf einer pauschalen Präferenz für die vermeintlich modernere Option.

Historisch betrachtet ist die Unterscheidung zwischen Edge Runtime und Node Runtime eine direkte Reaktion auf die Grenzen klassischer Serverless-Plattformen, bei denen jede Funktion in einem eigenen, vollständigen Container gestartet wurde. Next.js übernimmt mit der Edge Runtime ein Modell, das ursprünglich für Content-Delivery-Netzwerke entwickelt wurde, und macht es für serverseitige Anwendungslogik nutzbar, ohne dass Entwickler eine separate Plattform wie Cloudflare Workers direkt ansprechen müssen.

2. Technische Einschränkungen der Edge Runtime

Die Edge Runtime verzichtet bewusst auf alles, was ihre geringe Startzeit gefährden würde. Kein Zugriff auf das Dateisystem, keine nativen TCP-Sockets, keine Node-spezifischen Bindings zu C++-Addons. Stattdessen stehen dieselben APIs zur Verfügung, die auch im Browser existieren: fetch, Request, Response, URL, TextEncoder und die Web Crypto API für kryptografische Operationen.

Diese Web-API-Basis hat einen angenehmen Nebeneffekt für Teams, die bereits Erfahrung mit Browser-JavaScript haben: Code, der in der Edge Runtime läuft, lässt sich in vielen Fällen nahezu unverändert auch clientseitig testen, weil dieselben Schnittstellen verwendet werden. Diese Übereinstimmung erleichtert das Schreiben von Unit-Tests erheblich, ohne dass eine vollständige Node- oder Edge-Laufzeitumgebung simuliert werden muss.

Diese Einschränkung der Edge Runtime ist kein Versehen, sondern eine bewusste Designentscheidung: Jede zusätzliche Fähigkeit würde entweder die Isolate-Startzeit erhöhen oder die Sicherheitsgarantien der Sandbox schwächen. Bibliotheken, die tief auf Node-spezifische APIs setzen, etwa klassische ORMs mit direkten TCP-Datenbankverbindungen oder Bildverarbeitungsbibliotheken mit nativen Bindings, funktionieren in der Edge Runtime schlicht nicht und müssen entweder ersetzt oder in die Node Runtime verschoben werden.

Die Isolationsgrenzen der Edge Runtime lassen sich am ehesten mit einer strengen Sandbox vergleichen, die absichtlich weniger kann als eine vollständige Betriebssystemumgebung, dafür aber viele parallele Mandanten sicher voneinander trennt. Dieselbe Eigenschaft, die Node-Module ausschließt, ermöglicht es Plattformbetreibern, Tausende unabhängiger Kundenfunktionen auf gemeinsamer Hardware zu betreiben, ohne dass ein Isolate auf Ressourcen eines anderen zugreifen kann.

Für Entwicklerteams bedeutet das in der Praxis, jede neue Abhängigkeit vor dem Einsatz in einer Edge Runtime-Route kurz zu prüfen, ob sie ausschließlich Web-Standard-APIs verwendet. Viele moderne Bibliotheken kennzeichnen ihre Edge-Kompatibilität inzwischen explizit im package.json über das exports-Feld mit einer separaten edge-light-Bedingung, was die Prüfung erheblich vereinfacht.


// app/api/edge-example/route.ts — explicitly opting into the Edge Runtime
export const runtime = 'edge';

export async function GET(request: Request) {
  // Only Web APIs available here — no fs, no native TCP
  const url = new URL(request.url);
  const response = await fetch('https://api.example.com/data');
  const data = await response.json();

  return new Response(JSON.stringify(data), {
    headers: { 'Content-Type': 'application/json' },
  });
}

3. Wann Edge Runtime performancetechnisch gewinnt

Der klarste Vorteil der Edge Runtime zeigt sich bei global verteilten Nutzergruppen. Weil Code an Dutzenden oder Hunderten Standorten weltweit ausgeführt wird, entfällt die physische Netzwerklatenz zu einem zentralen Rechenzentrum. Ein Nutzer in Singapur, der eine Node Runtime-Funktion aufruft, die nur in Frankfurt läuft, zahlt einen deutlichen Latenz-Aufschlag, während dieselbe Logik in der Edge Runtime von einem Standort in der Nähe von Singapur bedient werden kann.

Ein zweiter Performancevorteil betrifft die Kaltstartzeit selbst: V8-Isolates starten in wenigen Millisekunden, während eine vollständige Node-Prozess-Instanz, insbesondere mit vielen geladenen Abhängigkeiten, spürbar länger zum Hochfahren braucht. Für Funktionen, die selten aufgerufen werden und deshalb häufig einen Kaltstart durchlaufen, etwa Middleware auf wenig frequentierten Routen, macht dieser Unterschied den größten Teil der wahrgenommenen Antwortzeit aus.

Ein dritter, oft unterschätzter Vorteil betrifft die Skalierung unter Lastspitzen. Weil V8-Isolates deutlich weniger Speicher und Startzeit benötigen als vollständige Node-Prozesse, kann eine Plattform bei einem plötzlichen Traffic-Anstieg erheblich schneller zusätzliche Instanzen der Edge Runtime bereitstellen, während die Node Runtime unter vergleichbarer Last spürbar langsamer nachskaliert.

4. Node APIs, die in der Edge Runtime fehlen

Konkret fehlen in der Edge Runtime unter anderem das Modul fs für Dateisystemzugriff, child_process für das Starten externer Prozesse, native net- und tls-Sockets für direkte TCP-Verbindungen, sowie viele Node-spezifische Buffer-Operationen, die sich von der Web-Standard-ArrayBuffer-API unterscheiden. Auch process.env verhält sich in der Edge Runtime eingeschränkter: Nur explizit zur Build-Zeit eingebettete Variablen sind verfügbar, ein dynamisches Nachladen aus einer .env-Datei zur Laufzeit funktioniert nicht.

Auch Timer-Funktionen verhalten sich in der Edge Runtime anders als gewohnt: Lang laufende setInterval-Aufrufe, die über die Lebensdauer eines einzelnen Requests hinausgehen sollen, funktionieren nicht zuverlässig, weil ein Isolate nach Abschluss der Antwort jederzeit beendet werden kann. Hintergrundprozesse, die kontinuierlich laufen müssen, gehören deshalb grundsätzlich nicht in die Edge Runtime, unabhängig davon, ob sie Node-APIs verwenden oder nicht.

Praktisch bedeutet das für viele populäre Bibliotheken: Ein klassischer PDF-Generator, der auf native Bindings setzt, ein Bildverarbeitungspaket wie sharp, oder ein Datenbanktreiber mit direktem TCP-Handshake wie der klassische pg-Client für PostgreSQL, funktionieren in der Edge Runtime nicht. Für all diese Fälle bleibt entweder die Node Runtime die richtige Wahl, oder es gibt eine Edge-kompatible Alternative, die HTTP statt TCP für die Kommunikation nutzt.

Ein oft übersehener Nebeneffekt dieser Einschränkungen betrifft Logging- und Monitoring-Bibliotheken, die in klassischen Node-Anwendungen tief in process-Events oder native Performance-Hooks eingreifen. Solche Bibliotheken müssen für die Edge Runtime speziell angepasste Varianten anbieten, die ausschließlich auf Web-APIs basieren, sonst schlägt bereits der Build fehl, lange bevor ein tatsächlicher Request die betroffene Stelle erreicht.

5. Runtime pro Route konfigurieren

Next.js erlaubt, die Runtime pro Route Handler oder Server Component explizit festzulegen, über die exportierte Konstante export const runtime = 'edge' oder export const runtime = 'nodejs'. Fehlt diese Angabe, greift bei Route Handlern standardmäßig die Node Runtime, während Middleware immer in der Edge Runtime startet, sofern nicht explizit anders konfiguriert. Diese unterschiedlichen Defaults sind ein häufiger Verwirrungspunkt für Teams, die neu mit dem App Router arbeiten.

Für ein gemischtes Projekt ist es üblich, die meisten datenbankintensiven Route Handler in der Node Runtime zu belassen, während einzelne, latenzkritische und zustandslose Endpunkte, etwa ein Endpunkt für Feature-Flag-Abfragen oder eine einfache Health-Check-Route, explizit auf die Edge Runtime umgestellt werden. Diese selektive Migration reduziert Risiko, weil nur die tatsächlich profitierenden Routen umgestellt werden, statt das gesamte Projekt pauschal umzustellen.

Ein zusätzlicher praktischer Hinweis: Team-interne Konventionen, etwa ein Linter-Regelwerk, das bei fehlender runtime-Angabe in Route Handlern warnt, machen die getroffene Entscheidung für jeden Beitragenden im Code sofort sichtbar, statt sie implizit im jeweiligen Default zu verstecken. Das reduziert versehentliche Regressionen, wenn ein neuer Entwickler eine bestehende Route kopiert und dabei unbeabsichtigt die falsche Runtime übernimmt.


// app/api/health/route.ts — cheap, stateless endpoint benefits from Edge Runtime
export const runtime = 'edge';

export function GET() {
  return Response.json({ status: 'ok', timestamp: Date.now() });
}

// app/api/orders/route.ts — heavy DB access stays on the Node Runtime
export const runtime = 'nodejs';

import { db } from '@/lib/db';

export async function GET() {
  const orders = await db.order.findMany({ take: 50 });
  return Response.json(orders);
}

6. Datenbankzugriffe: Edge-kompatible Clients

Datenbankzugriffe sind der häufigste Grund, warum Teams bei der Edge Runtime scheitern. Klassische Treiber öffnen eine persistente TCP-Verbindung, die in der Edge Runtime technisch nicht möglich ist. Die Lösung sind HTTP-basierte Datenbank-Clients, die inzwischen von mehreren Anbietern speziell für diesen Zweck entwickelt wurden: Neon und PlanetScale bieten HTTP-Endpunkte für PostgreSQL beziehungsweise MySQL an, die ohne persistente Verbindung auskommen und in der Edge Runtime problemlos funktionieren.

Wichtig zu verstehen: Diese HTTP-basierten Clients haben andere Performance-Charakteristika als klassische Verbindungspools. Jede Abfrage baut effektiv eine neue Verbindung auf, was bei einzelnen, seltenen Abfragen unproblematisch ist, bei vielen sequentiellen Abfragen innerhalb einer Anfrage aber zu kumulierter Latenz führen kann. Für Anwendungen mit komplexen, mehrstufigen Datenbankabfragen bleibt die Node Runtime mit einem klassischen Connection Pool oft die bessere Wahl, selbst wenn die Edge Runtime technisch verfügbar wäre.

Ein aufkommender Mittelweg sind Connection-Pooling-Dienste, die selbst als HTTP-Fassade vor einem klassischen Datenbank-Server laufen, etwa PgBouncer in Kombination mit einem HTTP-Gateway. Diese Architektur erlaubt, die Vorteile eines echten Connection Pools zu behalten, während die eigentliche Edge Runtime-Route weiterhin nur über HTTP kommuniziert, ohne selbst eine TCP-Verbindung verwalten zu müssen.

7. Kaltstart-Verhalten und globale Verteilung

Kaltstart bezeichnet die Zeit, die eine Ausführungsumgebung braucht, um von einem inaktiven Zustand zu einem lauffähigen Zustand zu wechseln. Bei der Node Runtime in klassischen Serverless-Umgebungen kann ein Kaltstart, je nach Anzahl der geladenen Abhängigkeiten und der Größe des Deployment-Pakets, mehrere hundert Millisekunden bis wenige Sekunden dauern. Die Edge Runtime reduziert diese Zeit durch V8-Isolates typischerweise auf einen niedrigen einstelligen oder niedrigen zweistelligen Millisekundenbereich.

Die globale Verteilung verstärkt diesen Effekt zusätzlich: Weil Edge Runtime-Instanzen an vielen Standorten gleichzeitig vorgehalten werden können, sinkt die Wahrscheinlichkeit, dass ein Nutzer überhaupt einen Kaltstart erlebt, weil bereits ein warmes Isolate in seiner Nähe existiert. Bei der Node Runtime mit wenigen zentralen Standorten ist die Wahrscheinlichkeit eines Kaltstarts für Nutzer in entfernten Regionen strukturell höher, weil weniger parallele Instanzen vorgehalten werden.

Für Teams, die diesen Effekt konkret messen wollen, lohnt sich ein synthetischer Test aus mehreren geografischen Regionen gegen dieselbe Route, einmal mit Edge Runtime und einmal mit Node Runtime konfiguriert. Die Differenz zeigt sich meist am deutlichsten bei Nutzern, die weit entfernt vom nächsten Node Runtime-Rechenzentrum liegen, während Nutzer in unmittelbarer Nähe eines solchen Standorts kaum einen Unterschied bemerken.

8. Migrationsstrategie zwischen den Runtimes

Eine Migration von Node Runtime zu Edge Runtime sollte niemals als Big-Bang-Umstellung erfolgen. Der bewährte Ansatz beginnt mit einer Bestandsaufnahme: Welche Route Handler nutzen tatsächlich Node-spezifische APIs, und welche sind bereits faktisch zustandslos und Web-API-kompatibel? Middleware ist meist der einfachste Startpunkt, weil sie ohnehin in der Edge Runtime läuft und typischerweise wenig Node-spezifische Logik enthält.

Nach der Middleware folgen einzelne, klar abgegrenzte Route Handler, beginnend mit denen ohne Datenbankzugriff. Datenbankintensive Routen werden erst migriert, nachdem ein Edge-kompatibler Datenbank-Client etabliert und getestet wurde. Ein häufiger Fehler bei dieser Migration ist, die Edge Runtime testweise zu aktivieren, ohne systematisch zu prüfen, welche transitiven Abhängigkeiten in einem Paket versteckte Node-APIs nutzen, was erst beim Build oder schlimmer erst zur Laufzeit auffällt.

Ein bewährtes Vorgehen ist, jede Migration hinter einem eigenen Feature-Branch mit automatisierten End-to-End-Tests abzusichern, die gezielt die Routen prüfen, deren Runtime gerade umgestellt wird. So lässt sich ein Regressionsfehler, etwa eine fehlgeschlagene Datenbankabfrage in der Edge Runtime, bereits in der Testphase erkennen, statt ihn erst durch Nutzerbeschwerden in Produktion zu bemerken.

Ein zusätzlicher Sicherheitsnetz-Mechanismus ist, die Runtime-Konfiguration über eine Umgebungsvariable statt eines hartkodierten Werts steuerbar zu machen, sodass im Notfall ein schnelles Rollback von Edge Runtime zurück zur Node Runtime ohne neuen Deployment-Zyklus möglich ist. Dieses Sicherheitsnetz hat sich bei mehreren Next.js-Migrationen als entscheidend erwiesen, um Produktionsausfälle während der Umstellung zu vermeiden.

9. Edge Runtime vs Node Runtime im Vergleich

Die folgende Tabelle fasst die wichtigsten Entscheidungskriterien zwischen Edge Runtime und Node Runtime zusammen.

Kriterium Edge Runtime Node Runtime Empfehlung
Kaltstartzeit Sehr niedrig Höher, abhängig von Paketgröße Edge bei häufigen Kaltstarts
Node-spezifische APIs Nicht verfügbar Voll verfügbar Node bei fs, TCP, native Module
Datenbank mit Connection Pool Nur via HTTP-Client Nativ unterstützt Node bei komplexen Abfragen
Globale Nutzerbasis Physische Nähe zum Nutzer Zentrale Standorte Edge für latenzkritische, zustandslose Logik
npm-Paket-Kompatibilität Eingeschränkt Vollständig Node bei komplexen Abhängigkeiten

Die Tabelle zeigt: Es gibt keine pauschal überlegene Runtime. Edge Runtime gewinnt bei latenzkritischer, zustandsloser Logik mit globaler Nutzerbasis, Node Runtime bleibt die richtige Wahl für komplexe Datenbankzugriffe und Abhängigkeiten mit Node-spezifischen APIs.

Als Faustregel für Teams ohne bestehende Next.js-Erfahrung mit beiden Runtimes gilt: Im Zweifel zunächst mit der Node Runtime starten, weil sie die geringste Wahrscheinlichkeit unerwarteter Kompatibilitätsprobleme bietet, und gezielt einzelne, klar latenzkritische Routen später in die Edge Runtime migrieren, sobald ein echter Bedarf und ein gemessener Latenzvorteil vorliegen.

Mironsoft

Next.js Architektur und Runtime-Entscheidungen

Die richtige Runtime für jede Route, nicht nur eine pauschale Wahl?

Wir analysieren bestehende Next.js Route Handler und Middleware, identifizieren Edge-Kandidaten und migrieren schrittweise, mit Edge-kompatiblen Datenbank-Clients wo nötig.

Runtime-Audit

Node-Abhängigkeiten pro Route identifizieren und Edge-Kandidaten markieren

Schrittweise Migration

Risikoarme, routenweise Umstellung mit Rollback-Fähigkeit

Datenbank-Anbindung

Edge-kompatible HTTP-Clients für Neon, PlanetScale und ähnliche Anbieter

10. Zusammenfassung

Die Wahl zwischen Edge Runtime und Node Runtime in Next.js ist keine Frage von alt gegen neu, sondern eine bewusste Entscheidung pro Route, basierend auf tatsächlichen Anforderungen. Die Edge Runtime gewinnt bei Kaltstartzeit und globaler Verteilung, verzichtet dafür auf zentrale Node-APIs wie Dateisystemzugriff, native TCP-Sockets und viele npm-Pakete mit nativen Bindings. Die Node Runtime bleibt die richtige Wahl für datenbankintensive Logik mit Connection Pools und komplexe Abhängigkeiten.

Eine erfolgreiche Migration erfolgt schrittweise, beginnend mit Middleware und zustandslosen Routen, unterstützt durch Edge-kompatible Datenbank-Clients für die verbleibenden Fälle. Wer diese Entscheidung pauschal statt differenziert trifft, riskiert entweder unnötige Latenz durch zu viel Node Runtime oder Build-Fehler und Performance-Probleme durch übereilte Edge Runtime-Migration ohne saubere Bestandsaufnahme.

Langfristig lohnt es sich, die Runtime-Entscheidung als lebendigen Teil der Architektur zu behandeln statt als einmalige Festlegung. Ein wachsender Next.js-Codebase verändert seine Anforderungen mit der Zeit, neue Abhängigkeiten kommen hinzu, bestehende Datenzugriffsmuster ändern sich, und eine Route, die heute problemlos in der Edge Runtime läuft, kann durch eine spätere Änderung plötzlich Node-spezifische Anforderungen bekommen. Regelmäßige Überprüfung verhindert, dass diese Verschiebung unbemerkt bleibt.

Edge Runtime vs Node Runtime: Das Wichtigste auf einen Blick

Edge Runtime Stärken

Minimale Kaltstartzeit, globale Verteilung nah am Nutzer, ideal für zustandslose, latenzkritische Logik.

Node Runtime Stärken

Volle Node-API-Kompatibilität, Connection Pools, native npm-Pakete ohne Einschränkung.

Pro Route konfigurieren

export const runtime als bewusste Entscheidung pro Route Handler, nicht als globale Voreinstellung.

Schrittweise migrieren

Erst Middleware, dann zustandslose Routen, Datenbankzugriffe zuletzt mit Edge-kompatiblem Client.

Diese Prinzipien gelten unabhängig davon, ob eine Anwendung auf Vercel, einer selbst gehosteten Node-Umgebung oder einer anderen Edge-fähigen Plattform betrieben wird.

11. FAQ: Edge Runtime vs Node Runtime

1Hauptunterschied?
Edge: minimale Kaltstartzeit, Web-APIs. Node: volles Ökosystem, zentrale Standorte.
2Warum kein Prisma in Edge?
Native TCP-Sockets fehlen in der Edge Runtime. HTTP-basierte Clients sind die Alternative.
3Runtime pro Route konfigurieren?
export const runtime = 'edge' oder 'nodejs' direkt in der Datei setzen.
4Middleware immer Edge?
Standardmäßig ja, Node experimentell möglich mit längeren Kaltstarts.
5Was ist ein V8-Isolate?
Leichtgewichtiger Isolationsmechanismus ohne vollen Prozessstart, Basis der Edge-Geschwindigkeit.
6Bestehende Node-Lib nutzbar?
Nur bei reiner Web-API-Nutzung, sonst Edge-Alternative suchen oder Node Runtime verwenden.
7Lohnt sich Edge bei nur regionalen Nutzern?
Latenzvorteil geringer, Kaltstart-Vorteil bleibt trotzdem relevant.
8Risikoarme Migration?
Middleware zuerst, dann zustandslose Routen, Datenbankrouten zuletzt einzeln testen.
9Transitive Node-Abhängigkeit?
Build-Fehler oder Laufzeitfehler, systematischer Check vor Migration reduziert das Risiko.
10HTTP-DB langsamer als Pool?
Bei einzelnen Abfragen vergleichbar, bei vielen sequentiellen Abfragen kumuliert sich Latenz.