开发构建
Content
前情提要
我们认识了Expo的主要工具之一expo cli
,并且用它创建新blank项目,在vscode中安装了expo tools插件来协助我们的开发,写了我们的第一个“Hello world” App应用,最后在模拟器和真机里用Expo Go运行和调试。
今天我们来看Expo Go之外的另一个选项,也就是更接近真实App开发环境的模式:开发构建 development build
简介
开发构建是一种包含 expo-dev-client 包的应用程序的调试版本。通过使用开发构建而不是 Expo Go,你可以完全控制原生运行时,因此可以安装任何原生库、修改任何项目配置或编写自己的原生代码。使用 Expo 开发构建,你正在构建自己的原生应用程序,而使用 Expo Go 则是在沙盒化的原生应用环境中运行项目。
当您运行开发构建时,它将如图所示,只是包含您的应用程序名称和图标,而不是只是程序名"Microfoam"。左右两边分别是iOS和Android画面,最边上是启动器 UI。中间两图是应用程序运行在开发构建中打开可自定义开发者菜单的样子。
expo-dev-client
包替换了 React Native 提供的默认应用内开发工具 UI,提供了更强大和可扩展的应用内 UI。它还添加了对网络调试的支持、对启动更新(如来自 PR 预览)的支持,以及添加了启动器 UI。
启动器 UI 使你无需重新构建应用程序二进制文件即可在开发服务器之间切换。这与持续原生生成(CNG: Continuous Native Generation)结合使用效果很好,因为你只需在修改应用程序中的原生代码时生成一个开发构建,然后你可以在不需要重新构建原生代码的情况下迭代 JavaScript 代码,直到下次需要修改它为止。即使没有 CNG,这种方法也非常适合有专门的原生工程师负责原生运行时和应用程序开发人员专门使用 React 的团队,可以实现与原生应用程序相当的迭代速度,而不会有任何折衷。
[!NOTE] 以上内容来自官方网站,以我的理解和实践,这里提到的工具
expo-dev-client
其实不是构建必须的,构建的主要目的是在我们的模拟器或设备上建立一个独立的应用程序前端,由于脱离了Expo Go,它更可以安装任何原生库、修改任何项目配置或编写自己的原生代码。 实际上当我们在项目中运行了expo prebuild
并expo run
之后,它已经成功完成了开发构建。 我们仍然可以用上节课的开发工具来所见即所得地修改代码,实时调试。
创建构建的概念
如果你想要在本地创建开发构建,而不是在EAS上远程创建,你可以使用
npx expo run:android
或者npx expo run:ios
来创建本地构建,或者使用eas build --local
。
开发构建可以使用EAS Build创建,或者在您的计算机上本地创建,如果您安装了Android Studio和Xcode。
在本指南中,您将找到有关使用EAS创建开发构建的信息,以及如何在模拟器/模拟器或物理设备上安装它,以继续开发您的应用程序。
[!NOTE] 按照官方指南的思路,我们现在就要进入EAS这个“大坑“了。 然而,笔者认为我们应该从独立开发者的角度,先把开发构建的基础再次巩固,通过实际操作,看看它是如何起作用的。 在eas之前,我们先引入另一个重要工具prebuild。
关于预构建Prebuild
在原生应用程序可以编译之前,必须生成原生源代码。Expo CLI提供了一个独特而强大的系统,称为预构建(prebuild),它根据四个因素为您的项目生成原生代码:
- 应用配置文件(app.json, app.config.js)。
- 传递给
npx expo prebuild
命令的参数。 - 项目中安装的expo版本及其对应的预构建模板。
- 自动链接,在package.json中发现的原生模块。
用法
可以通过运行以下命令使用预构建:
npx expo prebuild
这将创建android和ios目录以运行您的React代码。如果您手动修改了生成的目录,那么下次运行npx expo prebuild --clean
时,您可能会丢失更改。相反,您应该创建配置插件,即是在预构建期间对原生项目进行修改的函数。
与EAS Build一起使用
如果您的项目不包含android和ios目录,EAS Build将在编译之前运行预构建来生成这些原生目录。这是使用npx create-expo-app创建的任何项目的默认行为。
对于具有android和ios目录的项目,默认情况下EAS Build不会运行预构建,以避免覆盖您对原生目录所做的任何更改。
如果您通过本地编译应用程序(运行npx expo prebuild
,或npx expo run:android
或npx expo run:ios
)来排查问题,您仍然可以在构建过程中使用EAS Build与预构建来生成新的原生目录。在这种情况下,将android和ios目录添加到.gitignore
或.easignore
文件中:
+ android/
+ ios/
与Expo CLI运行命令一起使用
您可以通过运行以下命令在本地执行原生构建:
npx expo run:android
npx expo run:ios
如果原生构建目录不存在,将为特定平台运行一次npx expo prebuild
。在后续使用运行命令时,您需要手动运行npx expo prebuild
以确保原生代码与您的本地配置保持最新同步。
[!NOTE] 由此可见,无论我们用EAS方法(准备后面再讲)还是
expo run
的方法来创建开发构建(development build),都会自动地执行prebuild动作,结果就是在项目中生成ios和android这两个原生目录。
接下来我们就用上一章建立的那个最简项目来实验一下。
操作实验
用vscode打开我们的expo-lesson-blank项目。
直接运行
我们再次使用expo start
,点击任何键之前先按s,命令终端前几行变成了:
› Switching to --dev-client
Development build: Unable to get the default URI scheme for the project. Please make sure the expo-dev-client package is installed.
[...这里有个二维码,先不用管...]
› Metro waiting on http://localhost:8081
› Scan the QR code above to open the project in a development build. Learn more
› Using development build //这里表示正在用开发构建
› Press s │ switch to Expo Go
然后我们再按其他键,调出客户端,看看报错信息(之后就没机会看了😆):
// 苹果是这样
› Opening on iOS...
CommandError: Required property 'ios.bundleIdentifier' is not found in the project app.json. This is required to open the app.
// 安卓是这样
› Opening on Android...
CommandError: Required property 'android.package' is not found in the project app.json. This is required to open the app.
当然我们都应该清楚,问题不只是像上面写的某些配置文件参数没写而已,是因为我们还没做开发构建呢。
实验继续做下去,这次我们不用expo start
了,直接expo run:ios
(别忘了前面加npx
)。
提示输入ios的
bundle identifier
, 我们随便输入:space.suhe.blankexpo,接下来有较为漫长的等待,因为expo cli再为我们构建iOS原生运行所需的文件系统,安装CocoaPods啥的。
此时我们发现项目根目录下新出现了ios目录。
Android的开发构建也可以用这个方式,改个命令参数而已。
如果刚才我们的命令不带ios参数,直接expo run
,在回答一个几个问题后,可以连同Android的工作一起完成,当然包名也要取好,大家最好都一样。同学们可以试试。
等待一段时间后,expo运行启动画面再次出现,iOS模拟器也打开并出现一个对话,点击打开,进入可正常调试开发。
模拟器中,回到iOS桌面,我们看到多了一个图标,名称就是我们的项目名expo-lesson-blank,而不是只有Expo Go了,显然,这次的运行是来自这个新安装的App应用。
现在切换回Expo Go的状态会如何呢?按s,再i, 我们可能会收到一个connection错误,不要紧,模拟器上按Cmd ⌘ + d 调出调试菜单reload一下,就正常了。
我们修改一下项目的代码,发现实时反馈,调试体验也正常。
Expo Go现在之所以还能发生作用,是因为我们的项目中还未新安装任何其他原生组件。
[!TIP] 算是题外话,大家注意一下刚才打开的调试菜单,发现和Expo Go中的长得一样,这就是所谓
expo-dev-client
了,刚才run的过程expo cli已经自动帮我们装好了。 如果不执行刚才的动作,我们先手动运行了expo prebuild
,则可以直接run,但expo这次就不会主动安装这个工具,我们调出来的是和Bare ReactNative时期一样的菜单,当然你可以自己用npx expo install expo-dev-client
命令把它安装好,结果就是在开发调试期间得到一个更强更酷的工具,如果你在乎的话。 这个执行顺序,在作者的一部网络视频课程中呈现过,可以前往观看:React Native expo开发build系列2-Expo实用流程。