Przejdź do głównej zawartości

Przepisy dla Reacta to gotowe prompty dla agentów AI, dzięki którym Claude Code, Codex lub Cursor piszą produkcyjny kod w Reakcie 19. Każdy łączy prompt z bramką, która dowodzi wyniku: sprawdzeniem typów, regułami React Hooks, Vitestem z Testing Library i skanem dostępności w Playwright. Zacznij od przypięcia wersji bibliotek: agenci domyślnie sięgają po API, których już nie ma.

Ta strona jest dla programistów Reacta i tech leadów, którzy ustalają konwencje pracy z agentami w zespole. Prosisz agenta o tabelę danych, a on pisze useReactTable, którego TanStack Table v9 już nie eksportuje. Prosisz o formularz i dostajesz z.string().email(), oznaczone w Zod 4 jako przestarzałe. Kod wygląda idiomatycznie, diff ma 600 linii, a do piątku nie przeczytasz go w całości.

  • Blok przypinający wersje do CLAUDE.md, AGENTS.md lub reguły Cursora, który powstrzymuje agenta przed pisaniem kodu pod TanStack Table v8, TanStack Query v4, Zod 3 czy Create React App
  • Jedno polecenie „definicji ukończenia”, które agent uruchamia, zanim zgłosi sukces, więc przeglądasz zieloną bramkę zamiast każdej linii
  • Osiem promptów do typowej pracy z Reactem: komponent z Figmy, tabele danych, stan serwerowy, optymistyczne UI, formularze, refaktoryzacja klas na hooki, wydajność i migracja z Create React App do Vite
  • Tabelę, która pokazuje, jaka bramka łapie jaką klasę błędów i kto zatwierdza zmianę
  • Typowe awarie kodu Reacta pisanego przez agenta i sposób wyjścia z każdej z nich

Agenci uczyli się Reacta na kodzie z wielu lat: z Reacta 16–18, TanStack Table v8 i tutoriali Create React App. Bez przypięcia wersji odtwarzają właśnie to. Wpisz wersje, zakazane API i polecenie kończące pracę tam, gdzie twoje narzędzie czyta instrukcje: do CLAUDE.md dla Claude Code, do AGENTS.md dla Codeksa i do reguły projektu dla Cursora. Claude Code od v2.1.277 czyta też AGENTS.md, gdy projekt nie ma CLAUDE.md.

## Frontend stack (React)
- React 19.3, TypeScript strict, Vite 8, Vitest 5 + Testing Library, Playwright for e2e.
- Server state: TanStack Query v5. Client state: Zustand 5. Forms: React Hook Form 7 + Zod 4
via @hookform/resolvers. Tables: TanStack Table v9 (`useTable` + `tableFeatures`).
- Never write: useReactTable, cacheTime, `import { ReactComponent } from './x.svg'`,
process.env.REACT_APP_*, z.string().email(), `as any`, useState+useEffect loading flags
for server data.
- Before you say a task is done, run `npm run verify` and paste the last 20 lines of output.
- Tests query by role and label, never by class name or test id unless no role exists.

Zamienniki poniżej sprawdziliśmy w opublikowanych definicjach typów wersji z ramki powyżej:

Agent piszeStan na 2026-09-26Pisz zamiast tego
useReactTable(options)Nieeksportowane przez @tanstack/react-table 9.2.4; jest tylko useLegacyTable z /legacy, oznaczone jako przestarzałeuseTable({ ...options, features }) z tableFeatures()
cacheTime w zapytaniuBrak w typach @tanstack/query-core v5gcTime
z.string().email()@deprecated Use z.email() instead w Zod 4.6.5z.email()
import { ReactComponent } from './logo.svg'Tylko Create React Appimport Logo from './logo.svg?react' z vite-plugin-svgr 5
process.env.REACT_APP_API_URLTylko Create React Appimport.meta.env.VITE_API_URL
Flagi ładowania i błędu w useState wokół fetchDziała, ale dubluje to, co robi cachehook useQuery na każdy endpoint

Przepis jest tyle wart, ile sprawdzenie, które po nim następuje. Dodaj jeden skrypt łączący wszystkie bramki i każ agentowi uruchomić go, zanim zgłosi koniec pracy:

