Przejdź do głównej zawartości

Ż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.

  • 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-loop podpię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.

  1. Sprawdź, który przypadek cię dotyczy. W Next.js 16.3 i nowszym next dev wykrywa agenta i zapisuje zarządzany blok w AGENTS.md oraz plik CLAUDE.md z linią @AGENTS.md. Zacommituj oba pliki. W 16.2 dopisz instrukcję w AGENTS.md samodzielnie. W 16.1 i starszych uruchom w katalogu głównym projektu npx @next/codemod@canary agents-md, który pobiera dokumentację zgodną z wersją do .next-docs/.

  2. Dopisz reguły projektu do AGENTS.md poza znacznikami <!-- BEGIN:nextjs-agent-rules -->. Wszystko między nimi next dev nadpisuje.

    ## 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.
  3. 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 piszeStatus w Next.js 16Zamiast tego
    middleware.ts z export function middlewarePrzestarzałe, przemianowane w 16.0.0proxy.ts z export function proxy (codemod: npx @next/codemod@canary middleware-to-proxy .)
    export const runtime = 'edge'Edge Runtime przestarzały; nieobsługiwany w proxy.ts ani z Cache ComponentsUsuń eksport; domyślny jest Node.js
    revalidateTag('posts')Forma z jednym argumentem przestarzała, błąd TypeScripturevalidateTag('posts', 'max') albo updateTag('posts') w Server Action
    experimental.ppr lub experimental_pprUsunięte w 16cacheComponents: true w next.config.ts
    export const revalidate = 3600 na stronieUsunięte przy włączonych Cache Components'use cache' z cacheLife('hours')
    request.geo, request.ipUsunięte w 15Nagłówki od hostingu albo geolocation() z @vercel/functions na Vercelu
    dynamic(() => import(...), { ssr: false }) w Server ComponentBłąd builduPrzenieś wywołanie do Client Component
    next lintUsunięte w 16Bezpośrednio eslint (codemod: next-lint-to-eslint-cli)
    Slot parallel route bez default.tsxBuild w 16 się nie udajedefault.tsx, który zwraca null albo wywołuje notFound()
    <Image priority>Przestarzałe w 16.0.0fetchPriority="high" albo loading="eager" (lub preload) 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.

Okno terminala
# 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@latest
npx skills add vercel/next.js --skill next-dev-loop

Uruchom npm run dev w drugim terminalu, a potem wpisz /mcp w sesji, żeby potwierdzić, że next-devtools jest połączony.

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.

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.

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.

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.

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.

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.

BramkaPolecenie lub narzędzieCo świeci na czerwono
Typynpx next typegen && npx tsc --noEmitSynchroniczne params, zły PageProps, jednoargumentowe revalidateTag, zmiana typu na serwerze, za którą nie poszedł klient
Lintnpx eslint . plus no-restricted-imports dla modułów server-only i surowego klienta bazyKod serwerowy zaimportowany do Client Component; zapytania tenantów z pominięciem klienta z zakresem
Buildnpx 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
Runtimeget_errors i compile_route przez next-devtools-mcpBłędy hydratacji i runtime, których nie łapie sprawdzanie typów
ZachowaniePlaywright, z instant() z @next/playwright dla nawigacjiObejście uwierzytelniania, nawigacja modala, regresje streamingu, przekroczenie granicy tenanta
Wydajnośćnpx @lhci/cli autorun z budżetami powyżejRegresje 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.

ObjawPrzyczynaNaprawa
Cała strona renderuje się po stronie klienta; generateMetadata nie działa'use client' w page.tsx lub layout.tsxPrzenieś 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.tsAgent napisał kod z Next.js 15npx @next/codemod@canary middleware-to-proxy ., usuń eksport runtime i sprawdź, czy AGENTS.md wciąż ma zarządzany blok
Po mutacji widać stare danerevalidateTag z profilem tam, gdzie użytkownik musi zobaczyć własny zapisUżyj updateTag w Server Action; revalidateTag(tag, 'max') zostaw dla webhooków
Akcja administratora działa dla zwykłego użytkownika przez spreparowany POSTAutoryzacja tylko w proxy.tsDodaj 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 funkcjaMapuj 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 obrazyMatcher obejmuje _next/static i _next/imagePrzywróć negatywny matcher; dodaj test Playwrighta, że arkusz stylów strony zwraca 200
Agent w nowej sesji wciąż pisze kod z Next.js 14Usunię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

Czy ten artykuł Ci pomógł?

Jedno kliknięcie, bez logowania.

wcale bardzo