expo-router — скилл для Claude Code: навигация и маршруты
Скилл для работы с файловой маршрутизацией, стеками, модалями и табами в Expo Router. Пригодится, если вы строите навигацию в мобильном приложении на React Native.
npx skills add expo/skills --skill expo-router -a claude-codeЧто делает expo-router
expo-router учит ассистента работать с файловой структурой маршрутов, динамическими параметрами, группами и вложенными стеками. Скилл охватывает создание ссылок с превью и контекстным меню, настройку нативных Stack и NativeTabs, модальные окна и форм-листы, заголовки и поисковые строки.
Внутри — справочники по структуре маршрутов, табам, заголовкам и тулбарам, форм-листам и поиску. Есть стиль кода: kebab-case для файлов, path aliases вместо относительных импортов, никогда не коллокировать компоненты в app директорию. Предпочитает Color из expo-router вместо raw PlatformColor, в SDK 56+ использует expo-router/react-navigation вместо прямого импорта из @react-navigation/*.
Если ваше приложение использует старше SDK 56, обратите внимание: скилл ссылается на headerLargeTitleEnabled, а старые версии требуют headerLargeTitle.
Какие задачи решает
- настроить файловую маршрутизацию с группами и вложенными стеками
- добавить динамические маршруты с параметрами
- создать нативные табы с переходами между ними
- показать экран как модальное окно или форм-лист
- добавить поисковую строку в заголовок
Примеры запросов агенту
- Создай экран с табами внизу, в каждом табе свой стек маршрутов
- Добавь ссылку с превью и контекстным меню на карточку товара
- Настрой динамический маршрут `/item/[id]` с параметром из URL
Как установить expo-router
1Через Skills CLI (Vercel)
npx skills add expo/skills --skill expo-router -a claude-code2Вручную: положить файлы
~/.claude/skills/expo-router/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/expo-router/
1Через Skills CLI (Vercel)
npx skills add expo/skills --skill expo-router -a codex2Вручную: положить файлы
.agents/skills/expo-router/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add expo/skills --skill expo-router -a cursor2Вручную: положить файлы
.cursor/skills/expo-router/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install expo/skills expo-router2Вручную: положить файлы
.github/skills/expo-router/SKILL.md1Через Skills CLI (Vercel)
npx skills add expo/skills --skill expo-router -a gemini-cli2Командой платформы
gemini skills install https://github.com/expo/skills --path plugins/expo/skills/expo-routerВручную: положить файлы
.devin/skills/expo-router/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add expo/skills --skill expo-router -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
Из того же набора7
Весь набор →Похожие
Вопросы о expo-router
Как установить expo-router для Claude Code?
Выполни npx skills add expo/skills --skill expo-router -a claude-code, затем npx skills add expo/skills --skill expo-router -a claude-code, и откройся файл ~/.claude/skills/expo-router/SKILL.md.
Что делает expo-router?
Это скилл для ассистента, который помогает строить навигацию в приложениях Expo. Учит работать с маршрутами, табами, модалями, ссылками и поисковыми строками по правилам Expo Router.
Какая версия SDK нужна?
Скилл работает с разными версиями, но в SDK 56+ изменилось имя опции headerLargeTitle на headerLargeTitleEnabled. В старших версиях используй названия из документации к твоей версии.
Исходный текст
SKILL.md · MIT
---
name: expo-router
description: Navigation and routing for Expo Router. Covers file-based routes, groups and dynamic routes, folder organization, Link with previews and context menus, native Stack, page titles, modals and form sheets, NativeTabs, headers and toolbars, and header search bars.
version: 1.0.1
license: MIT
---
# Expo Router Navigation
Navigation and routing for Expo Router apps. For screen styling, colors, controls, media, and visual effects, use the `expo-native-ui` skill; for motion and gestures, use `expo-animation`.
## References
Consult these resources as needed:
```
references/
route-structure.md Route conventions, dynamic routes, groups, folder organization
tabs.md NativeTabs, migration from JS tabs, iOS 26 features
toolbar-and-headers.md Stack headers and toolbar buttons, menus, search (iOS only)
form-sheet.md Form sheets in expo-router: configuration, footers and background interaction.
search.md Search bar with headers, useSearch hook, filtering patterns
zoom-transitions.md Apple Zoom: fluid zoom transitions with Link.AppleZoom (iOS 18+)
```
## Code Style
- Always use kebab-case for file names, e.g. `comment-card.tsx`
- Always remove old route files when moving or restructuring navigation
- Never use special characters in file names
- Configure tsconfig.json with path aliases, and prefer aliases over relative imports for refactors.
## Routes
See `./references/route-structure.md` for detailed route conventions.
- Routes belong in the `app` directory.
- Never co-locate components, types, or utilities in the app directory. This is an anti-pattern.
- Ensure the app always has a route that matches "/", it may be inside a group route.
## Library Preferences
- `Color` from `expo-router` for native semantic colors, not raw `PlatformColor` (type-safe, auto-adapts to light/dark). See `expo-native-ui` for the full color palette pattern.
- In SDK 56+, never import from `@react-navigation/*` directly — use `expo-router/react-navigation` instead (covers `@react-navigation/native`, `/core`, `/elements`, `/routers`)
## Behavior
- Prefer `Stack.SearchBar` to add a search bar to a screen
# Navigation
## Link
Use `<Link href="/path" />` from 'expo-router' for navigation between routes.
```tsx
import { Link } from 'expo-router';
// Basic link
<Link href="/path" />
// Wrapping custom components
<Link href="/path" asChild>
<Pressable>...</Pressable>
</Link>
```
Whenever possible, include a `<Link.Preview>` to follow iOS conventions. Add context menus and previews frequently to enhance navigation.
## Stack
- ALWAYS use `_layout.tsx` files to define stacks
- Use Stack from 'expo-router/stack' for native navigation stacks
### Page Title
Set the page title with `Stack.Title`:
```tsx
<Stack.Title>Home</Stack.Title>
```
## Context Menus
Add long press context menus to Link components:
```tsx
import { Link } from "expo-router";
<Link href="/settings" asChild>
<Link.Trigger>
<Pressable>
<Card />
</Pressable>
</Link.Trigger>
<Link.Menu>
<Link.MenuAction
title="Share"
icon="square.and.arrow.up"
onPress={handleSharePress}
/>
<Link.MenuAction
title="Block"
icon="nosign"
destructive
onPress={handleBlockPress}
/>
<Link.Menu title="More" icon="ellipsis">
<Link.MenuAction title="Copy" icon="doc.on.doc" onPress={() => {}} />
<Link.MenuAction
title="Delete"
icon="trash"
destructive
onPress={() => {}}
/>
</Link.Menu>
</Link.Menu>
</Link>;
```
## Link Previews
Use link previews frequently to enhance navigation:
```tsx
<Link href="/settings">
<Link.Trigger>
<Pressable>
<Card />
</Pressable>
</Link.Trigger>
<Link.Preview />
</Link>
```
Link preview can be used with context menus.
## Modal
Present a screen as a modal:
```tsx
<Stack.Screen name="modal" options={{ presentation: "modal" }} />
```
Prefer this to building a custom modal component.
## Sheet
Present a screen as a dynamic form sheet:
```tsx
<Stack.Screen
name="sheet"
options={{
presentation: "formSheet",
sheetGrabberVisible: true,
sheetAllowedDetents: [0.5, 1.0],
contentStyle: { backgroundColor: "transparent" },
}}
/>
```
- Using `contentStyle: { backgroundColor: "transparent" }` makes the background liquid glass on iOS 26+.
## Common route structure
A standard app layout with tabs and stacks inside each tab:
```
app/
_layout.tsx — <NativeTabs />
(index,search)/
_layout.tsx — <Stack />
index.tsx — Main list
search.tsx — Search view
```
```tsx
// app/_layout.tsx
import { NativeTabs } from "expo-router/unstable-native-tabs";
import { ThemeProvider, DarkTheme, DefaultTheme } from "expo-router/react-navigation";
import { useColorScheme } from "react-native";
export default function Layout() {
const colorScheme = useColorScheme();
return (
<ThemeProvider value={colorScheme === "dark" ? DarkTheme : DefaultTheme}>
<NativeTabs>
<NativeTabs.Trigger name="(index)">
<NativeTabs.Trigger.Icon sf="list.dash" md="list" />
<NativeTabs.Trigger.Label>Items</NativeTabs.Trigger.Label>
</NativeTabs.Trigger>
<NativeTabs.Trigger name="(search)" role="search" />
</NativeTabs>
</ThemeProvider>
);
}
```
Create a shared group route so both tabs can push common screens:
```tsx
// app/(index,search)/_layout.tsx
import { Stack } from "expo-router/stack";
import { colors } from "@/theme/colors";
export default function Layout({ segment }) {
const screen = segment.match(/\((.*)\)/)?.[1]!;
const titles: Record<string, string> = { index: "Items", search: "Search" };
return (
<Stack
screenOptions={{
headerTransparent: true,
headerShadowVisible: false,
headerLargeTitleShadowVisible: false,
headerLargeStyle: { backgroundColor: "transparent" },
headerTitleStyle: { color: colors.label },
headerLargeTitleEnabled: true,
headerBlurEffect: "none",
headerBackButtonDisplayMode: "minimal",
}}
>
<Stack.Screen name={screen} options={{ title: titles[screen] }} />
<Stack.Screen name="i/[id]" options={{ headerLargeTitleEnabled: false }} />
</Stack>
);
}
```
`headerLargeTitleEnabled` is the SDK 56+ option name; older SDKs use `headerLargeTitle`, which is deprecated upstream.
## Submitting Feedback
If you encounter errors, misleading or outdated information in this skill, report it so Expo can improve:
```bash
npx --yes @expo/agent-cli@latest feedback --category skills --subject "expo-router" "<actionable feedback>"
```
Only submit when you have something specific and actionable to report. Include as much relevant context as possible.
If an agent repeatedly fails at an Expo task or the user has to step in, submit a brief report of the task, expected result, and what went wrong using `--category evals` and the relevant Expo package or command as `--subject`.
© expo · MIT · expo/skills