Пошук уроків, статей та іншого контенту
Код, що виконується перед завершенням запиту — для редиректів, авторизації та заголовків.
Файл middleware.ts у корені проєкту визначає код, який виконується перед тим, як запит дістанеться конкретного маршруту — на рівні, що передує самому рендерингу сторінки. Middleware виконується на Edge Runtime (легшому й швидшому середовищі, ніж повноцінний Node.js), тому має обмеження порівняно зі звичайним серверним кодом.
// middleware.ts
import { NextRequest, NextResponse } from "next/server";
export function middleware(request: NextRequest) {
const sessionCookie = request.cookies.get("session");
if (!sessionCookie && request.nextUrl.pathname.startsWith("/profile")) {
return NextResponse.redirect(new URL("/sign-in", request.url));
}
return NextResponse.next(); // пропустити запит далі без змін
}
export const config = {
matcher: ["/profile/:path*"], // middleware виконується лише для цих шляхів
};Без явного matcher middleware виконується для кожного запиту, включно зі статичними файлами й ресурсами — це додає непотрібну затримку. config.matcher звужує middleware до конкретних, справді потребуючих цієї перевірки шляхів.
Визначення локалізації за заголовком Accept-Language й редирект на локалізований маршрут (/uk/..., /en/...).
Додавання чи модифікація заголовків відповіді для всіх запитів одразу (наприклад, заголовки безпеки).
A/B-тестування — розподіл користувачів між варіантами сторінки на рівні, що передує самому рендерингу.
Edge Runtime не підтримує повний Node.js API — деякі бібліотеки (зокрема ті, що покладаються на нативні Node-модулі) не запрацюють у middleware. Middleware також виконується на кожен відповідний matcher-шляху запит, тому важкі обчислення чи повільні зовнішні виклики тут напряму збільшують затримку кожного такого запиту.
Відсутній matcher — middleware виконується для абсолютно кожного запиту, включно зі статичними файлами, додаючи непотрібні накладні витрати.
Важка синхронна логіка чи повільні зовнішні запити всередині middleware — оскільки middleware виконується перед кожним відповідним запитом, будь-яка затримка тут напряму додається до часу відповіді.
Спроба використати повноцінні Node.js-специфічні бібліотеки (наприклад, з прямим доступом до файлової системи) — Edge Runtime підтримує лише обмежену підмножину можливостей.
Middleware виконується на Edge Runtime перед завершенням запиту й підходить для наскрізної логіки: перевірка автентифікації з редиректом, локалізація, модифікація заголовків. config.matcher обмежує, до яких шляхів middleware взагалі застосовується, а обмеження Edge Runtime (немає повного Node.js API) варто враховувати заздалегідь при виборі бібліотек для цього коду.