关于 expo-sdk
面向使用 Expo SDK 54+ 的 React Native 开发者,指导应用配置、路由布局及常用库的使用。内容聚焦项目初始化和移动界面开发实践。
主要功能
- 01创建 Expo TypeScript 项目
- 02配置 app.json 与路由
- 03设置根布局 Provider
- 04使用图片、触觉与安全区 API
- 05集成底部弹层和 FlashList
适用场景
- 01搭建 Expo 演示应用
- 02为应用配置 Expo Router
- 03实现移动端弹层和长列表
- 04为界面添加图片缓存与触觉反馈
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ dralgorhythm/ claude-agentic-framework --skill expo-sdk安装后在 Claude Code 中输入/expo-sdk确认已加载。
详细介绍
Expo SDK
概述
Expo SDK 54+ 提供托管式 React Native 开发环境,支持基于文件的路由(Expo Router)、原生模块访问和简化的构建工具。本指南涵盖应用配置、根布局 Provider 模式以及关键的 Expo/RN 库。
前置条件:使用 npx create-expo-app 创建项目,或在 package.json 中使用 Expo SDK 54+
工作流
设置新的 Expo 演示项目:
- 创建项目:
npx create-expo-app [demo-name] --template blank-typescript - 安装核心依赖:
pnpm add expo-router expo-image expo-haptics react-native-reanimated react-native-gesture-handler react-native-safe-area-context @gorhom/bottom-sheet @shopify/flash-list lucide-react-native nativewind tailwindcss@3 - 配置 NativeWind(参见
nativewind技能) - 使用 Provider 堆栈设置根布局
- 在
app.json中配置 scheme、名称和启动画面 - 添加路由组和屏幕
- 运行:
pnpm start(Expo 开发服务器)
添加新库:
- 使用 pnpm 安装:
pnpm add [library] - 检查是否需要在
app.json中配置 Expo 插件 - 如果添加了原生模块,则重建开发客户端:
npx expo prebuild
指南
app.json 配置
演示应用的关键字段:
| 字段 | 用途 |
|---|---|
expo.name | 显示名称 |
expo.slug | URL 安全标识符 |
expo.scheme | 深层链接 scheme(例如,myapp) |
expo.orientation | portrait(演示项目的默认值) |
expo.splash | 启动画面配置 |
expo.ios.bundleIdentifier | iOS bundle ID |
expo.android.package | Android 包名 |
expo.plugins | Expo 配置插件(例如,expo-router) |
根布局 Provider 模式
根目录中的 app/_layout.tsx 使用 Provider 包裹整个应用。标准顺序:
GestureHandlerRootView (flex: 1)
└── SafeAreaProvider
└── ThemeProvider / Context
└── Stack (Expo Router)
GestureHandlerRootView必须位于最外层(手势处理器和底部弹层所必需)SafeAreaProvider向所有后代组件提供安全区域内边距- 应用级上下文 Provider 放在 SafeAreaProvider 和 Stack 之间
- 自定义页眉使用
<Stack screenOptions={{ headerShown: false }} />
expo-image(替代 RN Image)
所有图像渲染都使用 expo-image — 它提供缓存、blurhash 占位符、内容适配模式和动画过渡效果。
关键属性:
source— URI 字符串或本地图像的 require()placeholder— 加载状态的 blurhash 字符串contentFit—'cover'|'contain'|'fill'transition— 淡入时长,单位为毫秒(例如,300)
expo-haptics
在交互时提供触觉反馈:
Haptics.selectionAsync()— 选择、切换时轻触反馈Haptics.impactAsync(ImpactFeedbackStyle.Medium)— 按钮按下、卡片轻触Haptics.notificationAsync(NotificationFeedbackType.Success)— 操作完成
请谨慎使用 — 每次触摸都触发触觉反馈会让人烦恼。
安全区域内边距
适配设备刘海、状态栏和 Home 指示条:
useSafeAreaInsets()— 返回以点为单位的{ top, bottom, left, right }- 应用于屏幕容器:
paddingTop: insets.top - NativeWind 类:使用
pt-[${insets.top}px]或用 SafeAreaView 包裹
@gorhom/bottom-sheet
用于替代 Radix Dialog,适配移动端模态界面模式:
- 用于详情视图、选择、筛选和表单
- 定义吸附点:
snapPoints={['25%', '50%', '90%']} - 背景遮罩:使用
backdropComponent,并支持按下关闭 - 在弹层内使用
BottomSheetScrollView显示可滚动内容 - 需要以
GestureHandlerRootView作为祖先组件
FlashList(替代 FlatList)
来自 @shopify/flash-list 的高性能列表渲染:
- 可直接替换 FlatList,但必须提供
estimatedItemSize属性 estimatedItemSize={80}— 估算每个项目的高度,单位为点- 采用回收架构,实现流畅的 60fps 滚动
- 使用
contentContainerClassName设置 NativeWind 样式
lucide-react-native
适用于 React Native 的图标库(与网页版 lucide-react 一致):
- 导入单个图标:
import { Home, Settings, ChevronRight } from 'lucide-react-native' - 属性:
size、color、strokeWidth - 在移动端和 Web 代码库中使用一致的图标集
StatusBar
按屏幕配置状态栏外观:
- 浅色背景使用
<StatusBar style="dark" /> - 深色背景使用
<StatusBar style="light" /> - 从
expo-status-bar导入
最佳实践
- 使用
style={{ flex: 1 }}将根布局包裹在GestureHandlerRootView中 - 所有图片都使用 expo-image(缓存、blurhash、性能)
- 仅为主要操作(按钮、重要选择)添加触觉反馈,不要为每次触摸都添加
- 为所有 FlashList 组件设置
estimatedItemSize - 将提供程序放在根目录的
_layout.tsx中,而非单独的屏幕中 - 手动设置内边距时使用
useSafeAreaInsets();简单包裹时使用SafeAreaView - 在真实设备上测试触觉反馈并验证性能
反模式
- 使用 React Native
Image而非expo-image - 处理大型数据集时使用
FlatList而非FlashList - 忘记
GestureHandlerRootView(会导致底部弹出层和手势崩溃) - 过度使用触觉反馈,为每次交互都添加反馈
- 硬编码状态栏高度,而不使用安全区域内边距
- 未在 FlashList 上设置
estimatedItemSize(必需属性,会触发控制台警告) - 将
SafeAreaView放在 ScrollView 内(会导致布局问题) - 未将
expo-router插件添加到app.json的 plugins 数组中
评论
支持 Markdown