Expo和React Native的区别是什么?

世博网站

Expo让web开发者只需用JavaScript编写一次,就能构建出能够在iOS和Android上运行的真正原生应用。

这不是React Native所做的吗?有什么不同?

147768 次浏览

当你在Expo中编写代码时,你是在编写React Native代码。世博会已经 两个主要部分:

  1. Expo CLI (expo-cli):一个用于创建项目、查看日志、在设备上打开、发布等的开发工具。

  2. Expo client:手机上的一个应用程序,让你打开你的项目 而不需要通过XCode或Android Studio,也可以让其他人看到它们!如果你通过expo-cli发布它,人们可以在任何时候通过Android或iOS上的Expo客户端访问它,前提是登录到发布它的同一个帐户。最后,我们还允许开发者开发独立应用,这样用户就不需要使用Expo客户端来打开应用,你也可以将应用发布到应用商店和游戏商店中

所以Expo是建立在React Native之上的一套工具。这些工具依赖于Expo上的一个关键信念:只要你有一套全面的面向JavaScript的api,就可以构建大多数应用程序,而不需要编写本地代码。

这一点很重要,因为使用React Native,你总是可以下拉到本地代码。这有时是非常有用的,但它是有代价的:如果你想让他们测试你的二进制文件,你需要把你的二进制文件发给他们,世界另一边的人不能在你工作的时候点击一个链接来打开它,你不能像在浏览器中那样一键发布它,让别人访问它。

对于Expo,我们建议尽量避免使用本地代码,如果可以的话。正如我上面提到的,我们认为JavaScript有了一套全面的api,对于大多数应用程序来说,这应该是不必要的。因此,我们的目标是提供这个全面的api集,然后构建所有可以存在于本机运行时共享世界中的强大工具。

但是,如果你必须发现你想要下拉到本地,你可以使用eject并继续使用Expo提供给你的本地api,同时拥有与任何本地项目相同的控制级别。

< a href = " https://docs.expo。io/workflow/ customization /" rel="noreferrer">阅读更多关于弹出 . io/workflow/ customization /" rel="noreferrer">

在世博会的官方文件中有解释

< a href = " https://docs.expo。io/versions/latest/introduction/faq/# What -is-the-difference-between- Expo and" rel="noreferrer"> Expo和React Native之间有什么区别?< / >

Expo有点像React Native的Rails。很多事情都为你准备好了,所以你可以更快地开始并走上正确的道路。

使用Expo,你不需要Xcode或Android Studio。你只需使用任何你喜欢的文本编辑器(Atom, vim, emacs, Sublime, VS Code,任何你喜欢的)来编写JavaScript。您可以在Mac、Windows和Linux上运行XDE(我们的桌面软件)。

以下是世博会给你的一些开箱即用的东西:

支持iOS和Android

你可以在iOS和Android上直接使用用Expo编写的应用程序。您不需要为每一个单独的构建过程。只需在iOS或Android应用商店的Expo Client应用程序中打开任何Expo应用程序(或在计算机上的模拟器或模拟器中)。

推送通知

推送通知在iOS和Android上都是开箱即用的,使用一个统一的API。你不需要设置APNS和GCM/FCM或配置ZeroPush或类似的东西。我们认为我们现在已经让这件事变得尽可能简单了。

Facebook登录

这可能需要很长时间才能正确设置,但在Expo上应该可以在10分钟或更少的时间内让它工作。

即时更新

所有的Expo应用程序都可以在几秒钟内更新,只需单击Publish in XDE。你不需要设置任何东西;它就是这样运作的。如果你不使用Expo,你可以使用Microsoft Code Push或自己的解决方案来解决这个问题

资产管理

图像、视频、字体等都通过Expo在互联网上动态分发。这意味着它们可以即时更新,并且可以在飞行中更改。Expo内置的资产管理系统负责将回购中的所有资产上传到CDN,因此任何人都可以快速加载。

如果没有Expo,通常的做法是将你的资产捆绑到应用中,这意味着你无法更改它们。或者你必须自己管理把你的资产放在CDN或类似的网站上。

更容易更新到新的React原生版本

我们每隔几周就会发布《Expo》新游戏。如果你愿意,你可以继续使用旧版本的React Native,或者升级到一个新的版本,而不用担心重新构建应用程序二进制文件。您可以自己考虑如何升级JavaScript。

但是没有本地模块……

关于Expo的最大限制是您不能在不分离和使用ExpoKit的情况下添加自己的本地模块。

Brent Vatne的回答很好,但我想添加一些细节。


Expo扩展了React Native的API表面

React Native不能提供所有开箱即用的JavaScript api,只能提供大多数原始功能。React Native开发人员应该使用Android工作室Xcode来链接其他本机库。

