关于 react-native
面向 React Native 移动应用开发的 Expo 技能,介绍如何用 TypeScript 构建 iOS、Android 及 Web 应用。内容覆盖文件路由、云端构建与更新,以及摄像头和通知等原生设备 API。
主要功能
- 01使用 Expo Router 配置文件路由
- 02通过 EAS 构建并提交应用
- 03发布 JavaScript OTA 更新
- 04集成摄像头、通知和触觉模块
- 05处理平台差异与原生模块
适用场景
- 01开发 iOS 与 Android 应用
- 02构建支持 Web 的通用应用
- 03为应用商店配置构建和提交流程
- 04集成相机或推送通知功能
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ oakoss/ agent-skills --skill react-native安装后在 Claude Code 中输入/react-native确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/app-configuration.mdcore-patterns.mddevice-apis.mdeas-workflows.mdexpo-router.mdnative-modules.mdnativewind.mdperformance-patterns.md详细介绍
使用 Expo 的 React Native
概述
Expo 是一个开源框架,可使用单一 TypeScript 代码库,通过 React Native 构建通用原生应用。它提供基于文件的路由(Expo Router)、云构建服务(EAS Build/Submit/Update)以及丰富的原生模块,用于访问设备 API。
适用场景: 面向 iOS 和 Android 的移动应用、支持 Web 的通用应用、需要 OTA 更新的项目、需要使用原生设备 API(相机、通知、触觉反馈)的应用,以及偏好托管基础设施而非纯 React Native 的团队。
不适用场景: 需要大量与 Expo Modules API 不兼容的自定义原生代码的应用、需要集成到现有原生应用中的棕地项目,以及有原生专属 CI/CD 要求的应用。
快速参考
| 模式 | API | 重点 |
|---|---|---|
| Stack 导航 | expo-router 中的 <Stack> | 基于文件,_layout.tsx 定义导航器 |
| Tab 导航 | expo-router 中的 <Tabs> | 使用 (tabs) 目录组和 _layout.tsx |
| Drawer 导航 | expo-router/drawer 中的 <Drawer> | 需要 @react-navigation/drawer |
| 类型化路由 | 使用 /(group)/route 的 href | 在 app.json 中启用 typed-routes |
| 开发构建 | expo-dev-client | 自定义原生代码 + 开发工具 |
| EAS Build | eas build --profile production | 为应用商店进行云构建 |
| EAS Submit | eas submit -p ios / -p android | 自动提交到应用商店 |
| OTA 更新 | eas update --branch production | 仅更新 JS,无需重新构建 |
| 原生模块 | Expo Modules API | 使用 expo-module.config.json 的 Swift/Kotlin |
| 平台代码 | Platform.select() / .ios.tsx | 按平台编写逻辑或整个文件 |
| 样式化列表 | FlatList / FlashList | 虚拟化列表,需要 keyExtractor |
| 相机 | expo-camera | 通过 useCameraPermissions() 获取权限 |
| 通知 | expo-notifications | 通过 getExpoPushTokenAsync() 获取推送令牌 |
| 触觉反馈 | expo-haptics | impactAsync、notificationAsync |
| Tailwind(RN) | NativeWind v4 | 使用 className 属性,在 RN 中使用 Tailwind CSS |
常见错误
| 错误 | 正确做法 |
|---|---|
直接使用 react-navigation,而不是 Expo Router | Expo Router 使用基于文件的路由封装 React Navigation |
忘记在路由目录中添加 _layout.tsx | 每个包含路由的目录都需要布局文件 |
使用 expo start 运行自定义原生代码 | 使用 expo-dev-client 搭配 expo start --dev-client |
原生依赖项发生更改后运行 eas update | 原生更改需要运行 eas build,OTA 仅适用于 JS |
使用 if 硬编码平台检查 | 使用 Platform.select() 或平台专属的文件扩展名 |
| 访问设备 API 前未请求权限 | 使用相机、通知前,务必检查/请求权限 |
长列表使用 ScrollView | 使用 FlatList 或 FlashList 进行虚拟化渲染 |
| 在渲染函数中使用内联样式 | 在组件外部使用 StyleSheet.create() 定义样式 |
FlatList 缺少 keyExtractor | 务必提供 keyExtractor,以确保列表稳定渲染 |
使用 react-native 导入 Expo 提供的 API | 优先使用 expo-* 包,而不是 react-native 对应项 |
委派
- 模式探索:使用
ExploreAgent - 构建/部署审查:使用
TaskAgent - 代码审查:委派给
code-reviewerAgent
如果有
react-patterns技能,请将 React 组件模式和 hooks 委派给它。 如果有tanstack-query技能,请将数据获取和缓存委派给它。 如果有zustand技能,请将客户端状态管理委派给它。 如果有vitest-testing技能,请将单元测试和组件测试模式委派给它。 如果有tailwind技能,请将 Tailwind CSS 实用工具模式委派给它(NativeWind 使用 Tailwind CSS 语法)。 如果有accessibility技能,请将移动端无障碍模式委派给它。