{
"scripts": {
"verify": "tsc --noEmit && eslint . --max-warnings 0 && vitest run && playwright test --grep @a11y"
}
}

Użyj konfiguracji flat recommended z eslint-plugin-react-hooks 7 i podnieś react-hooks/exhaustive-deps do error: nieaktualne domknięcia to częsty błąd agentów, a ta reguła łapie je bez człowieka czytającego tablicę zależności. W v7 preset flat to reactHooks.configs.flat.recommended; ciąg plugin:react-hooks/recommended, który agenci często piszą, to starsza forma dla .eslintrc:

eslint.config.js
import reactHooks from 'eslint-plugin-react-hooks';
import { defineConfig } from 'eslint/config';
export default defineConfig([
reactHooks.configs.flat.recommended,
{ rules: { 'react-hooks/exhaustive-deps': 'error' } },
]);

Testy Playwright oznaczone @a11y uruchamiają @axe-core/playwright na każdej stronie, której dotknęła zmiana.

To, jak zmusić agenta do uruchomienia verify, zależy od narzędzia:

Wpisz regułę do CLAUDE.md jak w bloku powyżej. Żeby ją egzekwować, a nie tylko o nią prosić, dodaj hook Stop do .claude/settings.json. Kod wyjścia 2 blokuje zakończenie i oddaje Claude’owi wynik bramki wysłany na stderr:

{
"hooks": {
"Stop": [{ "hooks": [{ "type": "command",
"command": "jq -e '.stop_hook_active' >/dev/null && exit 0; npm run verify >&2 || exit 2" }] }]
}
}

Sprawdzenie stop_hook_active przepuszcza zakończenie przy drugiej próbie, więc błąd, którego Claude nie umie naprawić, kończy turę i trafia do ciebie, zamiast kręcić się w pętli; Claude Code dodatkowo ogranicza wymuszone kontynuacje do ośmiu z rzędu. Wersję, która działa tylko przy zmienionym drzewie roboczym, znajdziesz w automatyzacji hookami. W CI ten sam prompt przyjmuje claude -p.

Scenariusz: masz w Figmie ramkę karty cenowej i chcesz komponentu, który użyje istniejących Button i Card, zamiast wymyślać nowe.