Expo旨在增强React Native,并为您最常见的需求提供所需的所有JavaScript api。它基本上是一组定义良好的高质量本机库,已经打包在单个库中:ExpoKit。有时候这些库实际上已经存在于React Native世界中,并集成到ExpoKit中。

同样重要的是要注意,Expo团队不能将所有的库都包含到ExpoKit中(这可能会产生一些挫折),因为< a href = " https://en.wikipedia.org/wiki/%22Hello _World !%22_program" rel="nofollow noreferrer">Hello, World!< / >应用程序的大小会增加,因为它会发布许多在大多数应用程序中不会使用的API。

Expo提供无线JavaScript更新

与其他系统(CodePush等)一样,Expo提供了一个通过空中更新应用程序的系统。这意味着你在CDN上上传你的JavaScript包,移动应用程序将在下次启动时自动下载并使用新的JavaScript代码(不需要从商店请求发布/审查)。

Expo提供了一个CLI工具来上传/管理CDN上的JavaScript包。对于开发,你也可以选择成为CDN并在本地主机上托管JavaScript包。世博会XDE只是CLI上的一个可视包装器。

Expo提供了一个通用客户端

Expo客户端是一个通用客户端,允许加载任何与Expo兼容的应用程序。所有的Expo应用程序共享完全相同的本机运行时(React native + ExpoKit)。唯一的区别是我们提供给它们的JavaScript代码。你发布到应用商店的Expo应用有你的JavaScript包URL硬编码在里面。Expo客户端以特定的方式构建,以便您可以通过扫描二维码或提供URL来选择加载JS的URL。

注意,这个客户端也可以从localhost加载JavaScript包,并使您的开发体验更容易:不需要任何Xcode或Android Studio,它会更快地让您的第一个你好,世界!应用程序在手机上运行(从几个小时到几分钟)。你可以在没有Mac的情况下在iPhone上开发游戏,设置过程只需要2分钟。

实际上,由于Expo SDK可以升级,所以Expo客户端包含了一个兼容层,以便能够运行前五个SDK版本。

Expo提供构建服务

由于所有的Expo应用程序共享相同的本机代码,Expo能够轻松地为您构建这些应用程序。他们创建了一个云构建服务。

由Expo构建的两个应用程序的主要区别在于硬编码的URL,应用程序应该将JavaScript包下载到该URL中运行。

Expo还为你做了一些其他的事情,比如提供一种声明式的方式来设置应用程序图标、方向、权限、API键,帮助你设置推送通知、配置文件……许多设置必须在构建时在应用程序中硬编码,并且不能在空中更改。

Expo之于React Native,就像PhoneGap之于科尔多瓦

React Native类似于Cordova。它不是相同的视图技术(原生视图和webview),但都允许你通过JavaScript控制原生特性,并且都提供插件系统,以便开发人员可以轻松添加新的JavaScript和原生绑定。

PhoneGap类似于Expo。它们都试图用一组预定义的附加本地插件来丰富它们所基于的底层平台的原始API。PhoneGap还提供了一个构建服务和一个通用客户端,只要你使用批准的插件就可以工作。

结论

如您所见,Expo是一套工具。最后,它允许轻松地开发,共享和发布到商店你的移动项目。它与PhoneGap的体验非常相似(但要好得多,也不那么令人困惑)。

对于React Native的新项目,我肯定会推荐Expo,除了以下两种情况:

  • 你已经知道你需要的API在世博会中是不可用的,而且不会很快
  • 你很关心你的应用程序的大小(你好,世界!超过25 MB由于ExpoKit的大,但之后它不会增加太多,因为它只是JavaScript)

世博员工的回答和文件摘要:

React Native init:

优势

  • 您可以添加用Java或Objective-C(可能是唯一但也是最强的一种)编写的本机模块。

缺点

  • 需要Android Studio和Xcode来运行项目
  • 如果没有Mac,你就无法面向iOS开发游戏
  • 设备必须通过USB连接,才能使用它进行测试
  • 字体需要在Xcode中手动导入
  • 如果你想要共享应用,你需要发送整个.apk / .ipa文件
  • 不提供开箱即用的JavaScript api,例如,推送通知,资产管理器,他们需要手动安装和链接与npm为例
  • 正确地设置一个工作项目(包括设备配置)是相当复杂的,可能需要时间

世博会

优势

  • 建立一个项目很简单,可以在几分钟内完成
  • 您(和其他人)可以在工作时打开项目
  • 共享应用程序很容易(通过二维码或链接),你不需要发送整个.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支持)

来源:

世博会CLI

优点:

  1. 无需安装Android Studio或Xcode即可开始构建。
  2. 不需要很多配置。
  3. 使用条形码扫描在Android和iPhone上轻松查看移动UI。通过在线iPhone和Android模拟器也更容易查看。
  4. 更快的设置和开发。

