常见问题

编辑页面

关于 Expo 及相关服务的常见问题和限制列表。


For the complete documentation index, see llms.txt. Use this Use this file to discover all available pages.

本页面列出了一些关于 Expo 及相关服务的常见问题和答案。如果你在这里找不到某个问题的答案,请查看 Forums 了解更多常见问题。

Expo 用来做什么?

Expo 是一个用于在 Android、iOS 和 Web 上原生运行应用的 开源框架。Expo 将移动端和 Web 的最佳特性结合起来,并为构建和扩展应用提供许多重要功能,例如实时更新、即时分享你的应用以及 Web 支持。expo npm 包为 React Native 应用提供了一整套令人惊叹的功能。几乎任何 React Native 项目都可以安装 expo 包。更多信息请参见 Expo 提供了什么

公司会使用 Expo 吗?

会,Expo 被全球顶级公司使用,服务于数亿终端用户。请查看我们的 展示案例

为什么 Expo 有自己的 SDK?

Expo 最初创建时,React Native 还没有公开发布。这意味着当时没有第三方包。为了让 React Native 的开发体验更合理,我们创建了一些用于实现常见功能的库。其中许多库后来都被分叉并修改,以满足各种需求。我们欢迎用户按需组合使用他们需要的任何 自定义原生代码,以让他们的应用更出色。

Expo SDK 经过充分测试,使用 TypeScript 编写,有完善文档,并面向 Android、iOS 和 Web 构建。Expo SDK 中的每个模块都协同工作,以确保版本始终匹配。这带来了很好的升级体验。

Expo SDK 还使用 Expo Modules API 编写,使其更易于贡献、维护和理解。

Expo 和 React Native 有什么区别?

expo 包提供了一整套功能,使开发和扩展复杂的 React Native 应用更加容易。你可以在几乎任何 React Native 应用中安装 expo。使用 Expo Application Services (EAS) 或 React Native 并不需要 expo 包,但强烈推荐使用。更多信息请参见 Expo 提供了什么

我需要从 React Native 切换到 Expo 吗?

不需要,expo npm 包和 CLI 可以与任何 React Native 应用配合使用。Expo Application Services (EAS) 也适用于所有 React Native 应用,并对构建、更新、提交应用商店等提供一流支持。

Expo 费用是多少?

Expo 平台是免费且开源的。这包括构成 Expo SDK 的库,以及用于开发的 Expo CLI。最容易上手的 Expo Go 应用也可在应用商店中免费下载。

Expo Application Services (EAS) 是 Expo 团队为 React Native 应用提供的一套可选云服务。EAS 让构建应用、提交到商店、保持更新、发送推送通知等变得更容易。如果你的应用使用量在 免费计划 的配额范围内,你可以免费使用 EAS。更多信息请参见 价格页面

如何向我的 Expo 项目添加自定义原生代码?

Expo 支持添加自定义原生代码并对这些原生代码(Android/Xcode 项目)进行定制。要使用任何自定义原生代码,你可以创建一个 开发构建配置插件。我们确实建议在可能的情况下使用 Expo SDK 中的模块,以便更容易升级并改善开发体验。

我可以在使用 React Native CLI 创建的应用中使用 Expo 吗?

可以!所有 Expo 工具和服务都能在任何 React Native 应用中良好工作。例如,你可以使用 Expo SDK 的任何部分、expo-dev-client 以及 EAS Build、Submit 和 Update——它们都非常好用!了解更多关于在你的项目中安装 expo采用 prebuild 以及设置 EAS Build 的信息。

如何分享我的 Expo 项目?我可以将它提交到应用商店吗?

分享项目最快的方式是使用 EAS Update 发布,并在 开发构建 中启动。这会为你的应用提供一个 URL;你可以把这个 URL 分享给任何拥有 Android 或 iOS 开发构建 的人。URL 也可以在 Android 版 Expo Go 中打开。

准备好后,你可以创建一个生产构建(.aab.ipa)并提交到应用商店。你可以使用 EAS Build 通过一条命令构建应用,并使用 EAS Submit 将其提交到商店。

你还可以使用 内部分发 通过 Android 上的 APK,以及 iOS 上的 ad-hoc 或 enterprise provisioning 来分享你的应用。

我可以在 Windows 电脑上开发 iOS 应用吗?

传统上你需要 macOS 来开发 iOS 应用,不过你可以使用 EAS Build 在云端构建应用。你也可以使用 EAS Submit 将应用提交到商店。测试可以通过在真实 iOS 设备上使用 Expo Go开发构建 来完成。

Expo SDK 支持哪些版本的 Android 和 iOS?

目前,Expo SDK 支持 Android 7+ 和 iOS 15.1+。更多信息请参见 Android 和 iOS 版本支持

一个“hello world” expo 应用的最小体积是多少?

使用纯 Expo 创建的最小生产应用小于 3 MB。对于 iOS,Expo 面向更新的最低 iOS 版本,这使得应用商店优化成为可能。

如果你的应用中包含 expo 包,它只会为应用商店中的最终应用大小一次性增加 1 MB。expo 包的体积开销很小(例如,在 Android 上为 150 Kib)。其余大小来自语言运行时(例如 Android 上的 Kotlin)。

我可以在我的原生库中使用 Expo 吗?

