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 渲染、原生工程管理和云服务集成方面有所不同。
React
用于构建 Web 和原生用户界面的组件化 JavaScript 库。
查看项目React Native
使用 React 和原生平台组件构建 Android、iOS 及更多平台应用的开源框架。
查看项目Flutter
使用 Dart 和自有渲染引擎构建移动、Web 与桌面应用的跨平台 UI 工具包。
查看项目Better Auth
框架无关、类型安全的 TypeScript 认证与授权框架,提供数据库适配器、客户端 SDK 和丰富插件。
查看项目Ionic
基于 Web 技术和 Capacitor 构建跨平台移动、桌面及 Progressive Web App 的 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 日。该状态表示项目近期仍有公开维护活动,不代表固定发布频率或长期支持承诺。