Serwer Figma MCP daje agentowi układ ramki, zmienne i mapowania Code Connect. Plugin Figmy łączy zdalny serwer (https://mcp.figma.com/mcp) ze skillami do zamiany projektu na kod. Sprawdź swoją licencję (seat), zanim zaplanujesz na nim sprint: plany Starter oraz licencje View i Collab w planach płatnych mają do 6 wywołań narzędzi miesięcznie, a licencje Dev i Full w planach Professional, Organization i Enterprise dostają limity minutowe. Szczegóły w Figma MCP i projekt-do-kodu.

Okno terminala
claude plugin install figma@claude-plugins-official
# albo sam serwer; potem w sesji uruchom /mcp, żeby się zalogować:
claude mcp add --transport http figma https://mcp.figma.com/mcp

Skąd wiesz, że zadziałało: lista wartości bez tokenu jest pusta albo wyjaśniona, verify świeci na zielono, a zrzut ze Storybooka obok zrzutu z Figmy zgadza się w twoich breakpointach. Te dwa obrazy porównuje projektant; nikt nie musi czytać klas Tailwinda.

Scenariusz: ekran administracyjny potrzebuje sortowanej, filtrowanej i stronicowanej tabeli 10 000 użytkowników z zaznaczaniem wierszy.

Skąd wiesz, że zadziałało: grep -r "useReactTable\|useLegacyTable" src nic nie zwraca, cztery testy przechodzą, a skan axe nie znajduje naruszeń na stronie. Przy stronicowaniu po stronie serwera wskaż agentowi skill with-tanstack-query z tego samego katalogu.

Scenariusz: 15 komponentów pobiera dane w useEffect i trzyma własne flagi loading i error. Po edycji na innym ekranie dane są nieaktualne.

Skąd wiesz, że zadziałało: grep -rn "useEffect" src/features/users nie pokazuje pobierania danych, test odświeżania listy przechodzi, a lista komponentów zgadza się z plikami w diffie. Mockowanie HTTP przez MSW zamiast mockowania hooków trzyma testy w ryzach: agent nie może ich „naprawić”, mockując to, co testuje.

Scenariusz: przełączenie zadania czeka 400 ms na serwer, a użytkownicy klikają dwa razy.

Użyj useOptimistic z React 19, gdy aktualizacja pochodzi z akcji formularza, a stan jest lokalny dla jednego komponentu. Użyj onMutate / onError / onSettled z TanStack Query, gdy te same dane pojawiają się w kilku miejscach przez cache zapytań.

Skąd wiesz, że zadziałało: przechodzą test wycofania i test podwójnego przełączenia. To w tych dwóch przypadkach kod optymistyczny gubi dane i tylko ta część diffu jest warta ludzkiego spojrzenia.

Scenariusz: formularz ustawień dostaje z serwera błędy walidacji, które lądują przy złym polu albo nigdzie.

Skąd wiesz, że zadziałało: cztery testy przechodzą, a skan axe jest czysty. Jeśli agent sięga po as any, żeby uciszyć typy resolvera, odrzuć zmianę: przypięcie wersji jest błędne albo resolver jest nieaktualny.

Przepisz komponent klasowy na hooki bez zmiany zachowania

Dział zatytułowany „Przepisz komponent klasowy na hooki bez zmiany zachowania”

Scenariusz: 400-liniowy komponent klasowy z logiką w componentDidUpdate, której nikt do końca nie rozumie, i bez testów.

Testy napisz przed refaktoryzacją. Refaktoryzacja, na której „brak zmiany zachowania” masz tylko słowo agenta, jest niezweryfikowana. Metodę opisuje strona o testach charakteryzujących.

Skąd wiesz, że zadziałało: pliki testów są identyczne w commitach z kroku 1 i kroku 2 (git diff HEAD~1 HEAD -- '*.test.tsx' jest pusty, gdy oba commity już istnieją) i przechodzą w obu. Ten diff to jedyna rzecz do sprawdzenia ręcznie.

Scenariusz: lista produktów reaguje na zmianę filtra po kilku sekundach. Odruch, ludzki czy agenta, to owinąć wszystko w memo, useMemo i useCallback.

Najpierw zmierz. Jeśli projekt już kompiluje się z React Compilerem (babel-plugin-react-compiler 1.0.0 w package.json), większość ręcznej memoizacji jest zbędna, a poprawką jest zwykle komponent, który kompilator pominął, albo kosztowne obliczenie w trakcie renderu. Chrome DevTools MCP daje agentowi ślad wydajności prawdziwej strony:

Okno terminala
claude mcp add chrome-devtools --scope user npx chrome-devtools-mcp@latest

Serwer domyślnie wysyła statystyki użycia do Google; dodaj --no-usage-statistics, żeby z tego zrezygnować.

Skąd wiesz, że zadziałało: tabela przed/po pokazuje szybszą interakcję w tym samym śladzie, a diff dotyka tylko komponentów wskazanych przez ślad. Patrz na profiler, nie na kod; jak zamienić tę liczbę w budżet w CI, opisuje strona o testach wydajności.

Scenariusz: projekt na Create React App wciąż stoi na react-scripts 5.0.1, ostatnim stabilnym wydaniu (kwiecień 2022), a jego serwer deweloperski startuje kilka minut.

Skąd wiesz, że zadziałało: grep -rn "REACT_APP_\|react-scripts" src package.json .env* nic nie zwraca, a lista przechodzących testów zgadza się z punktem odniesienia. Większą wersję tego zadania opisuje strona o modernizacji starszego kodu.

Dwa skille z vercel-labs/agent-skills przeglądają kod Reacta według spisanych reguł i instalują się w Claude Code, Codex i Cursor przez to samo CLI. Wartość --skill to nazwa z frontmattera, nie nazwa katalogu:

Okno terminala
npx skills add vercel-labs/agent-skills --skill vercel-react-best-practices
npx skills add vercel-labs/agent-skills --skill web-design-guidelines

vercel-react-best-practices wskazuje kaskady pobierania danych, rozmiar paczki i problemy z renderami; web-design-guidelines zgłasza problemy z dostępnością, fokusem i formularzami jako znaleziska file:line. Używaj ich jako recenzentów po zielonym verify, a nie jako bramki. Więcej opcji znajdziesz na stronie o najlepszych skillach do frontendu.

Jak zweryfikować kod Reacta od agenta bez czytania każdej linii

Dział zatytułowany „Jak zweryfikować kod Reacta od agenta bez czytania każdej linii”
BramkaCo łapieGdzie działaKto zatwierdza
tsc --noEmit ze strictZłe propsy, zgubione generyki, stare API bibliotek, które nie przechodzą sprawdzenia typówpętla agenta, CIautomatycznie
eslint-plugin-react-hooks 7 z exhaustive-deps na errorNieaktualne domknięcia (stale closures), warunkowe hooki, naruszenia Rules of Reactpętla agenta, CIautomatycznie
Vitest + Testing Library + MSWZachowanie: co widzi użytkownik po każdej akcji, łącznie ze ścieżkami błędówpętla agenta, CIautomatycznie; autor przegląda nazwy testów, nie ich treść
Testy charakteryzujące, niezmienione w trakcie refaktoryzacjiDryf zachowania przy refaktoryzacjipętla agenta, CIautor sprawdza, że diff testów jest pusty
Playwright + @axe-core/playwrightBrakujące etykiety, pułapki fokusu, kontrast, roleCIautomatycznie; osoba odpowiedzialna za dostępność przegląda nowe wyjątki
Zrzut ze Storybooka obok FigmyWizualny dryf od projektupull requestprojektant
Ślad wydajności przed/poRegresje w zmienianej interakcjipętla agenta z Chrome DevTools MCPautor; budżet w CI, gdy to ważne

Człowiek przegląda to, czego bramki nie obejmą: kryteria akceptacji, nazwy testów i każdy diff w pliku testu. Kryteria akceptacji zapisz przed promptem; zobacz kryteria akceptacji. Nie pozwól agentowi edytować własnych testów, żeby przeszły; zobacz ochronę wyroczni testowej.

  • Agent pisze API, którego zainstalowana wersja nie ma. Najczęściej useReactTable, cacheTime i z.string().email(). Wyjście: dodaj blok przypinający wersje, wskaż agentowi skill dołączony do biblioteki albo jej pliki .d.ts w node_modules, a resztę niech odrzuci tsc.
  • Nieaktualne domknięcia (stale closures). useCallback lub useEffect czyta stan, którego nie ma w tablicy zależności, więc działa na starych wartościach. Wyjście: exhaustive-deps na error; nigdy nie pozwól agentowi uciszyć reguły komentarzem eslint-disable. Zakaż tego komentarza w review.
  • Testy, które testują mocka. Agent mockuje hook, który sam napisał, i sprawdza, że mock zwrócił to, co mu kazano. Wyjście: mockuj na granicy HTTP przez MSW i odrzucaj testy, które robią vi.mock na testowanym module.
  • Memoizacja na ślepo. memo na każdym komponencie dodaje koszt porównań i ukrywa prawdziwy problem. Wyjście: wymagaj liczby ze śladu dla każdej memoizacji, jak w prompcie o wydajności; przy włączonym React Compilerze usuń ręczną memoizację, której ślad nie uzasadnia.
  • as any na granicach bibliotek. Generyczne tabele i resolvery formularzy gubią wnioskowanie typów, a agent rzutuje. Wyjście: traktuj as any jak nieprzechodzącą bramkę (@typescript-eslint/no-explicit-any na error) i proś o generyczną sygnaturę.
  • Mocki przeciekające między testami. Test przechodzi sam, a pada w całym zestawie. Wyjście: ustaw restoreMocks: true w konfiguracji Vitesta i resetuj handlery MSW w afterEach.
  • Dryf od projektu w Figmie. Agent wpisuje na sztywno kolor lub odstęp. Wyjście: prompt prosi o listę wartości bez tokenu, a projektant porównuje zrzuty ekranu, nie nazwy klas.

Czy ten artykuł Ci pomógł?

Jedno kliknięcie, bez logowania.

wcale bardzo