你可以通过使用 Swift 和 Kotlin 创建一个 自定义原生模块 来在 Expo 中使用原生 Android 和 iOS 库。许多流行库已经有自定义原生模块。查看我们的 React Native 目录以找到适合你用例的流行库。

我可以在 Expo 中使用这个 Web 库吗?

许多流行的 Web 包,例如 three.js,都可以与 Expo 和 React Native 一起使用。更多信息请参见 Expo examples

Expo 是否类似于 Web 开发中的 React?

Expo 是一个用于在 Android、iOS 和 Web 上原生运行应用的 开源框架。React Native 类似于 Web 开发中的 react-dom,使你能够在特定平台上运行 React,不过它有几个关键差异:

  • React Native 不支持 HTML 或 CSS。
  • React Native 不使用 DOM,而是使用原生组件。例如,使用 <View /> 而不是 <div />。原生组件比 DOM 性能更好,并提供更出色的用户体验。
  • 与可以访问浏览器 API 的 React.js 不同,React Native 使用自定义原生 API。例如,不使用 navigator.geolocation,而是使用 expo-location 来访问用户位置。自定义原生 API 类似于浏览器 API,不同之处在于你可以完全控制它们。这意味着你可以在新功能进入浏览器之前就使用它们。

就像 React.js 框架帮助用户轻松创建更大型的网站一样,Expo 也帮助用户轻松创建更大型的应用。Expo 提供了一整套经过充分测试的 React Native 模块,可运行于 Android、iOS 和 Web。Expo 还提供了一套用于构建、部署和更新应用的 工具集

关于解释型代码,商店政策是怎样的?

React Native 使用 JavaScript 解释器(JSC、V8 或 Hermes)来运行你的应用代码。请直接参考 Google Play 政策中心Apple Developer Program License Agreement 获取最新政策信息。

以下内容为相关政策摘录,截止于 2024 年 4 月 25 日。

Google Play 商店

...应用不得从 Google Play 之外的来源下载可执行代码(例如 dex、JAR、.so 文件)。此限制不适用于在虚拟机或解释器中运行的代码,前提是该虚拟机或解释器可间接访问 Android API(例如 WebView 或浏览器中的 JavaScript)。 在运行时加载的应用或第三方代码(如 SDK),若使用解释型语言(JavaScript、Python、Lua 等)(例如未与应用一起打包),不得允许可能违反 Google Play 政策的行为。

来源:Google Play 政策中心

Apple App Store

...可以将解释型代码下载到应用中,但前提是该代码: (a) 不会通过提供与应用在提交到 App Store 时所声明和宣传的用途不一致的功能, 或特性,来改变应用的主要用途, (b) 不会为其他代码或应用创建商店或应用内商店,且 (c) 不会绕过操作系统的签名、沙盒或其他安全功能。

来源:3.3.1 APIs and Functionality - B. Executable Code

我应该使用 Expo CLI 还是 React Native Community CLI?

Expo CLI 提供了与 React Native Community CLI(也称为“React Native CLI”)相同的核心功能,并增加了诸如自动 TypeScript 设置Web 支持自动安装兼容库改进的原生构建命令隧道Prebuild 以及更多功能等额外特性。

它可以与 React Native Community 同时使用。无论你使用哪种 CLI,都可以在项目中使用 Expo SDKExpo Application Services 的任何部分。更多信息请参见:

**注意:**EAS Build 与现有 React Native 项目兼容(其中原生目录已纳入版本控制)。当这些目录存在时,EAS Build 不会运行 prebuild 步骤,因为这可能会覆盖你对原生项目文件所做的任何手动自定义。你需要使用 Android Studio 或 Xcode 等原生工具自行配置原生目录。

Expo Go 是开源的吗?

是的,Expo Go 的源代码可以在 expo/expo GitHub 仓库apps/expo-go 目录中找到。Expo Go 应用本身也是使用 Expo 和 React Native 构建的。

我可以用 Expo Go 做什么,不能做什么?

Expo Go 是一个供学生和学习者快速测试 Expo 并了解基础知识的试验场。它允许你使用 Expo SDK 中包含的库,以及不需要自定义原生代码的库。

Expo Go 不能使用需要自定义原生代码的第三方库,你也不能直接在 Expo Go 中编辑原生代码。它的能力有限,不适合构建生产级项目。

我们强烈建议在任何真实项目中使用 开发构建。这就像创建一个专门根据你的应用需求定制的 Expo Go 版本。

“ejecting” 已被弃用了吗?

是的,eject 是一个已弃用的术语,现在已经不再需要了。Expo 刚发布时,应用的原生二进制体积更大,并且如果不进行“ejecting”,就无法支持自定义原生代码。这一情况在 2020 年 12 月随着 EAS Build 的发布而改变,EAS Build 支持任何 React Native 应用。“ejecting”的概念在 SDK 41(2021 年 4 月)中被 npx expo prebuild 命令取代,该命令会根据你项目中的库和应用配置(app.json)持续生成原生项目。expo eject 命令在 SDK 46(2022 年 8 月)中已完全弃用。

与之前的 eject 工作流不同,作者可以通过创建 config plugin 来配置他们的库,使其与 Expo Prebuild 协同工作。这意味着你可以在 Expo Prebuild 中使用任何库。你还可以通过创建 开发构建 来在 Expo Prebuild 中使用任何自定义原生代码。更多信息请参阅 Expo Prebuild 文档