ExpoKit和React Native项目之间的区别

时间:2018-03-16 19:43:23

标签: react-native expo

我现在做了很多研究,以找出React Native项目,CRNA和Expo项目之间的确切差异和权衡。

我的主要指导是this

然而,我仍然不明白我使用本地代码使用ExpoKit与使用本机代码的普通React Native项目有什么(dis-)优势,除了我不能在正常的React中使用Expo API原生项目。

我知道当我在Expo开始一个项目时,我可以将它作为ExpoKit项目或React Native项目弹出。 在两者中我都可以使用本机代码。在ExpoKit中,我仍然可以在普通的React Native项目中使用Expo API。我不能。

所以我的问题:

  1. 如果我可以在ExpoKit项目中使用本机代码和所有Expo API,那么使用react本机项目会有什么兴趣?在ExpoKit项目中,我仍然可以使用所有Expo API和所有React Native API,对吧?!

  2. 如果我使用npm install --save expo安装世博会,我可以在React Native项目中使用Expo API吗?

  3. React Native API和Expo API有什么区别?

3 个答案:

答案 0 :(得分:17)

ExpoKit是纯粹JS和#34之间的混合体。世博会应用程序和" vanilla"反应原生。它的核心仍然是React Native项目,但有一些不同之处在于构建系统,开发人员体验和可用功能。

功能

截至今天,Expo> SDK中的大多数API都不在香草React Native项目中提供,但它们在ExpoKit中可用。我们认为未来可能会发生变化,但这需要做很多工作。

Expo&#39>推送通知服务目前不适用于ExpoKit,也不适用于香草React Native。

构建系统

vanilla RN应用程序和ExpoKit应用程序都使用Xcode和Android Studio来构建本机代码。 iOS ExpoKit应用程序使用CocoaPods来安装依赖项,这可能会增加管理本机构建的一些复杂性。 Android ExpoKit应用程序具有额外的Gradle配置,可将多个版本的React Native构建到同一个二进制文件中(这用于启用多个SDK版本的JS的无线更新),这有时会增加添加其他React Native库的复杂性

ExpoKit和React Native项目的JavaScript由Metro构建,但在ExpoKit中,您需要使用Expo的XDE或exp工具运行Metro,以便他们可以处理项目的额外配置。这意味着您运行的命令如exp start而不是react-native run-android

由于ExpoKit目前的设计(虽然将来可能会有所改变),但一些开源的React Native库可能与ExpoKit存在兼容性问题。例如,如果本机库希望能够在Android上请求对React Native的OkHttp实例的引用,则在ExpoKit中运行时可能存在类型不匹配,因为Expo使用的命名空间允许多个版本的React Native编译。也就是说,这些问题往往非常罕见,我们正在通过一些不同的方式使ExpoKit与生态系统中的图书馆越来越兼容。

这种多版本支持还意味着ExpoKit二进制文件往往比相应的vanilla React Native二进制文件更大,尽管将来可能会发生变化。

您的子问题

  1. 一些开发人员更愿意管理他们的JS捆绑和资产如何自行分发,或者他们可能需要一个目前与ExpoKit兼容的库。二进制大小是您可能更喜欢香草RN的另一个原因。
  2. 目前无法在React Native项目中使用大多数Expo API。 Expo SDK中提供的一些API与开源项目(例如react-native-maps)捆绑在一起,可以与vanilla RN项目一起使用。
  3. 我不确定如何解析这个问题 - Expo API目前只是React Native API,它们知道如何相互交谈并对他们正在运行的环境做出某些假设。
  4. 评论1中的问题:您可以随意修改ExpoKit构建,但根据您编辑的程度,可能会更难以升级到较新的SDK版本。

答案 1 :(得分:0)

请注意在2020年后偶然发现此问题的任何人... ExpoKit已过时,因此整个问题尚无定论。

在Expo的documentation中:“不赞成使用ExpoKit,并且在SDK 38之后将删除对ExpoKit的支持。建议改用裸露的工作流程。”

答案 2 :(得分:-1)

好,我指的是Expo,而不是ExpoKit,这是我的错。请忽略下面我的回答。

Expo是一个开发环境,它允许您仅使用JavaScript并将您与实际的本机技术堆栈(Android,iOS / apk,Android Studio,XCode等)隔离。它允许实时重载,例如使用Webpack构建网站时。默认情况下,create-react-native-app脚本使用Expo构建一个项目,但是它还为它配备了一个“弹出”脚本,该脚本将其转换为“正常”模式,您可以在其中使用Android Studio / XCode和通常。

我写了an article on Medium关于Expo和“弹出”模式之间的差异,以及如何通过一些Git技巧同时使用两者。