缺点:

  1. 无法添加本机依赖项。
  2. 创建.apk.ipa文件是困难的。
  3. apk/ipa的大小很大。

React Native CLI

优点:

  1. 轻松添加本机依赖项。
  2. 创建.apk.ipa文件比使用Expo要容易得多

注意:React Native CLI是用来直接使用React Native框架的框架。

缺点:

  1. 需要高水平的配置。
  2. 基本了解Android和iOS文件夹结构。

如你所见,这两种方法各有利弊;您应该始终根据项目的需要来决定使用哪一种。

这里我要说明的是,Expo使用的是React的旧版本16.5,这将禁止你使用新的hooks功能。

如果您决定使用Expo,请注意您的版本控制。如果你得到奇怪的错误,旧版本的react-navigation将需要与16.5版本一起使用。

关于Expo和React Native CLI的优点和缺点的答案是完整的。我还想谈谈我的个人经历。

在项目中,默认情况下,Expo包含许多模块,这使得使用它更容易。但它在制作阶段存在一个大问题,因为Android和iOS版本的尺寸太大了。例如,如果你有一个带有“Hello, World!”`时,APK文件大小大约为19 MB。在React Native CLI中使用相同的项目将导致应用程序的大小为6 MB

所以就我个人而言,如果你想开发一款商业应用,我不建议你使用Expo。

我在世博工作了一年多。 如果应用程序的大小对你来说不重要,使用Expo,因为它比React-native更容易实现Map和Push,但在项目结束时,如果你想在谷歌Play或其他商店中发布应用程序,你会遇到一个挑战,即在APK中删除一些权限

在React Native中,你可以改变一切,但对于导入一些库,如推送通知或地图,它也需要一些挑战,因为你必须手动将这些库添加到Android和iOS项目中。

Expo是React Native CLI的包装器,它在底层为开发人员提供方便。Expo解决的最常见的问题是,开发人员不必担心React Native CLI中经常出现的库链接问题。Expo现在提供了大量的库,这些库对健壮的开发非常有帮助。Expo的好处之一是,你可以在没有Mac的情况下通过Expo手机应用开发Android和iOS应用。

虽然它有很多好处,但使用Expo也有一些缺点:

  • 应用程序的大小迅速增加。一个简单的< a href = " https://en.wikipedia.org/wiki/%22Hello _World !%22_program" rel="nofollow noreferrer">Hello, World!< / >应用程序的大小超过30 MB
  • 有时候,当你需要在你的应用程序中实现一些本地功能时,你将需要从Expo中弹出并返回React native CLI。而且您永远无法将其恢复到Expo CLI。

世博员工的回答和文件摘要:

React Native init: 优势< / p >

您可以添加用Java或Objective-C(可能是唯一但也是最强的一种)编写的本机模块。

< p >缺点 需要Android Studio和Xcode来运行项目 如果没有Mac,你就无法面向iOS开发游戏 设备必须通过USB连接,才能使用它进行测试 字体需要在Xcode中手动导入 如果你想分享应用,你需要发送整个。apk / .ipa文件 不提供开箱即用的JavaScript api,例如,推送通知,资产管理器,他们需要手动安装和链接与npm为例 正确地设置一个工作项目(包括设备配置)是相当复杂的,可能需要时间 < p >世博会 优势< / p > 建立一个项目很简单,可以在几分钟内完成 您(和其他人)可以在工作时打开项目 分享应用程序很简单(通过二维码或链接),你不必发送整个。apk或。ipa文件 不需要构建运行应用程序 在标准项目中集成一些基本的库(推送通知,资产管理器等) 您可以将它弹出到ExpoKit,并继续使用Expo的一些功能集成本地代码,但不是所有功能 Expo可以构建.apk和.ipa文件(可以通过Expo分发到商店)

< p >缺点 不能添加本地模块(可能会改变一些游戏规则) 在Objective-C/Java中不能使用使用本机代码的库 标准的Hello World应用程序大约有25MB大(因为集成了库) 如果你想使用:FaceDetector, ARKit或Payments,你需要将其弹出到ExpoKit 将其弹出到ExpoKit有Expo功能的权衡,例如你不能通过QR码分享 当弹出到ExpoKit时,你被限制在由ExpoKit支持的react-native版本 在ExpoKit中调试(带有本机模块)要复杂得多,因为它混合了两种语言和不同的库(不再有官方的Expo支持)

如果你有一个需要快速开发的项目,并选择React Native来构建跨平台应用程序,那么Expo就是为你准备的。通过Expo,您可以快速开发和部署iOS和Android的React Native应用程序。