在Expo中编写代码时,实际上是在编写React Native代码。Expo主要由以下两个部分组成:
Expo CLI(expo-cli
):用于创建项目、查看日志、在设备上打开、发布等开发者工具。
Expo客户端:这是您手机上的一个应用程序,在工作时可让您打开项目,而无需通过XCode或Android Studio,并且还可以让其他人查看它们!如果通过expo-cli
发布它,只要使用与发布相同帐户来登录,人们就可以随时通过Android上的Expo客户端或iOS上的Expo客户端访问它。最后,我们还使构建独立应用程序成为可能,因此人们不必使用Expo客户端来打开它,您可以将其分发到应用商店和Play商店。
因此,Expo是构建在React Native之上的一组工具。这些工具依赖于Expo所持有的一个关键信念:只要向JavaScript公开了全面的API集合,就可以构建大多数应用程序而无需编写本机代码。
这很重要,因为使用React Native时,您始终可以降级到本机代码。这有时非常有帮助,但代价是:如果您希望他人测试它们,必须发送二进制文件;当您正在使用时,世界另一端的某个人无法轻松点击链接打开它,并且您不能像在浏览器中那样通过单击一个按钮来发布它。
Expo建议尽可能避免降级到本机代码。正如我上面提到的,我们认为对于大多数应用程序而言,只要具备完整的JavaScript API集合,就不需要这样做。因此,我们旨在提供这个全面的API集合,然后构建所有可以存在于共享本机运行时的神奇工具。
但是,如果您必须发现希望降级到本机,则可以使用eject并继续使用Expo提供的本机API,同时拥有与任何本机项目相同的控制水平。
Expo员工的文档和答案摘要:
.apk
/.ipa
文件.apk
或.ipa
文件.apk
和.ipa
文件(使用Expo可分发到商店)来源:
Brent Vatne的回答很好,但我想补充一些细节。
React Native并没有提供所有您需要的JavaScript API,只提供了大多数原始功能。React Native开发人员需要使用Android Studio或Xcode链接其他本机库。
Expo旨在增强React Native并为最常见的需求提供所有所需的JavaScript API。它基本上是一组已经打包到单个库中的、定义良好的高质量本机库:ExpoKit。有时这些库实际上已经存在于React Native世界中,并集成到ExpoKit中。
另外需要注意的是,Expo团队无法将每个库都包含在ExpoKit中(这可能会导致一些挫败感),因为Hello, World!应用程序大小会增加,因为它会运送许多在大多数应用程序中不会使用的API。
与其他系统(CodePush等)类似,Expo提供了一种更新您的应用程序的方法。这意味着您将JavaScript包上传到CDN,移动应用程序将在下一次启动时自动下载并使用新的JavaScript代码(无需从商店请求发布/审核)。
Expo提供了一个CLI工具,用于在其CDN上上传/管理JavaScript包。对于开发,您还可以选择成为CDN并将JavaScript包托管在本地主机上。而Expo XDE只是CLI的可视化包装。Expo为您提供了一些其他功能,比如以声明方式设置应用程序图标、方向、权限、API密钥,帮助您设置推送通知、配置文件等等... 许多设置必须在构建应用程序时硬编码,并且不能通过空中更改。
React Native与Cordova类似。它们不是相同的视图技术(原生 vs webview),但都允许您从JavaScript控制本机功能,并且都提供了插件系统,使开发人员可以轻松添加新的JavaScript和本机绑定。
PhoneGap类似于Expo。它们都试图使用预定义的一组附加本机插件丰富其所构建的基础平台的原始API。PhoneGap还提供了一个build service和一个generic client,只要您使用批准的插件,它们就可以正常工作。
可以看出,Expo是一组工具。最终,它允许轻松地开发、共享和发布您的移动项目到商店。它与PhoneGap体验非常相似(但更好,更少令人困惑)。
我肯定会推荐Expo用于任何新的React Native项目,除了这两种情况:
在官方的Expo文档中有解释:
Expo有点像React Native的Rails。许多东西都已经为您设置好了,因此更快地入门并走上正确的道路。
使用Expo,您无需Xcode或Android Studio,只需使用任何您熟悉的文本编辑器(Atom,vim,emacs,Sublime,VS Code等)编写JavaScript代码。 Mac、Windows和Linux都可以运行XDE(我们的桌面软件)。
以下是Expo直接提供给您的一些功能:
支持iOS和Android
您可以在iOS和Android上直接使用使用Expo编写的应用程序,无需为每个系统单独构建。只需从App Store(iOS或Android)打开任何Expo应用程序即可(或在计算机上的模拟器或仿真器中打开)。
推送通知
推送通知在iOS和Android上均可直接使用,使用统一的API。 您不需要设置APNS和GCM / FCM或配置ZeroPush或类似的内容。 我们认为现在已经尽可能简单了。
Facebook登录
这可能需要很长时间才能正确设置,但您应该能够在Expo上在10分钟内使其工作。
即时更新
所有Expo应用程序都可以通过在XDE中点击“发布”来在几秒钟内更新。您不需要设置任何内容;它只是以这种方式工作。 如果您没有使用Expo,则要么使用Microsoft Code Push,要么自己解决此问题。
资产管理
图片、视频、字体等都可以通过Expo在互联网上动态分发。这意味着它们支持即时更新并可在运行时进行更改。Expo内置的资产管理系统负责将您存储库中的所有资产上传到CDN,以便任何人都可以快速加载它们。
如果没有使用Expo,则通常要做的是将资产捆绑到应用程序中,这意味着您无法更改它们。或者您需要自己管理将资产放在CDN或类似位置。
更轻松地升级React Native版本
我们每隔几周就会发布新版Expo。您可以选择留在旧版React Native上,也可以升级到新版,而不必担心要重新构建应用程序二进制文件。您可以按自己的时间升级JavaScript。
但不支持本地模块...
Expo最大的限制是您无法添加自己的本地模块,除非脱离Expo并使用ExpoKit。
优点:
缺点:
.apk
和 .ipa
文件很困难。.apk
和 .ipa
的大小巨大。优点:
.apk
和 .ipa
文件。注意:React Native CLI 是直接使用 React Native 框架的框架。
缺点:
如您所见,这两种方法都有其优缺点;您应该根据项目需求决定使用哪种方法。
尽管Expo有很多好处,但使用它也有一些缺点:
我在这里想指出的是Expo正在使用较旧的React版本,即16.5,这将防止您使用新的钩子功能。
如果您决定选择Expo,请注意观察您的版本控制。例如,如果您遇到奇怪的错误,则需要使用较旧的版本,比如react-navigation与16.5版本一起使用。
expo update
在获取由 Expo 管理的大多数包的兼容版本方面做得非常好。目前为止,我认为它不会更新 React Navigation,但是该库实际上是由 Expo 赞助的。就个人而言,我很少遇到 React Navigation 和 Expo 之间的兼容性问题(我想在使用 beta 版本时遇到了一些问题)。但是,您可能会看到更多由 Expo 未管理的包的兼容性问题。 - Jon Doe文档摘要和Expo员工的答案:
React Native init: 优点
您可以添加用Java或Objective-C编写的本地模块(可能是唯一但最强大的)
缺点 需要Android Studio和Xcode来运行项目 没有Mac,无法为iOS开发 设备必须通过USB连接才能用于测试 字体需要在Xcode中手动导入 如果要共享应用程序,则需要发送整个.apk/.ipa文件 不提供JavaScript API,例如Push-Notifications、Asset Manager,需要手动安装并链接npm等 正确设置工作项目(包括设备配置)相当复杂,可能需要时间
Expo 优点
设置项目很容易,几分钟即可完成 您(和其他人)可以在您工作时打开项目 共享应用程序很容易(通过QR码或链接),无需发送整个.apk或.ipa文件 运行应用程序无需构建 在标准项目中集成了一些基本库(推送通知、资产管理等) 您可以将其弹出到ExpoKit并继续使用一些Expo功能集成本地代码,但不是所有功能 Expo可以构建.apk和.ipa文件(使用Expo分发到商店可能)
缺点 您无法添加本地模块(对某些人可能是改变游戏规则的因素) 您无法使用使用Objective-C/Java中的本地代码的库 标准的Hello World应用程序大约有25MB(因为集成了库) 如果要使用:FaceDetector、ARKit或Payments,则需要将其弹出到ExpoKit 将其弹出到ExpoKit会有一些Expo功能的折衷,例如您无法通过QR码共享 当弹出到ExpoKit时,您受限于由ExpoKit支持的react-native版本 在ExpoKit中调试(带有本地模块)更加复杂,因为它混合了两种语言和不同的库(不再有官方Expo支持)