Expo和React Native有什么区别?

341

来自Expo网站

Expo让Web开发者只需用JavaScript编写一次代码,即可在iOS和Android系统上构建真正的本地应用程序。

这不是React Native的功能吗?有什么区别?

12个回答

312

在Expo中编写代码时,实际上是在编写React Native代码。Expo主要由以下两个部分组成:

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

  2. 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,同时拥有与任何本机项目相同的控制水平。

阅读有关弹出的更多信息


8
“使用 Exponent,您无法降级到本地代码。” 很高兴知道您不必降级到本地代码,但如果需要,为什么 Exponent 会阻止您这样做呢? - Otto
4
我了解到之前的表述可能有些不清晰。Exponent客户端是完全开源的(https://github.com/exponentjs/exponent),这意味着如果您愿意,可以编写本地代码,但实际上您只是将Exponent库视为其他典型的React Native应用程序中本地模块的集合。这完全没有问题,也是我们开源项目的动力。但是,如果您想使用我们的工具(应用程序二进制文件构建器、在应用程序/Play商店中的Exponent客户端以共享测试构建、内置推送通知等),则不能编写本地代码。 - brentvatne
4
写作时,Expo已经相当擅长集成有用的本地插件。然而,它们缺乏一个重要的IAP插件集成,没有它,你就无法从你的应用中赚钱!!!你会问,如果我不能获利,做一个应用的意义何在!! - Adam
ExpoLink现已被弃用/即将被弃用,将被Expo Bare Workflow所取代。 - ATYB
1
我找不到一个清晰的说明关于Expo构建和推送通知服务是如何工作的,但似乎如果你选择Expo,你将依赖他们基于云的构建系统,并且只能通过他们的后端接收推送通知。我不知道Expo应用程序依赖哪些其他服务;我希望有人能更详细地解释一下。 - Sean O'Dell
不用担心- 您可以在您的机器上构建:https://docs.expo.io/distribution/turtle-cli/ - 或者您也可以随时弹出并构建。如果您喜欢,您还可以直接使用FCM或APNS https://docs.expo.io/push-notifications/sending-notifications-custom/ - brentvatne

192

Expo员工的文档和答案摘要:

React Native init:

优点

  • 可以添加用Java或Objective-C编写的本地模块(可能是唯一但最强大的一个)

缺点

  • 需要Android Studio和Xcode来运行项目
  • 没有Mac无法为iOS开发
  • 设备必须通过USB连接才能进行测试
  • 字体需要在Xcode中手动导入
  • 如果要分享应用程序,则需要发送整个.apk/.ipa文件
  • 不会提供JavaScript API,例如推送通知、资源管理器等,需要手动安装并使用npm进行链接
  • 正确设置一个工作项目(包括设备配置)相当复杂,可能需要时间

Expo

优点

  • 设置项目很容易,几分钟即可完成
  • 您(和其他人)可以在您正在工作的时候打开该项目
  • 分享应用程序非常容易(通过QR码或链接),无需发送整个.apk.ipa文件
  • 运行应用程序无需构建
  • 在标准项目中集成了一些基本库(推送通知、资源管理器等)
  • 您可以将其弹出到ExpoKit并继续使用部分Expo功能集成原生代码,但不是全部功能
  • Expo可以构建.apk.ipa文件(使用Expo可分发到商店)

缺点

  • 无法添加本地模块(对某些人可能是个转折点)
  • 无法使用使用Objective-C/Java的本地代码的库
  • 标准的Hello World应用程序大小约为25MB(由于集成了库)
  • 如果要使用FaceDetector、ARKit或支付功能,则需要将其弹出到ExpoKit中
  • 将其弹出到ExpoKit会对Expo的功能产生一定的影响,例如您不能通过QR码进行共享
  • 当将其弹出到ExpoKit时,您受支持的react-native版本将受到ExpoKit的限制
  • 在ExpoKit(具有本地模块)中进行调试要复杂得多,因为它混合了两种语言和不同的库(不再有官方的Expo支持)
  • 来源:


    1
    感谢@BenjaminHeinke清晰地阐述了优缺点。我们决定采用Expo来开发React Native应用程序,但已经遇到了劣势#2。由于这个原因,我们无法与Appsee集成。难道没有解决方法吗? - CoolDocMan
    3
    测试时设备不必连接USB,只需进行第一次编译和安装即可。之后您可以使用Wi-Fi!但是,如果对本机应用程序进行更改,则需要重新编译。 - rszalski
    这应该是被采纳的答案。它解释了差异,优势和权衡得非常好。 - Miguel Jara
    仅供参考,期望您不需要iOS设备或Mac来测试代码并不是一个好的期望。我最终需要一台安装了最新mac OS的Mac和xcode才能运行iOS模拟器,因为许多在Web/Android上工作的CSS在iOS上无法正常工作,甚至会显示不同的结果(尽管大多数情况下只是崩溃)。 - Jon

    62

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


    Expo扩展了React Native的API表面

    React Native并没有提供所有您需要的JavaScript API,只提供了大多数原始功能。React Native开发人员需要使用Android StudioXcode链接其他本机库。

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

    另外需要注意的是,Expo团队无法将每个库都包含在ExpoKit中(这可能会导致一些挫败感),因为Hello, World!应用程序大小会增加,因为它会运送许多在大多数应用程序中不会使用的API。

    Expo提供空中更新JavaScript

    与其他系统(CodePush等)类似,Expo提供了一种更新您的应用程序的方法。这意味着您将JavaScript包上传到CDN,移动应用程序将在下一次启动时自动下载并使用新的JavaScript代码(无需从商店请求发布/审核)。

    Expo提供了一个CLI工具,用于在其CDN上上传/管理JavaScript包。对于开发,您还可以选择成为CDN并将JavaScript包托管在本地主机上。而Expo XDE只是CLI的可视化包装。
    Expo提供了一个通用客户端,允许加载与Expo兼容的任何应用程序。所有Expo应用程序都共享相同的本机运行时(React Native + ExpoKit)。唯一的区别是我们给它们的JavaScript代码。您发布到应用商店的Expo应用程序中硬编码了JavaScript包URL。Expo客户端是以特定方式构建的,因此您可以选择从哪个URL加载JS,通过扫描QR码或提供URL来完成。
    请注意,此客户端也可以从localhost加载JavaScript包,并使您的开发体验更加轻松:无需Xcode或Android Studio,从几小时缩短到几分钟即可在手机上运行第一个Hello, World!应用程序。实际上,由于Expo SDK可以升级,因此Expo客户端包括兼容性层,以便能够运行最后五个SDK版本。
    由于所有Expo应用程序共享相同的本机代码,因此Expo能够轻松地为您构建这些应用程序。他们创建了一个云构建服务。 区分两个由Expo构建的应用程序的主要因素只是应用程序被认为下载JavaScript包以运行的硬编码URL。

    Expo为您提供了一些其他功能,比如以声明方式设置应用程序图标、方向、权限、API密钥,帮助您设置推送通知、配置文件等等... 许多设置必须在构建应用程序时硬编码,并且不能通过空中更改。

    Expo对于React Native就像PhoneGap对于Cordova

    React Native与Cordova类似。它们不是相同的视图技术(原生 vs webview),但都允许您从JavaScript控制本机功能,并且都提供了插件系统,使开发人员可以轻松添加新的JavaScript和本机绑定。

    PhoneGap类似于Expo。它们都试图使用预定义的一组附加本机插件丰富其所构建的基础平台的原始API。PhoneGap还提供了一个build service和一个generic client,只要您使用批准的插件,它们就可以正常工作。

    结论

    可以看出,Expo是一组工具。最终,它允许轻松地开发、共享和发布您的移动项目到商店。它与PhoneGap体验非常相似(但更好,更少令人困惑)。

    我肯定会推荐Expo用于任何新的React Native项目,除了这两种情况:

    • 你已经知道你需要的 API 在 Expo 中不可用,而且短时间内也不会有
    • 你非常关心应用程序的大小(由于 ExpoKit 的大尺寸,Hello, World! 已经超过了 25 MB,但之后它并不会增加太多,因为它只是 JavaScript)

    2
    我正在尝试查找Expo不支持的API列表。有人知道在哪里可以找到吗? - ronnyrr
    2
    @ronnyrr 我认为这就是你要找的内容:https://expo.canny.io/ 这是一个按热度排序的功能请求列表。 - Evan Bacon

    32

    在官方的Expo文档中有解释:

    Expo和React Native有什么区别?

    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。


    29

    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. 相比 Expo 更容易创建 .apk.ipa 文件。

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

    缺点:

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

    如您所见,这两种方法都有其优缺点;您应该根据项目需求决定使用哪种方法。


    简洁明了的解释。谢谢! - Arundale Ramanathan
    乍一看,它似乎是剽窃,但不是——用户Sampson Crowley进行了编辑! - Peter Mortensen

    9
    关于Expo和React Native CLI的优缺点的回答已经很完整了。我想提及我的个人经验中的另一个观点。
    Expo在项目中默认包含许多模块,这使得使用它更加容易。但是在生产阶段,它存在一个很大的问题,因为构建后的Android和iOS版本非常大。例如,如果你只有一个页面,上面写着“Hello, World!”,那么APK文件的大小将会约为19 MB。而在React Native CLI中拥有同样的项目将导致一个大小为6 MB的应用程序。
    所以,就个人而言,如果你想开发商业应用程序,我不建议使用Expo。

    2
    我认为这不是使Expo应用程序未能达到生产就绪的足够理由。此外,先前的答案已经对此进行了全面说明。 - Dawoodjee

    6
    Expo是React Native CLI的包装器,为开发人员提供了便利,处理底层事务。 Expo解决的最常见问题是开发人员不必担心在React Native CLI中经常出现的库链接问题。 Expo现在推出了大量非常有用的库,对于强大的开发非常有帮助。 Expo的好处之一是您可以通过Expo移动应用程序开发Android和iOS应用程序,而无需拥有Mac。

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

    • 应用程序大小会像魔鬼一样增加。一个简单的Hello, World!应用程序大小超过30 MB
    • 有时,当您需要将一些本地功能实现到应用程序中时,您将需要从Expo中退出并返回React Native CLI。您永远无法将其恢复到Expo CLI。

    4

    我在这里想指出的是Expo正在使用较旧的React版本,即16.5,这将防止您使用新的钩子功能。

    如果您决定选择Expo,请注意观察您的版本控制。例如,如果您遇到奇怪的错误,则需要使用较旧的版本,比如react-navigation与16.5版本一起使用。


    expo update 在获取由 Expo 管理的大多数包的兼容版本方面做得非常好。目前为止,我认为它不会更新 React Navigation,但是该库实际上是由 Expo 赞助的。就个人而言,我很少遇到 React Navigation 和 Expo 之间的兼容性问题(我想在使用 beta 版本时遇到了一些问题)。但是,您可能会看到更多由 Expo 未管理的包的兼容性问题。 - Jon Doe

    3

    文档摘要和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支持)


    3
    我有一年多的使用Expo的经验。 如果您不关心应用程序的大小,那么使用Expo更容易实现地图和推送功能,比React Native更加方便;但是在项目结束时,如果您想将应用程序发布到Google Play或其他商店,则需要解决一些在APK中删除某些权限的挑战。
    在React Native中,您可以更改所有内容,但对于导入某些库(例如推送通知或地图),也需要一些挑战,因为您必须手动将这些库添加到Android和iOS项目中。

    如果你需要使用第三方SDK,但只有一个Android AAR可用,你能把这个AAR整合到基于Expo的项目中吗? - Zijian

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接