Przepisy optymalizacji Next.js
ENŻeby agent pisał poprawny kod Next.js 16, zrób trzy rzeczy: skieruj agenta do dokumentacji dołączonej do zainstalowanego pakietu next, żeby przestał pisać kod z Next.js 14 i 15, podłącz go do działającego serwera deweloperskiego przez next-devtools-mcp i pozwól, żeby next build, tsc oraz testy Playwrighta udowodniły każdą zmianę. Przepisy dotyczą Next.js 16 i App Routera.
Ta strona jest dla programistów, którzy oddają Claude Code, Codexowi lub Cursorowi pisanie aplikacji Next.js App Router, oraz dla tech leada, który musi zaufać wynikowi. Dashboard od agenta się renderuje, ale agent tworzy middleware.ts z export const runtime = 'edge', wywołuje revalidateTag('posts') z jednym argumentem i wstawia 'use client' na początku strony. Wszystko się kompiluje, build ostrzega, a ostrzeżeń nikt nie czyta.
Co dają te przepisy Next.js
Dział zatytułowany „Co dają te przepisy Next.js”- Konfigurację kontekstu, dzięki której agent czyta dokumentację Next.js dopasowaną do wersji, a nie dane treningowe
- Serwer Next.js DevTools MCP i skill
next-dev-looppodpięte we wszystkich trzech narzędziach, żeby agent sam widział błędy runtime - Osiem promptów do pracy z App Routerem, którą agenci najczęściej psują: streaming, Server Actions, uwierzytelnianie, modale, cache, Proxy, Core Web Vitals i izolacja tenantów
- Tabelę bramek, która zatwierdza zmianę bez czytania każdej linii, oraz tabelę awarii z krokami naprawczymi
Najpierw daj agentowi dokumentację Next.js dopasowaną do wersji
Dział zatytułowany „Najpierw daj agentowi dokumentację Next.js dopasowaną do wersji”Agenci uczyli się Next.js na latach kodu z Pages Routera, z Next.js od 13 do 15 i z wpisów na blogu Vercela. Od Next.js 16.2 pakiet next zawiera własną dokumentację w node_modules/next/dist/docs/, zgodną z zainstalowaną wersją. Twoje zadanie to sprawić, żeby agent przeczytał ją, zanim napisze kod.
-
Sprawdź, który przypadek cię dotyczy. W Next.js 16.3 i nowszym
next devwykrywa agenta i zapisuje zarządzany blok wAGENTS.mdoraz plikCLAUDE.mdz linią@AGENTS.md. Zacommituj oba pliki. W 16.2 dopisz instrukcję wAGENTS.mdsamodzielnie. W 16.1 i starszych uruchom w katalogu głównym projektunpx @next/codemod@canary agents-md, który pobiera dokumentację zgodną z wersją do.next-docs/. -
Dopisz reguły projektu do
AGENTS.mdpoza znacznikami<!-- BEGIN:nextjs-agent-rules -->. Wszystko między niminext devnadpisuje.## Next.js rules for this repo (Next.js 16.3, App Router only)- Read node_modules/next/dist/docs/ before using any Next.js API. Heed deprecation notices.- Request interception lives in proxy.ts (export `proxy`). Never create middleware.ts.- No `export const runtime = 'edge'`. The Edge Runtime is deprecated.- cacheComponents is on: use 'use cache' + cacheLife + cacheTag, never `revalidate`,`dynamic` or `dynamicParams` segment exports.- revalidateTag(tag, 'max') in Route Handlers; updateTag(tag) in Server Actions.- 'use client' only on leaf interactive components, never on page.tsx or layout.tsx.- Every Server Action checks the session and the user's permission itself.- Done means: next typegen && tsc --noEmit, eslint, next build and Playwright all pass. -
Pokaż przestarzałe wzorce także recenzentowi. To API, po które agent sięga najpierw, sprawdzone w dokumentacji dołączonej do
next@16.3.6:Agent pisze Status w Next.js 16 Zamiast tego middleware.tszexport function middlewarePrzestarzałe, przemianowane w 16.0.0 proxy.tszexport function proxy(codemod:npx @next/codemod@canary middleware-to-proxy .)export const runtime = 'edge'Edge Runtime przestarzały; nieobsługiwany w proxy.tsani z Cache ComponentsUsuń eksport; domyślny jest Node.js revalidateTag('posts')Forma z jednym argumentem przestarzała, błąd TypeScriptu revalidateTag('posts', 'max')alboupdateTag('posts')w Server Actionexperimental.pprlubexperimental_pprUsunięte w 16 cacheComponents: truewnext.config.tsexport const revalidate = 3600na stronieUsunięte przy włączonych Cache Components 'use cache'zcacheLife('hours')request.geo,request.ipUsunięte w 15 Nagłówki od hostingu albo geolocation()z@vercel/functionsna Verceludynamic(() => import(...), { ssr: false })w Server ComponentBłąd buildu Przenieś wywołanie do Client Component next lintUsunięte w 16 Bezpośrednio eslint(codemod:next-lint-to-eslint-cli)Slot parallel route bez default.tsxBuild w 16 się nie udaje default.tsx, który zwracanullalbo wywołujenotFound()<Image priority>Przestarzałe w 16.0.0 fetchPriority="high"alboloading="eager"(lubpreload) na jedynym obrazie LCP
Podłącz agenta do działającego serwera deweloperskiego Next.js
Dział zatytułowany „Podłącz agenta do działającego serwera deweloperskiego Next.js”Sprawdzenie typów dowodzi, że kod się kompiluje. Nie pokazuje błędu hydratacji w konsoli przeglądarki ani trasy, która blokuje prerendering. Serwery deweloperskie Next.js 16 wystawiają endpoint MCP pod /_next/mcp, a pakiet next-devtools-mcp (0.4.0) łączy z nim agentów. Wśród jego narzędzi są get_errors, get_routes, get_logs oraz compile_route, które kompiluje jedną trasę na żądanie, i get_compilation_issues, które zwraca bieżące błędy kompilacji całego projektu. Oba działają tylko z Turbopackiem i nie wymagają pełnego next build. Szczegóły znajdziesz w opisie serwerów MCP dla serwerów deweloperskich Next.js i innych frameworków.
# Terminal, w katalogu głównym projektu. -s project zapisuje .mcp.json, więc zespół go współdzieli.claude mcp add -s project next-devtools -- npx -y next-devtools-mcp@latestnpx skills add vercel/next.js --skill next-dev-loopUruchom npm run dev w drugim terminalu, a potem wpisz /mcp w sesji, żeby potwierdzić, że next-devtools jest połączony.
# Terminal. Zapisuje serwer w ~/.codex/config.toml.codex mcp add next-devtools -- npx -y next-devtools-mcp@latestnpx skills add vercel/next.js --skill next-dev-loopUruchom codex mcp list, żeby potwierdzić wpis, i trzymaj npm run dev włączone, dopóki sesja pracuje.
Dodaj ten sam serwer do .cursor/mcp.json w katalogu głównym projektu, a skill zainstaluj z terminala poleceniem npx skills add vercel/next.js --skill next-dev-loop.
{ "mcpServers": { "next-devtools": { "command": "npx", "args": ["-y", "next-devtools-mcp@latest"] } }}next-dev-loop wymaga Next.js 16.3 lub nowszego z Turbopackiem oraz CLI agent-browser w wersji 0.31.1 lub nowszej: npm install -g agent-browser && agent-browser install. Gdy czegoś brakuje, skill podaje, jak zaktualizować, i przerywa pracę.
Skill next-dev-loop zamienia to połączenie w cykl: sprawdź, zmień, zweryfikuj. Korzysta z serwera MCP i z CLI agent-browser, który daje widok przeglądarki. Do sprawdzania stron w przeglądarce poza tym cyklem dodaj Playwright MCP albo Playwright CLI. Pozostałe skille Next.js z vercel/next.js (next-cache-components-adoption, next-cache-components-optimizer, next-partial-prefetching-adoption) opisujemy razem z innymi skillami frontendowymi.
Streamuj dashboard z niezależnymi granicami Suspense
Dział zatytułowany „Streamuj dashboard z niezależnymi granicami Suspense”Dashboard wykonuje cztery niezależne wywołania danych, a strona czeka na najwolniejsze. Rozwiązaniem jest osobna granica <Suspense> dla każdej sekcji. Chodzi o to, żeby agent nie owinął wszystkiego w Promise.all ani nie przeniósł strony na klienta.
Funkcja pomocnicza instant() z @next/playwright zawęża asercje do interfejsu dostępnego w chwili nawigacji. Test nie przejdzie, jeśli późniejsza zmiana znowu zablokuje trasę, a właśnie tej regresji code review prawie nigdy nie wyłapuje.
Buduj formularze na Server Actions, które same sprawdzają uprawnienia
Dział zatytułowany „Buduj formularze na Server Actions, które same sprawdzają uprawnienia”Server Actions wyglądają jak wywołania funkcji, ale dokumentacja Next.js mówi wprost, że są „osiągalne bezpośrednimi żądaniami POST”. Agent, który sprawdza sesję w proxy.ts i ufa temu wewnątrz akcji, zostawia endpoint otwarty dla każdego, kto powtórzy żądanie.
Przy akcji, która zmienia dane zalogowanego użytkownika, dopisz do promptu jedno zdanie: „call updateTag for the tag the page reads, so the user sees the change on the next render”. updateTag działa tylko w Server Actions; Route Handler obsługujący webhook używa revalidateTag(tag, 'max').
Chroń trasy przez Proxy i warstwę dostępu do danych
Dział zatytułowany „Chroń trasy przez Proxy i warstwę dostępu do danych”Przy uwierzytelnianiu agenci najczęściej zacierają granicę między serwerem a klientem. W Next.js 16 proxy.ts działa na runtime Node.js, a dokumentacja zaleca go tylko do sprawdzeń optymistycznych: odczytu ciasteczka sesji bez zapytania do bazy. Prawdziwa kontrola należy do miejsca, w którym są dane. Zanim napiszesz prompt, wybierz jedną bibliotekę: Auth.js v5 jest wciąż pod tagiem beta, a Better Auth (better-auth 1.7.6) to drugi częsty wybór w projektach z App Routerem.
Zacznij w trybie planowania (/plan), żeby przejrzeć listę plików, zanim powstanie jakikolwiek kod. Po zmianie uruchom /code-review i poproś o listę wszystkich Server Actions i Route Handlerów, które nie wywołują verifySession(). W CI ten sam audyt działa bez interfejsu przez claude -p "…" --tools "Read,Grep,Glob", więc recenzent nie może edytować tego, co audytuje.
Wykonaj zmianę w osobnym worktree, żeby niedokończony proxy.ts nie zepsuł działającego serwera deweloperskiego: codex exec --worktree --sandbox workspace-write "…". Potem poproś drugą sesję, tylko do odczytu (codex exec --sandbox read-only), o tę samą listę niechronionych akcji i handlerów.
Listę plików przygotuj w Plan Mode, a implementację zleć agentowi w worktree. Przejrzyj w edytorze diff proxy.ts i lib/dal.ts. Te dwa pliki zawierają wszystkie decyzje, reszta to okablowanie. Bugbot na pull requeście jest drugim recenzentem, nie bramką.
Otwieraj szczegóły produktu w modalu dzięki intercepting routes
Dział zatytułowany „Otwieraj szczegóły produktu w modalu dzięki intercepting routes”Szczegóły produktu mają się otwierać w modalu z siatki, a jako pełna strona przy bezpośrednim wejściu lub odświeżeniu. Agenci zwykle trafiają z nazwami katalogów, ale gubią dwie rzeczy: default.tsx, którego Next.js 16 wymaga teraz dla każdego slotu parallel route, oraz zachowanie po odświeżeniu.
Buforuj bloga przez Cache Components i rewalidację na żądanie
Dział zatytułowany „Buforuj bloga przez Cache Components i rewalidację na żądanie”Dawny przepis na bloga z 500 wpisami to Incremental Static Regeneration z export const revalidate. Przy cacheComponents: true tych eksportów segmentu już nie ma. Cache deklarujesz na funkcji danych przez 'use cache', a webhook z CMS-a unieważnia właściwy tag.
Prowadź testy A/B i flagi funkcji w proxy.ts
Dział zatytułowany „Prowadź testy A/B i flagi funkcji w proxy.ts”Proxy to dobre miejsce na podział wariantów przez ciasteczko i na przekazywanie flag do Server Components w nagłówkach żądania. To złe miejsce na cokolwiek wolnego, bo działa przy każdym dopasowanym żądaniu, łącznie z prefetchami.
Popraw Core Web Vitals z budżetem, którego pilnuje CI
Dział zatytułowany „Popraw Core Web Vitals z budżetem, którego pilnuje CI”Lighthouse pokazuje wynik wydajności 65, LCP 4,2 s i CLS 0,25. Poprawki są rutynowe: next/image z fetchPriority="high" na jedynym obrazie LCP, next/font, szkielety o stałych wymiarach i useTransition na filtrze. Trwały efekt daje dopiero budżet w CI: dzięki niemu następna zmiana od agenta nie cofnie tych poprawek.
Dodaj serwer Chrome DevTools MCP (claude mcp add chrome-devtools --scope user npx chrome-devtools-mcp@latest, wersja 1.10.1), żeby agent sam nagrał ślad wydajności dla http://localhost:3000 i odczytał element LCP, zamiast zgadywać, który to obraz.
Uruchom poprawkę przez codex exec --worktree z promptem poniżej, a potem otwórz pull request z liczbami Lighthouse sprzed zmiany i po niej w opisie. Worktree oddziela gałąź wydajnościową, dopóki budżety się nie ustabilizują.
Pozwól agentowi przejść przez edycje komponentów w wielu plikach i sprawdź w każdym diffie fetchPriority="high": należy się jednemu obrazowi na stronę. Wysoki priorytet na każdym obrazie spowalnia LCP, zamiast go przyspieszać. Jeśli agent napisze priority, zamień je: Next.js 16 oznaczył ten prop jako przestarzały.
Lighthouse to test laboratoryjny bez interakcji użytkownika, więc nie zmierzy Interaction to Next Paint. Laboratoryjnym odpowiednikiem jest total blocking time, a INP z terenu daje useReportWebVitals w prawdziwych sesjach. Według progów Core Web Vitals Google na web.dev (sprawdzone 2026-09-26) „dobre” wartości to LCP do 2,5 s, CLS do 0,1 i INP do 200 ms. Testy obciążeniowe poza samą stroną opisujemy w testach wydajności z agentami.
Izoluj tenantów w SaaS dla wielu klientów
Dział zatytułowany „Izoluj tenantów w SaaS dla wielu klientów”SaaS, który kieruje tenantów po subdomenie, psuje się w jeden istotny sposób: jeden tenant widzi wiersze drugiego. Jedynym dowodem, który przetrwa następny refaktor agenta, jest opakowanie zapytań ograniczone do tenanta plus test, który próbuje przekroczyć tę granicę.
Do bezpieczeństwa typów end-to-end między serwerem a klientem nadal możesz użyć tRPC 11 (@trpc/server 11.19.0). Server Actions i Route Handlery z typami PageProps wystarczają jednak większości aplikacji na App Routerze. Niezależnie od wyboru dowód jest ten sam: zmień typ zwracany po stronie serwera i potwierdź, że tsc --noEmit zgłasza błąd w komponencie, który go używa.
Jak weryfikować kod Next.js od agenta bez czytania każdej linii
Dział zatytułowany „Jak weryfikować kod Next.js od agenta bez czytania każdej linii”Czytaj diffy proxy.ts, lib/dal.ts, next.config.ts i każdego pliku, który eksportuje Server Action. Resztę niech udowodnią bramki.
| Bramka | Polecenie lub narzędzie | Co świeci na czerwono |
|---|---|---|
| Typy | npx next typegen && npx tsc --noEmit | Synchroniczne params, zły PageProps, jednoargumentowe revalidateTag, zmiana typu na serwerze, za którą nie poszedł klient |
| Lint | npx eslint . plus no-restricted-imports dla modułów server-only i surowego klienta bazy | Kod serwerowy zaimportowany do Client Component; zapytania tenantów z pominięciem klienta z zakresem |
| Build | npx next build (dodaj --debug-prerender, gdy sam błąd buildu nie wystarcza) | Trasy blokujące prerendering, ssr: false w Server Component, slot bez default.tsx |
| Runtime | get_errors i compile_route przez next-devtools-mcp | Błędy hydratacji i runtime, których nie łapie sprawdzanie typów |
| Zachowanie | Playwright, z instant() z @next/playwright dla nawigacji | Obejście uwierzytelniania, nawigacja modala, regresje streamingu, przekroczenie granicy tenanta |
| Wydajność | npx @lhci/cli autorun z budżetami powyżej | Regresje LCP i CLS, ciężki JavaScript |
Każ agentowi uruchomić te same bramki, zanim zgłosi koniec pracy. W Claude Code dodaj do .claude/settings.json hook Stop, który uruchamia npx tsc --noEmit && npx next build i kończy się kodem 2, gdy któreś polecenie zawiedzie. Kod 2 odsyła agentowi stderr hooka zamiast kończyć turę, dlatego polecenie przekierowuje wynik builda na stderr:
{ "hooks": { "Stop": [ { "hooks": [ { "type": "command", "command": "cd \"$CLAUDE_PROJECT_DIR\" && { npx tsc --noEmit && npx next build; } 1>&2 || exit 2", "timeout": 600 } ] } ] }}Stop nie przyjmuje pola matcher. Żeby nieudany build nie zapętlił agenta, sprawdzaj stop_hook_active w osobnym skrypcie; zobacz automatyzację hookami. W Codexie i Cursorze wpisz linię „Done means” z bloku reguł do AGENTS.md albo do Rules i wymagaj wyniku poleceń w podsumowaniu. Programista, do którego należy pull request, zatwierdza wyniki bramek i cztery wymienione pliki; resztę egzekwuje CI. Jak taki przegląd działa w skali zespołu, opisujemy w przeglądzie pull requestów od agentów.
Kiedy kod Next.js od agenta się psuje
Dział zatytułowany „Kiedy kod Next.js od agenta się psuje”| Objaw | Przyczyna | Naprawa |
|---|---|---|
Cała strona renderuje się po stronie klienta; generateMetadata nie działa | 'use client' w page.tsx lub layout.tsx | Przenieś dyrektywę do najmniejszego interaktywnego liścia; dodaj regułę ESLint albo grep w CI, który blokuje 'use client' w page.tsx i layout.tsx |
Build ostrzega o przestarzałym middleware albo pada na eksporcie runtime w proxy.ts | Agent napisał kod z Next.js 15 | npx @next/codemod@canary middleware-to-proxy ., usuń eksport runtime i sprawdź, czy AGENTS.md wciąż ma zarządzany blok |
| Po mutacji widać stare dane | revalidateTag z profilem tam, gdzie użytkownik musi zobaczyć własny zapis | Użyj updateTag w Server Action; revalidateTag(tag, 'max') zostaw dla webhooków |
| Akcja administratora działa dla zwykłego użytkownika przez spreparowany POST | Autoryzacja tylko w proxy.ts | Dodaj requireRole() w akcji; dodaj test Playwrighta z bezpośrednim POST-em z przepisu o uwierzytelnianiu |
| Server Action lub strona pada z błędem serializacji „Only plain objects” | Przez granicę serwer–klient przeszła instancja klasy (encja ORM, Decimal) albo funkcja | Mapuj wyniki na zwykłe obiekty w warstwie danych, zanim trafią do Client Component lub opuszczą akcję; dodaj test jednostkowy, który sprawdza, że zwracana wartość jest zwykłym obiektem |
| Po zmianie w Proxy przestają się ładować CSS lub obrazy | Matcher obejmuje _next/static i _next/image | Przywróć negatywny matcher; dodaj test Playwrighta, że arkusz stylów strony zwraca 200 |
| Agent w nowej sesji wciąż pisze kod z Next.js 14 | Usunięty blok w AGENTS.md albo brak dołączonej dokumentacji (16.1 i starsze) | Uruchom next dev z sesji agenta (albo npx @next/codemod@canary agents-md w 16.1 i starszych), żeby przywrócić blok, a potem go zacommituj |
Dokąd dalej z Next.js i agentami
Dział zatytułowany „Dokąd dalej z Next.js i agentami”- Zacznij od przeglądu przepisów frontendowych, jeśli pracujesz też z Angularem, Vue lub Nuxtem.
- Wzorce na poziomie komponentów rozwiniesz w przepisach dla Reacta.
- Kryteria akceptacji, które kodują twoje testy Playwrighta, opisujemy w kryteriach akceptacji, które agent może zweryfikować.
- Zestaw testów end-to-end, na którym stoją bramki, zbudujesz według testów end-to-end z agentami.
- Aktualną dokumentację do reszty stosu da agentom Context7.
- Aplikację w kontenerze wdrożysz według wzorców Dockera, a API za nią zaprojektujesz według wzorców tworzenia API.
Czy ten artykuł Ci pomógł?
Jedno kliknięcie, bez logowania.
Co z tym zrobisz?
Jak się czytało?
Co przeszkadzało? Możesz zaznaczyć kilka
Twoja rola?
Dzięki. Czytam każdą odpowiedź. Michał Jaskólski
Pomógł Ci ten artykuł?
Każde to jedno kliknięcie. Zamknij, kiedy chcesz.
bez logowania