react-router-v7 — скилл для Claude Code: правила маршрутизации
Скилл с практиками React Router v7: подсказывает, когда брать loader, Form или fetcher, и как настраивать вложенные маршруты.
npx skills add existential-birds/beagle --skill react-router-v7 -a claude-codeЧто делает react-router-v7
Скилл описывает data-driven маршрутизацию в React Router v7. Внутри — настройка роутера через createBrowserRouter и RouterProvider, режим Framework с Vite-плагином и файлом routes.ts, вложенные маршруты с Outlet, динамические сегменты вида teams/:teamId, опциональные :lang? и сплаты files/*.
Отдельный блок — последовательность решений. Агент отвечает на вопросы по порядку и останавливается на первом подходящем API: если URL или история должны меняться, берётся <Form> и route action; если мутация остаётся на том же маршруте, идёт useFetcher(). Похожая развилка для данных: нужны они для первого рендера — loader, а если запрос идёт после монтирования по действию пользователя или таймеру — useEffect.
Есть таблица сравнения трёх режимов: Framework, Data и Declarative. Она пригодится, когда проект уже написан на <BrowserRouter> и вы решаете, стоит ли переезжать. Дополнительные материалы лежат в references/loaders.md, references/actions.md, references/navigation.md и references/advanced.md — там про параллельную загрузку, валидацию, защищённые маршруты и ленивую подгрузку.
Какие задачи решает
- выбрать между
<Form>иuseFetcherдля конкретной мутации - настроить вложенные маршруты с
Outletи индексной страницей - перенести загрузку данных из
useEffectвloader - разобрать динамические сегменты и сплаты в путях
- сравнить Framework, Data и Declarative режимы перед миграцией
Примеры запросов агенту
- Помоги настроить маршруты через
createBrowserRouterдля каталога товаров - Стоит ли здесь
useFetcherили<Form>? Мутация остаётся на той же странице - Перепиши загрузку данных на
loaderи добавьErrorBoundary
Как установить react-router-v7
1Через Skills CLI (Vercel)
npx skills add existential-birds/beagle --skill react-router-v7 -a claude-code2Вручную: положить файлы
~/.claude/skills/react-router-v7/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/react-router-v7/
1Через Skills CLI (Vercel)
npx skills add existential-birds/beagle --skill react-router-v7 -a codex2Вручную: положить файлы
.agents/skills/react-router-v7/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add existential-birds/beagle --skill react-router-v7 -a cursor2Вручную: положить файлы
.cursor/skills/react-router-v7/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install existential-birds/beagle react-router-v72Вручную: положить файлы
.github/skills/react-router-v7/SKILL.md1Через Skills CLI (Vercel)
npx skills add existential-birds/beagle --skill react-router-v7 -a gemini-cli2Командой платформы
gemini skills install https://github.com/existential-birds/beagle --path plugins/beagle-react/skills/react-router-v7Вручную: положить файлы
.devin/skills/react-router-v7/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add existential-birds/beagle --skill react-router-v7 -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о react-router-v7
Как установить react-router-v7 в Claude?
Выполните npx skills add existential-birds/beagle --skill react-router-v7 -a claude-code. Файл скилла окажется по пути ~/.claude/skills/react-router-v7/SKILL.md.
Что делает react-router-v7?
Даёт агенту справочник по React Router v7: конфигурация маршрутов, загрузка данных, мутации, навигация и защищённые маршруты. Агент опирается на него, когда вы пишете код роутинга.
Чем Framework Mode отличается от Data Mode?
В Framework Mode маршруты описываются в routes.ts через Vite-плагин, типы генерируются автоматически и есть встроенный SSR. В Data Mode роутер собирается вручную через createBrowserRouter, типы и SSR настраиваются сами.
Исходный текст
SKILL.md · Apache-2.0
---
name: react-router-v7
description: React Router v7 best practices for data-driven routing. Use when implementing routes, loaders, actions, Form components, fetchers, navigation guards, protected routes, or URL search params. Triggers on createBrowserRouter, RouterProvider, useLoaderData, useActionData, useFetcher, NavLink, Outlet.
---
# React Router v7 Best Practices
## Quick Reference
**Router Setup (Data Mode)**:
```tsx
import { createBrowserRouter, RouterProvider } from "react-router";
const router = createBrowserRouter([
{
path: "/",
Component: Root,
ErrorBoundary: RootErrorBoundary,
loader: rootLoader,
children: [
{ index: true, Component: Home },
{ path: "products/:productId", Component: Product, loader: productLoader },
],
},
]);
ReactDOM.createRoot(root).render(<RouterProvider router={router} />);
```
**Framework Mode (Vite plugin)**:
```ts
// routes.ts
import { index, route } from "@react-router/dev/routes";
export default [
index("./home.tsx"),
route("products/:pid", "./product.tsx"),
];
```
## Route Configuration
### Nested Routes with Outlets
```tsx
createBrowserRouter([
{
path: "/dashboard",
Component: Dashboard,
children: [
{ index: true, Component: DashboardHome },
{ path: "settings", Component: Settings },
],
},
]);
function Dashboard() {
return (
<div>
<h1>Dashboard</h1>
<Outlet /> {/* Renders child routes */}
</div>
);
}
```
### Dynamic Segments and Splats
```tsx
{ path: "teams/:teamId" } // params.teamId
{ path: ":lang?/categories" } // Optional segment
{ path: "files/*" } // Splat: params["*"]
```
## Key Decision Points
### Form vs Fetcher
**Use `<Form>`**: Creating/deleting with URL change, adding to history
**Use `useFetcher`**: Inline updates, list operations, popovers - no URL change
### Loader vs useEffect
**Use loader**: Data before render, server-side fetch, automatic revalidation
**Use useEffect**: Client-only data, user-interaction dependent, subscriptions
## Gates (decision sequencing)
Answer **in order**. **Pass** means the condition is true; pick the API on the same line and **stop**.
### `<Form>` vs `useFetcher`
1. **Must the URL or history stack change** (bookmark/share, back returns to prior screen)?
- **Pass →** `<Form>` / route `action` (or `useSubmit` + navigation). **Stop.**
- **Fail →** Step 2.
2. **Mutation stays on the same route** (inline edit, modal, list row, no address change)?
- **Pass →** `useFetcher()`. **Stop.**
- **Fail →** Re-check step 1; you may need a dedicated action route or POST to the current URL.
### `loader` vs `useEffect`
1. **Is data needed for correct first render** (or your intended `<Suspense>` boundary) for this route?
- **Pass →** `loader` (Framework: `clientLoader` when appropriate). **Stop.**
- **Fail →** Step 2.
2. **Fetch only after mount** from user action, timer, or subscription (not route entry)?
- **Pass →** `useEffect` / event handlers. **Stop.**
- **Fail →** Prefer loader + revalidation over an effect that mirrors navigation.
## Additional Documentation
- **Data Loading**: See [references/loaders.md](references/loaders.md) for loader patterns, parallel loading, search params
- **Mutations**: See [references/actions.md](references/actions.md) for actions, Form, fetchers, validation
- **Navigation**: See [references/navigation.md](references/navigation.md) for Link, NavLink, programmatic nav
- **Advanced**: See [references/advanced.md](references/advanced.md) for error boundaries, protected routes, lazy loading
## Mode Comparison
| Feature | Framework Mode | Data Mode | Declarative Mode |
|---------|---------------|-----------|------------------|
| Setup | Vite plugin | `createBrowserRouter` | `<BrowserRouter>` |
| Type Safety | Auto-generated types | Manual | Manual |
| SSR Support | Built-in | Manual | Limited |
| Use Case | Full-stack apps | SPAs with control | Simple/legacy |
© existential-birds · Apache-2.0 · existential-birds/beagle