开发构建简介
编辑
为什么使用开发构建以及如何入门。
开发构建 是我们用来表示应用程序的“调试”构建的术语,该构建包含 expo-dev-client 库。该库在内置的 React Native 开发工具基础上增加了额外的功能,例如支持检查网络请求以及一个“启动器”界面,允许你在不同的开发服务器之间切换(例如在你本机的服务器与队友的服务器之间)以及应用程序的部署版本(如通过 EAS Update 发布的更新)。
Expo Go 与开发版本的差异
当你使用 npx create-expo-app 创建第一个 React Native 项目并使用 npx expo start 运行时,你很可能会先使用用于开发的 Expo Go 应用进行开发。Expo Go 是 Expo 团队开发并提交到 Google Play Store 和 Apple App Store 的原生应用,方便你快速开始编码。它是一个沙盒应用,内置了大量原生库(请参阅 dependencies list)。这意味着开发者可以在本地机器上更新应用的 JavaScript 代码,并在 Expo Go 上看到更改。
一个 React Native 应用由两部分组成: 原生应用程序(Expo Go) 和 JavaScript 包(npx expo start)。它是不可变的,当你在开发中使用 Expo Go 应用时,你只能依赖 Expo Go 中存在的原生代码和工具。唯一的解决办法是自行构建原生应用程序,而不是使用 Expo 的预打包沙盒。这正是 Development Build 的含义,即你自己的 Expo Go 版本 ,你可以自由使用任意原生库并修改任意原生配置。
本机应用与 JavaScript 包
本地应用程序( Expo Go ) 一旦安装即不可变。需要原生构建工具来创建此打包,并且需要进行签名才能在真实设备上安装。要添加具有原生代码的新库或更改随应用程序打包的元数据(例如应用名称、图标、启动画面),需要重新构建并在设备上重新安装应用。
JavaScript 打包(npx expo start) 是您应用的 UI 代码和业务逻辑所在。在生产应用中,随应用本身一起打包的是一个 main.js 打包。在开发阶段,这个 JS 打包会从本地机器进行热更新。React Native 的主要作用是为 JavaScript 代码提供访问原生 API(Image、Camera、Notifications 等)的方式。然而,只有在本地应用中打包的 API 和库才能使用。

在本教学视频中,Beto 解释了它们各自是什么,以及何时选择 development build。
为何要使用开发构建(也就是说 在 Expo Go 中不能做的事 ,以及原因)
Expo Go 是学习、原型设计和试验的完美工具,但大多数生产应用迟早会转向使用开发构建版本。了解在 Expo Go 中什么是不可能实现以及原因 ,会帮助你在何时以及为何进行这一步迁移时做出明智决定。
使用本地代码库但不在 Expo Go 中
以 react-native-webview 为例,它是一个包含原生代码的库,但 被包含在 Expo Go 中。当你在你的项目中运行 npx expo install react-native-webview 命令时,它会把该库安装到你的 node_modules 目录中,其中既有 JS 代码也有原生代码。但是你正在构建的 JS 代码块 仅 使用 JS 代码。接着,你的 JS 代码块会被上传到 Expo Go,并与已随应用打包的原生代码进行交互。
相反,当你尝试使用未包含的库时,例如 react-native-firebase,你可以使用 JS 代码并热重载新 bundle 到 Expo Go,但它会立即报错,因为 JS 代码试图调用 React Native Firebase 包中在 Expo Go 中不存在的原生代码。除非已经包含在上传到应用商店的 bundle 中,否则无法将原生代码集成到 Expo Go 应用中。
测试应用图标、名称、启动画面的更改
如果你仅在 Expo Go 中开发应用,你可以构建一个商店版本,该版本将使用你提供的值和图片;只是无法在 Expo Go 中进行测试。
这些原生资源与原生 bundle 一起打包,一旦应用安装就不可变。Expo Go 应用确实会显示启动画面,即你的应用图标在纯色背景上。这是一种开发专用的模拟,用于查看启动画面大致会呈现的效果。然而,它是有限制的,例如你不能测试 SplashScreen.setOptions 来为启动画面做动画。
远程推送通知
虽然 in-app notifications 在 Expo Go 中可用,但远程推送通知(即从服务器向应用发送的推送通知)不可用。这是因为推送通知服务应绑定到你自己的推送通知证书,虽然在 Expo Go 中让它工作是可能的,但在生产构建中常常会带来混淆。建议在开发构建中测试远程推送通知,以确保开发和生产之间的行为一致性。
实现 App/通用链接
两者 Android App Links 和 iOS Universal Links 需要本地应用与网站之间建立双向关联。具体而言,要求本地应用中包含被链接网站的 URL。由于上述原生代码不可变,这在 Expo Go 中是不可实现的。
使用较旧的 SDK 打开的项目(仅 iOS 设备)
Expo Go 只能同时支持一个 SDK 版本。当发布新的 SDK 版本时,Expo Go 会更新以支持较新的版本,这将是商店中可安装的唯一 Expo Go 版本。
如果你在 Android 设备、Android 模拟器或 iOS 模拟器上进行开发,兼容版本的 Expo Go 可以 下载安装 。唯一不可能的平台是 iPhone 设备,因为苹果不支持侧加载旧版本应用。
了解如何将现有的 Expo Go 项目迁移到使用开发构建
如何在本地机器上构建开发客户端
如何在 EAS 上构建开发客户端