我现在做了很多研究,以找出React Native项目、CRNA和expo 项目之间的确切区别和取舍.

我的主要指导是this

然而,我仍然不明白,与使用本机代码的普通React本机项目相比,使用ExpoKit与本机代码相比,我有什么(不)优势,除了我不能在普通React本机项目中使用Expo API这一事实.

我知道,当我在expo 上启动一个项目时,我可以将其作为ExpoKit项目或React原生项目弹出.

所以我的问题是:

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

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

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

推荐答案

ExpoKit是"纯JS"Expo应用程序和"香草"React Native应用程序的混合体.它的核心仍然是一个React原生项目,但在构建系统、开发人员经验和可用功能方面有一些不同之处.

特征

到目前为止,Expo SDK中的大多数API都无法在本地项目中使用,但它们可以在ExpoKit中使用.我们认为这在future 可能会改变,但这将是一个很大的工作.

Expo的推送通知服务目前不适用于ExpoKit,也不适用于本地用户.

构建系统

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

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

由于ExpoKit的当前设计(尽管将来可能会发生变化),一些开源React本机库可能与ExpoKit存在兼容性问题.例如,如果本机库希望能够请求引用以在Android上React-native的OkHttp实例,则在ExpoKit内运行时可能会出现类型不匹配,因为Expo使用的命名空间允许编译多个版本的React-native.也就是说,这些问题往往非常罕见,我们正在研究几种不同的方法,使ExpoKit与生态系统中的库越来越兼容.

这种多版本支持还意味着ExpoKit二进制文件往往比相应的本地二进制文件大,尽管这在future 可能会改变.

你的子问题

  1. 一些开发人员更喜欢自己管理JS包和assets资源 的分发方式,或者他们可能需要一个目前与ExpoKit不兼容的库.二进制大小是您可能更喜欢香草RN的另一个原因.
  2. 目前不可能在React原生项目中使用大多数Expo API.Expo SDK中提供的一些API是从开源项目(如react native maps)Bundle 而来的,可以与vanilla RN项目一起使用.
  3. 我不知道如何解析这个问题——Expo API目前只是react 本机API,它们知道如何相互对话,并对它们运行的环境做出某些假设.

comments 1中的问题:您可以随心所欲地修改ExpoKit构建,但这可能会使升级到更新的SDK版本变得稍微困难,具体取决于您对它的编辑程度.

React-native相关问答推荐

将值从一个 js 文件传递​​到 react native 中的另一个 js 文件:react native

任务:react-native-async-storage_async-storage:generateReleaseRFile FAILED

打开屏幕后自动显示键盘

React Native - 如何在从另一个屏幕导航后将 ScrollView 滚动到给定位置

是否有用于react-native 的简单同步存储选项?

我应该什么时候调用 realm.close()?

React Native Android:how to remove "overscroll effect" of ScrollView

React Native 在升级到 0.56 版本后崩溃

React Navigation 5 隐藏Drawer抽屉元素

Realm 和 React Native - 实现自动更新的最佳实践?

带有 react-navigation 的 DrawerNavigation 标头

FlatList contentContainerStyle -> justifyContent: 'center' 导致滚动问题

React Native:如何获取文件大小、mime 类型和扩展名?

Console.error:no permission handler detected

更新 this.state.dataSource 不会更新 ListView

您将如何在 Alert 中模拟onPress?

在react-native中调试应用程序崩溃

I18nManager.forceRTL 不会在首次应用加载时应用更改

React-Native 元素卡在 :app:installDebug

是否可以将 Material UI 库与 React Native 一起使用?