Czym jest Edge Runtime w Next.js?
Next.js pozwala wybrać runtime niezależnie dla każdego Route Handlera i stron. Domyślny runtime to Node.js — włączasz punktowo, w sposób przemyślany, tam gdzie rzeczywiście ma to sens.
Warto przy tym znać szerszy kontekst, ponieważ trochę się pozmieniało. O ile przez lata edge kusił głównie zerowym , ale dzięki runtime Node.js stał się optymalnym wyborem dla większości standardowych zastosowań. Edge nie zniknął, ale przestał być bezrefleksyjnym wyborem dla maksymalnej wydajności.
Edge vs Node.js — gdzie naprawdę się różnią
| Cecha | Node.js Runtime | Edge Runtime |
|---|---|---|
| Środowisko | Pełny Node.js | Web API (podzbiór) |
| Cold start | Zależny od platformy; Fluid Compute mocno go ogranicza | Bardzo niski, zwykle najniższy przy lekkich funkcjach |
| Lokalizacja | Wybrany region, także przez preferredRegion | Globalnie (edge) |
| Rozmiar kodu | Bez limitu | ~1–4 MB (zależnie od platformy) |
| API Node.js | Pełne (fs, crypto, path...) | Tylko Web API (fetch, Request, Response, crypto.subtle) |
| Streaming | Tak | Tak |
| Bazy danych | Dowolne | Tylko HTTP-based (Neon, PlanetScale, Upstash) |
| npm pakiety | Wszystkie | Tylko edge-compatible |
Jak włączyć Edge Runtime
W Route Handlerach
W stronach (Page)
Ten sam eksport działa w plikach page.tsx, ale używaj go oszczędnie. Jeśli strona może być statyczna albo korzysta z ISR, Edge Runtime nie jest dobrym domyślnym wyborem — statyczny HTML z CDN zwykle będzie prostszy, tańszy i równie szybki.
W Proxy (dawniej middleware)
Przez długi czas obowiązywała zasada, że middleware (middleware.ts) zawsze działa na Edge Runtime, bez jakiejkolwiek możliwości wyboru. W Next.js 16 plik został przemianowany na proxy.ts, a wraz z tą zmianą proxy działa wyłącznie na runtime Node, a nie na Edge. Jeśli chcesz zobaczyć, do czego ta warstwa się przydaje, zebrałem przykłady w artykule o zastosowaniach proxy w Next.js.
Szybka macierz wyboru runtime
| Scenariusz | Najlepszy wybór | Dlaczego |
|---|---|---|
| Treść marketingowa, blog, dokumentacja | SSG / ISR na Node | Gotowy HTML z CDN wygrywa prostotą; ISR wymaga Node |
| API z ORM, płatności, integracje backendowe | Node Runtime | Pełny ekosystem npm, TCP, natywne moduły i dłuższe operacje |
| Personalizacja geo, feature flag, lekki proxy | Edge Runtime | Mały kod, szybka decyzja blisko użytkownika, brak ciężkich zależności |
| Obraz OG, walidacja JWT, rate limiting z HTTP store | Edge Runtime | Krótka operacja, Web API wystarcza, niskie opóźnienie ma znaczenie |
| Aplikacja z użytkownikami w wielu regionach, ale z pełnym Node | Node + preferredRegion | Zachowujesz API Node.js, a jednocześnie ograniczasz dystans do użytkownika |
Kiedy edge ma sens — 5 przypadków
1. Personalizacja treści na podstawie geolokacji
Edge widzi lokalizację użytkownika zanim request dotrze do . Idealne do wyświetlania lokalnych cen, walut czy najbliższych oddziałów.
2. Feature flags i A/B testy
Decyzja o wariancie musi zapaść przed renderowaniem — edge jest szybszy niż do serwera origin.
W realnym kodzie isInExperiment() powinno być deterministyczne, np. oparte o hash użytkownika albo odpowiedź lekkiego serwisu feature flag. Ważne jest to, że decyzja zapada przed właściwym renderowaniem.
3. Proste API proxy i transformacje odpowiedzi
Edge świetnie nadaje się jako proxy do zewnętrznych API, ponieważ dodaje nagłówki, transformuje odpowiedzi i ukrywa klucze API.
4. Walidacja tokenów JWT i rate limiting
Szybka walidacja tokenów, limitowanie requestów, sprawdzanie uprawnień — zanim request dotrze do Node.js. Do weryfikacji JWT na edge warto użyć (stworzonej do tego celu) lekkiej biblioteki jose (npm install jose). Samą strategię limitowania rozwijam w osobnym artykule o rate limitingu w Next.js z Upstash — tam znajdziesz algorytmy i obsługę awarii Redisa.
5. Dynamiczne OG images (obrazy social media)
Generowanie obrazów social media na edge, ImageResponse z next/og (następca dawnego @vercel/og) używa pod spodem i działa natywnie na Edge Runtime. Pełny wzorzec generowania podglądów opisałem w artykule o dynamicznych OG images z next/og.
Kiedy zostać przy Node.js runtime
Edge nie jest uniwersalnym rozwiązaniem, dlatego warto w określonych sytuacjach zostać przy Node.js runtime. Powody mogą być różne:
Potrzebujesz dostępu do systemu plików —
fs,path,child_processnie są dostępne na edgeKorzystasz z ORM z — Prisma (bez Edge Client), Sequelize, TypeORM wymagają trwałych połączeń TCP
Twój pakiet przekracza limity — edge ma ograniczenie rozmiaru bundla (zwykle 1–4 MB)
Potrzebujesz ISR lub
revalidate— Edge Runtime nie obsługuje Incremental Static Regeneration, więc dla stron z odświeżaniem statycznego HTML-a zostajesz przy Node.jsPotrzebujesz natywnych modułów Node.js —
sharp(przetwarzanie obrazów),bcrypt, natywne bindingiOperacje są CPU-intensive — ciężkie obliczenia, parsowanie dużych plików, kompresja
Łączysz się z bazą przez TCP — tradycyjne bazy (PostgreSQL, MySQL z directem) wymagają Node.js lub dedykowanego HTTP proxy
Bazy danych edge-compatible
Jeśli chcesz łączyć się z bazą z edge, wybierz usługę z HTTP/WebSocket API:
- Neon — serverless Postgres z HTTP driverem,
- PlanetScale — serverless MySQL z fetch API,
- Upstash Redis — Redis over HTTP,
- Turso — SQLite na edge (libSQL),
- Supabase — Postgres z REST API (supabase-js działa na edge).
Architektura hybrydowa — najlepsze z dwóch światów
Tak, łączenie ze sobą obu jest najlepszym rozwiązaniem. Właśnie najlepsze aplikacje Next.js czerpią z zalet obu runtime'ów. Edge jest kierowany do lekkich operacji globalnych, a Node.js do renderowania, ISR, integracji z bazą i cięższego przetwarzania.
Każdy route może niezależnie deklarować swój runtime i nie musisz wybierać jednego dla całej aplikacji. Tę samą filozofię łączenia statyki z dynamiką na poziomie pojedynczej strony realizuje Partial Prerendering, które warto poznać obok podziału na runtime'y.
