Edge runtime проти Node.js runtime у Next.js
Рuntime в Next.js
Next.js підтримує два рунтайми для серверного коду: за замовчуванням Node.js runtime та Edge runtime. Кожен з них має різні можливості, характеристики продуктивності та доступність API.
Node.js Runtime (за замовчуванням)
Стандартне середовище Node.js з повним доступом до всіх API Node.js:
// За замовчуванням — без налаштувань
export default async function Page() {
// Повний доступ до API Node.js
const fs = require("fs");
const data = fs.readFileSync("./data.json", "utf-8");
return <div>{data}</div>;
}Edge Runtime
Легкий рунтайм на основі Web APIs (схожий на Cloudflare Workers). Виконується на краях CDN для мінімальної затримки:
// Включення Edge runtime
export const runtime = "edge";
export default function Page() {
return <div>Це виконується на краю!</div>;
}// Edge API маршрут
export const runtime = "edge";
export async function GET(request: Request) {
const { searchParams } = new URL(request.url);
const name = searchParams.get("name");
return Response.json({ hello: name });
}Порівняння
| Особливість | Node.js Runtime | Edge Runtime |
|---|---|---|
| Холодний старт | Повільніше (~250ms) | Дуже швидко (~1-5ms) |
| Локація | Одна область | Краї по всьому світу |
| Максимальний час виконання | Без обмежень (варіюється залежно від хосту) | Обмежений (зазвичай 30с) |
| Розмір пакету | Без обмежень | Обмежений (~1-4MB) |
| Node.js APIs | ✅ Повний доступ | ❌ Обмежений підмножина |
| npm пакети | ✅ Усі | ⚠️ Тільки сумісні з Web API |
| Файлова система | ✅ Модуль fs | ❌ Недоступний |
| Нативні модулі | ✅ Так | ❌ Ні |
| Потокова обробка | ✅ Так | ✅ Так |
| Web APIs | ✅ Так | ✅ Так (нативно) |
Middleware (Завжди Edge)
Middleware у Next.js завжди виконується на Edge runtime:
// middleware.ts — автоматично виконується на Edge
import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
export function middleware(request: NextRequest) {
// Швидке виконання на краю, найближчому до користувача
const country = request.geo?.country || "US";
if (country === "UA") {
return NextResponse.redirect(new URL("/ua", request.url));
}
return NextResponse.next();
}Коли використовувати кожен
Використовуйте Node.js Runtime (за замовчуванням)
- З'єднання з базами даних (Prisma, Drizzle з нативними драйверами)
- Операції з файловою системою
- Важкі обчислення
- Складні npm пакети
- Довготривалі операції
Використовуйте Edge Runtime
- Персоналізація (гео, A/B тестування)
- Перенаправлення та переписування
- Перевірка токенів автентифікації
- Простий API-відповіді
- Коли затримка має найбільше значення
Налаштування рунтайму
// Для кожної сторінки або маршруту
export const runtime = "edge"; // або "nodejs" (за замовчуванням)
// У обробниках маршрутів
export const runtime = "edge";
export async function GET() {
return Response.json({ time: Date.now() });
}Важливо:
Node.js runtime є за замовчуванням і підтримує всю екосистему Node.js. Edge runtime призначений для критичних шляхів продуктивності, які потребують мінімальної затримки та виконуються близько до користувачів. Використовуйте Edge для middleware, простих API та персоналізації. Використовуйте Node.js для доступу до бази даних, операцій з файлами та складної логіки.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.