expo-router Skill: Writing Expo Router Navigation Conventions into the Agent Context

前言

在 Expo 应用里改导航,常见问题是 Agent 仍按 Web 思维堆 react-navigation 直引、在 app 目录里混放组件,或漏掉原生 Stack、Modal、NativeTabs 的配置方式。官方文档分散在路由结构、Tabs、Header、Form Sheet 等多处,一次对话里很难全部对齐。

expo-router 是 Expo 团队在 expo/skills 里提供的 Framework 类 Skill(MIT,当前资料版本 1.0.1),专门约束 Agent 在 Expo Router 场景下的文件路由、链接导航、原生栈与常见呈现方式。它与 expo-overview、expo-project-structure 等同属官方技能体系;界面样式与动效分别由 expo-native-ui、expo-animation 等 Skill 覆盖。

这是什么

expo-router 是一份面向 AI Agent 的 SKILL.md 说明:当任务涉及 Expo Router 的导航与路由时,Agent 按其中规则选用 API、组织 app 目录,并查阅 bundled 的 references/ 文档(路由约定、NativeTabs、Toolbar/Header、Form Sheet、搜索栏、Apple Zoom 过渡等)。

Expo 文档、Expo CLI、EAS CLI 仍是事实来源;Skill 的作用是减少 Agent 误用旧模式或跨库直引。

核心功能

资料中明确覆盖的能力包括:

  • 文件路由与目录:路由放在 app 目录;动态路由、分组(groups)、文件夹组织;须保证存在匹配 / 的路由(可在 group 内);不在 app 下 co-locate 组件、类型或工具。
  • Link 导航:expo-router 的 <Link href="..." />,支持 asChild;鼓励配合 <Link.Preview>、长按上下文菜单(Link.Trigger、Link.Menu、Link.MenuAction)。
  • 原生 Stack:通过 _layout.tsx 定义;从 expo-router/stack 引入 Stack;页面标题用 <Stack.Title>。
  • Modal 与 Form Sheet:Stack.Screen 的 presentation: "modal" 或 formSheet,含 sheetGrabberVisible、sheetAllowedDetents 等;iOS 26+ 透明背景可与 liquid glass 效果相关(资料原文表述)。
  • NativeTabs:从 expo-router/unstable-native-tabs 使用;资料给出与共享 group 路由、各 Tab 内 Stack 的典型 app/ 结构示例。
  • Header 与搜索:偏好 Stack.SearchBar;详细见 references/search.md、toolbar-and-headers.md。
  • 库与风格约定:文件名 kebab-case;移动或重构导航时删除旧路由文件;tsconfig.json 配置 path alias,优先 alias 而非相对路径;语义色用 expo-router 的 Color;SDK 56+ 不从 @react-navigation/* 直引,改用 expo-router/react-navigation。

Skill 内还列出可按需打开的参考文件路径(均在 references/ 下),例如 route-structure.md、tabs.md、form-sheet.md、zoom-transitions.md(Link.AppleZoom,iOS 18+)。

安装与启用

Expo Skills 对 Cursor 等 Agent 推荐 Skills CLI(Claude Code / Codex 可用官方 Plugin,本文以 CLI 为主,与 Cursor 场景一致)。

在项目根目录安装全部 Expo Skill(含 expo-router):

npx skills@latest add expo/skills --skill '*'

CLI 会询问安装目标;若需指定 Agent,可加 --agent <agent>。安装后重启或刷新 Agent 会话,以便发现 SKILL.md。

仅更新本 Skill:

npx skills@latest update expo-router

更宽泛的 Expo 任务可先让 Agent 加载 expo-overview,再落到 expo-router。

典型用法

下列片段均来自 Skill 正文,用于说明 Agent 被引导生成的代码形态。

基础链接:

import { Link } from 'expo-router';

<Link href="/path" />

<Link href="/path" asChild>
  <Pressable>...</Pressable>
</Link>

Modal 呈现:

<Stack.Screen name="modal" options={{ presentation: "modal" }} />

Form Sheet:

<Stack.Screen
  name="sheet"
  options={{
    presentation: "formSheet",
    sheetGrabberVisible: true,
    sheetAllowedDetents: [0.5, 1.0],
    contentStyle: { backgroundColor: "transparent" },
  }}
/>

根布局 NativeTabs + 分组内 Stack(结构示意):

app/
  _layout.tsx — <NativeTabs />
  (index,search)/
    _layout.tsx — <Stack />
    index.tsx
    search.tsx

根 _layout.tsx 使用 NativeTabs、ThemeProvider(来自 expo-router/react-navigation);共享 group 的 _layout.tsx 用 segment 区分当前 Tab 屏幕,并为动态路由如 i/[id] 单独配置 Stack.Screen。资料注明 SDK 56+ 使用 headerLargeTitleEnabled,旧版 headerLargeTitle 已在上游弃用。

适用场景与注意

适合: 使用 Expo Router 的 React Native / Expo 项目;希望 Agent 搭建 Tab + Stack、Modal/Sheet、带 Preview 的 Link、Header 搜索等原生导航模式;升级或新功能涉及 SDK 56 导航 API 时。

注意:

  • app 目录只放路由,业务组件应放在项目约定目录(常与 expo-project-structure 一致)。
  • NativeTabs 路径为 expo-router/unstable-native-tabs,API 可能随 SDK 演进;Tabs 与 iOS 26 相关说明见 references/tabs.md。
  • 屏幕视觉、颜色体系、动效应切换对应 Skill,避免在本 Skill 外臆造样式方案。
  • 若发现 Skill 内容错误或过时,可向 Expo 提交可执行反馈:
npx --yes submit-expo-feedback@latest --category skills --subject "expo-router" "<actionable feedback>"

反复失败或需结构化评估时,资料建议加载 expo-skill-feedback Skill,而非仅重复上述命令。

结尾

expo-router 把 Expo Router 的文件路由、Link、原生 Stack、Modal/Sheet、NativeTabs 与 Header 搜索等写成 Agent 可执行的约定,是 Expo 官方移动开发 Agent 化里与「路由」直接对应的一块。完整 Skill 与参考文档见:https://github.com/expo/skills/tree/main/plugins/expo/skills/expo-router;整套 Skills 安装与说明见 https://github.com/expo/skills。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye