【问题标题】:Difference between ExpoKit and React Native projectExpoKit 和 React Native 项目的区别
【发布时间】:2018-08-25 23:21:49
【问题描述】:

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

我的主要指导是this

但是我仍然不明白我使用带有本机代码的 ExpoKit 与带有本机代码的普通 React Native 项目有什么(缺点)优势,除了我不能在普通 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 安装 expo,我可以在 React Native 项目中使用 Expo API 吗?

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

【问题讨论】:

  • 问题 1:在 React Native 项目中,我可以默认卸载 Expo 项目附带的所有不必要的库,以使我的应用程序更精简。
  • 问题 3:我想这与 Expo SDK 总是落后于 React Native 版本的兼容性有关。目前 Expo SDK(版本 25.0.0)支持 React Native 0.52.0,即使当前版本的 React Native 是 0.54。因此从 0.52.0 版本开始添加的功能无法在 Expo SDK 中使用。
  • 通常 Expo SDK 在相应的 React Native 发布后 2-3 周内发布。您所指的版本滞后异常:blog.expo.io/sdk-26-delayed-until-end-of-march-d02243e6ae7e
  • 注意:ExpoKit 已被弃用。来自 Expo 的文档:“ExpoKit 已被弃用,并且在 SDK 38 之后将删除对 ExpoKit 的支持。我们建议改为退出裸工作流。”

标签: react-native expo


【解决方案1】:

请注意 2020 年之后偶然发现此问题的任何人... ExpoKit 已被弃用,因此整个问题没有实际意义。

来自 Expo 的 documentation:“ExpoKit 已被弃用,并且在 SDK 38 之后将删除对 ExpoKit 的支持。我们建议改为退出裸工作流。”

【讨论】:

    【解决方案2】:

    ExpoKit 是“纯 JS”Expo 应用程序和“普通”React Native 之间的混合体。它的核心仍然是一个 React Native 项目,但在构建系统、开发人员体验和可用功能方面存在一些差异。

    特点

    截至今天,Expo 的 SDK 中的大多数 API 在原生 React Native 项目中不可用,但在 ExpoKit 中可用。我们认为这在未来可能会发生变化,但这将是很多工作。

    Expo 的推送通知服务目前不适用于 ExpoKit,也不适用于 vanilla React Native。

    构建系统

    vanilla RN 应用和 ExpoKit 应用都使用 Xcode 和 Android Studio 来构建原生代码。 iOS ExpoKit 应用程序使用 CocoaPods 安装依赖项,这可能会增加管理原生构建的一些复杂性。 Android ExpoKit 应用程序有额外的 Gradle 配置来将多个版本的 React Native 构建到同一个二进制文件中(这用于启用 JS 的多个 SDK 版本的无线更新),这有时会增加添加其他 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 二进制文件往往比相应的原生 React Native 二进制文件大,尽管这在未来可能会改变。

    您的子问题

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

    来自评论 1 的问题:您可以根据需要修改 ExpoKit 构建,但升级到较新的 SDK 版本可能会稍微困难一些,具体取决于您编辑的程度。

    【讨论】:

    • 感谢您的详细解释。回答问题 3:据我所知,RN API 和 Expo API 之间存在差异,因为有些 API 只能用于 Expo,甚至不能用于 ExpoKit(推送通知)。其他人使用 ExpoKit,但不使用 vanilla RN 项目(资产管理器)。大多数可能是相同的 API,但是有没有列出 Expo 的 API 及其对应兼容性的详细列表?或者更多关于 RN API 和 Expo API 之间区别的信息。
    • 这些区别在技术细节上其实有点模糊。我们目前没有比较图表,但每个 API 的文档都应说明其支持的位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 2018-11-17
    • 2020-03-08
    • 1970-01-01
    • 2016-04-11
    相关资源
    最近更新 更多