Expo
基于 React Native 的通用应用框架与工具平台,覆盖 Android、iOS 和 Web。
项目概述
Expo 为 React Native 提供路由、原生模块、开发构建、持续原生生成和应用发布工具,让团队用 TypeScript 构建并交付 Android、iOS 与 Web 应用。
Expo 是建立在 React Native 之上的开源应用框架和开发工具集合,目标是让一套 React/TypeScript 代码同时服务 Android、iOS 和 Web。Expo SDK 提供相机、通知、位置、安全存储、图片、音视频等经过版本协调的跨平台原生模块;Expo Router 使用 src/app 文件目录生成原生导航和 Web URL,并提供自动 Deep Link、类型化路由、延迟加载与静态 Web 渲染。开发初期可用 Expo Go 快速预览,但正式产品通常应创建包含自身原生依赖和配置的 Development Build。Continuous Native Generation 会根据 app config、依赖和 Config Plugin 按需生成 android/ios 工程,团队也可以选择保留并直接维护原生目录。EAS Build、Submit、Update、Workflows 和 Hosting 是与 Expo 深度集成的可选云服务,分别解决签名构建、商店提交、非原生内容更新、CI/CD 和 Web 托管;不使用 EAS 时仍可通过 Xcode、Android Studio 和 Expo CLI 在本地构建。
主要特点
Expo 把 React Native、通用路由、原生能力、开发构建和发布流程整合为一套可逐步深入原生层的应用平台。
通用 React Native 应用
使用 React、TypeScript 和 React Native 组件共享业务与界面逻辑,同时可通过平台文件和原生 API 定制 Android、iOS 与 Web。
Expo Router 文件路由
src/app 中的文件自动成为原生 Screen 和 Web URL,内置 Stack、Tabs、Deep Link、类型化路由和按路由延迟打包。
版本协调的 Expo SDK
提供相机、通知、位置、媒体、传感器和安全存储等模块,并通过 expo install 选择与当前 SDK 兼容的依赖版本。
Development Build
使用 expo-dev-client 创建团队自己的开发运行时,可包含任意兼容原生库、应用标识和 Config Plugin,不受 Expo Go 固定模块限制。
Continuous Native Generation
Prebuild 根据 app config、Expo SDK、Autolinking 和 Config Plugin 生成原生工程,让原生配置可以声明化并随时重新生成。
EAS Build 与 Submit
可在云端生成并签名 Android/iOS 二进制、共享内部构建,并将成功构建自动提交到 Google Play 或 App Store。
EAS Update
通过 expo-updates 向兼容 Runtime 推送 JavaScript、样式和资源更新,支持 Channel、分阶段发布、监控与回滚到先前更新。
本地与云端流程并存
既可以使用 Expo Go 和 EAS 快速开始,也能运行 expo run、EAS Local Build 或直接使用 Xcode 与 Android Studio 调试原生代码。
适用场景
适合希望共享大部分产品代码、快速覆盖 iOS 和 Android,并保留使用原生模块和平台定制能力的团队。
消费级移动应用
适合电商、内容、社区、生活服务和会员产品,在 iOS 与 Android 共享功能并保留原生导航体验。
跨平台 SaaS 客户端
团队可以复用认证、API、状态管理和设计系统,同时向移动端与 Web 提供一致的核心业务。
创业产品与 MVP
create-expo-app、Expo Router 和 EAS 能减少早期原生工程与签名配置成本,帮助小团队快速验证产品。
企业内部应用
内部 Distribution、Development Build 和 EAS Workflows 适合现场作业、销售、库存及员工工具的持续交付。
硬件与设备能力应用
Expo SDK 和第三方 React Native 库可访问相机、定位、通知、蓝牙与传感器,必要时还能编写 Expo Module。
通用内容与活动应用
Expo Router 的 Deep Link 和 Web 静态渲染适合同时提供可分享链接、移动 App 和浏览器入口的内容体验。
优点与注意事项
技术选型不仅要看能力,也要理解它带来的团队成本。
主要优点
Expo 擅长的地方
- React Native、路由、原生模块和发布工具由一套文档与版本体系协调
- 大部分 TypeScript 业务代码可在 Android、iOS 和 Web 之间复用
- Expo Router 默认解决文件导航、Deep Link、类型化路由和 Web URL
- Development Build 支持任意兼容原生库,并不会把生产应用限制在 Expo Go 中
- CNG 与 Config Plugin 可减少长期手工维护两套原生工程的负担
- EAS 覆盖构建、签名、内部测试、商店提交、更新和工作流自动化
- 团队可以随时使用本地原生工具或直接维护 android/ios 工程,不被云服务锁死
需要注意
采用前应考虑的问题
它只包含固定原生模块和通用配置;需要自定义原生库、应用扩展或完整权限测试时必须使用 Development Build。
每个 Expo SDK 对应特定 React Native、React 和模块版本,升级前应检查 Breaking Changes、第三方库兼容性与原生构建。
当前 create-expo-app 默认行为在 SDK 54 与 57 模板间过渡,新项目应显式指定模板并确认 Expo Go 与目标设备支持情况。
权限、后台任务、推送、键盘、手势、生命周期、商店审核和设备差异不会因使用 Expo 而消失。
执行 prebuild --clean 会重新生成原生目录;使用 CNG 时应把自定义原生变更写成 Config Plugin 或 Expo Module。
触控、导航、字体、安全区域和系统控件在各平台行为不同,共享代码仍需针对真实 Android、iOS 与 Web 设备测试。
云构建和更新能简化交付,但配额、费用、凭据策略和合规要求需评估;敏感团队可本地构建或使用自己的 CI。
EAS Update 只能更新 JavaScript 和资源,原生代码、权限、SDK 或依赖变化需要新二进制,并且必须遵守应用商店规则。
大型列表、图片、动画、启动流程和 Native Bridge 使用方式仍需分析优化,Expo 本身不能替代真机性能测试。
快速开始
使用 SDK 57 模板和 Expo Router 创建一个能在 Android、iOS 与 Web 运行的项目目录,并准备 Development Build 与商店构建。
bashnpx create-expo-app@latest expo-catalog --template default@sdk-57
cd expo-catalog
npx expo starttsximport { Stack } from "expo-router";
export default function RootLayout() {
return (
<Stack>
<Stack.Screen
name="index"
options={{ title: "开源项目" }}
/>
<Stack.Screen
name="projects/[slug]"
options={{ title: "项目详情" }}
/>
</Stack>
);
}tsximport { Link } from "expo-router";
import {
FlatList,
StyleSheet,
Text,
View,
} from "react-native";
const projects = [
{ slug: "expo", name: "Expo" },
{ slug: "react", name: "React" },
];
export default function HomeScreen() {
return (
<View style={styles.container}>
<Text style={styles.title}>开源项目</Text>
<FlatList
data={projects}
keyExtractor={(item) => item.slug}
renderItem={({ item }) => (
<Link href={"/projects/" + item.slug}>
{item.name}
</Link>
)}
/>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
gap: 16,
padding: 24,
},
title: {
fontSize: 28,
fontWeight: "700",
},
});tsximport { useLocalSearchParams } from "expo-router";
import { Text, View } from "react-native";
export default function ProjectScreen() {
const { slug } = useLocalSearchParams<{
slug: string;
}>();
return (
<View>
<Text>项目:{slug}</Text>
</View>
);
}bashnpx expo install expo-dev-client
# 使用本机 Android Studio 或 Xcode 构建
npx expo run:android
npx expo run:ios
# 后续仅修改 TypeScript 时启动开发服务器
npx expo start --dev-clientbashnpm install --global eas-cli
eas login
eas build:configure
eas build --platform all下一步:SDK 57 处于过渡期,创建项目时显式指定模板。Expo Go 适合学习和快速验证,正式应用应尽早使用 Development Build 测试真实原生依赖、权限、图标和启动配置。
类似项目
这些方案同样用于跨平台移动或通用应用,但在 UI 渲染、原生工程管理和云服务集成方面有所不同。
Expo vs React Native CLI
Expo 与 React Native CLI 最终都构建真正的 React Native 应用,也都能使用原生代码。区别主要在于 Expo 提供统一 SDK、文件路由、CNG、Development Build 和 EAS 交付工具,而 React Native CLI 从显式维护 Android/iOS 工程开始。
| 比较维度 | Expo | React Native CLI |
|---|---|---|
| 项目起点 | create-expo-app 与协调好的 Expo SDK | Community CLI 与标准 React Native 原生工程 |
| 原生目录 | 可通过 CNG 按需生成,也可选择提交并手工维护 | android/ios 从创建项目起就是主要源码 |
| 导航 | 新项目默认 Expo Router 文件路由 | 自行选择和配置 React Navigation 等方案 |
| 原生模块 | Expo SDK、第三方库和自定义 Expo Module | React Native 社区库与直接编写原生模块 |
| 开发运行时 | Expo Go 快速预览,生产项目使用 Development Build | 从一开始编译项目自己的 Debug App |
| 构建与签名 | 可用 EAS 云服务,也可在 Xcode/Android Studio 本地完成 | 通常直接使用本地原生工具或自建 CI |
| Web 支持 | Expo Router、React Native Web 与静态渲染集成 | 需要自行增加 React Native Web 和 Web 工具链 |
| 更适合 | 希望快速交付、共享平台代码并减少原生工程维护的团队 | 从第一天就需要深度控制原生工程和定制构建系统的团队 |
大多数新 React Native 应用可以优先从 Expo 和 Development Build 开始,因为它不会阻止使用自定义原生代码,同时能显著简化路由、依赖版本和发布流程;如果团队已有成熟原生基础设施,需要持续直接修改 Gradle、Xcode 工程或采用 Expo 工具尚未覆盖的架构,从 React Native CLI 起步可能更直接。无论选择哪种方式,都应以真机、商店签名和关键原生依赖进行早期验证。
资料核验
版本、维护信息与本页采用的官方资料来源。
本次核验覆盖 Expo 的核心定位、主要能力、官方入口与开源许可。项目版本持续更新,具体补丁版本、兼容性和迁移要求请在采用前继续核对官方发布记录。
官方仓库未归档,核验时最近可见的代码活动日期为 2026 年 7 月 25 日。该状态表示项目近期仍有公开维护活动,不代表固定发布频率或长期支持承诺。