在原生 React Native 应用中使用 Expo API

本文翻译自 Expo 的一篇博客:You can now use Expo APIs in any React Native appreact

image

注: 本文最初于 2019 年 2 月 28 日发布,随后于 2019 年 3 月 14 日更新,以反映 Workflow 的改进。

从今天开始,你能够在任何 React Native 应用程序中使用尽量少或尽量多的 Expo SDK。 咱们已经花了不少时间构建和维护这些包含原生应用特性的跨平台 API,咱们很高兴最终实现了向整个 React Native 生态共享这些 API,并将它们做为一个总体继续优化。android

Expo 将来的两个主要的工程流分别是 ManagedBare。 Managed 应用程序是经过 expo-cli、移动设备上的 Expo 客户端和咱们的各类服务: Push Notifications、构建服务和 无线(OTA)更新 构建的。 Expo 试图尽量多地为你管理构建应用程序的复杂性,因此咱们称之为 Managed Workflow。 另外一方面,Bare 应用程序将全部的控制权(以及随之而来的复杂性)交给了开发人员。ios

关于 Bare Workflow,能够参考: “Hello World” guide for bare projects in the Expo docs

咱们称这个初始版本为预览版,由于还它没有咱们但愿的那样足够简化,可是咱们但愿尽快把这些功能交到用户手中,由于它们已是一个很大的改进了。git

Introducing Unimodules

React Native 包通常都是小的总体。 若是他们须要与 Filesystem 或 Permissions 进行交互,不一样的包将以各自的方式实现这个逻辑。 其结果是致使用户须要作没必要要的重复工做、处理 bug 以及各类修改。 github

由于 Expo 最初是做为一个总体创建的,因此天然而然地,咱们为 API 的这些基本构建块创建并依赖于一个更通用的解决方案。 当涉及到将 Expo 拆分以使开发人员可以按需挑选 SDK 的部分时,咱们面临一个决定: 退一步,在每一个模块中提供这些构建块的特殊实现? 或者构建一个容许模块之间干净利落地交互的工具?web

这项工做的成果是一个名为 Unimodules 的项目。 Unimodules 是一个 toolchain(工具链),用于构建模块化的 React Native 插件,这些插件能够相互交互。 我会把这些细节留到下一篇文章中,可是咱们很兴奋,由于这有可能解决 React Native 中原生模块存在的一系列问题。 它还打开了与其余相邻社区(如Flutter)共享 cross-platform APIs 实现的可能性ーー咱们经过制做一个用于 Flutter 的 Unimodule 适配器和发布一些 Flutter 包来使用 Expo SDK! (若是你好奇的话,能够阅读 How to use Expo Unimodules in Flutter)npm

让咱们来看看这个问题的实质: 如何在应用程序中使用这些 API?react-native

在 React Native 应用程序中安装 Unimodule

1. 获取 react-native-unimodules

若是你经过 react-native init 或者 ignite-cli 之类的工具建立 React Native 项目,那么您须要将 react-native-unimodules 包添加到项目中并首先对其进行配置: 按照 README 中的说明进行操做。 这个包提供了其余模块一般依赖的功能(如 Permissions, Constants, 和 FileSystem) : 它是一个构建其余模块的平台。 每一个应用程序只须要这样作一次。api

若是经过运行 expo init 并选择 Bare 模板,经过 expo-cli 建立一个 Bare React Native 项目,那么您的项目将默认安装并配置 react-rative-unimodule。 您可使用 react-native run-iosreact-native run-android 而不是 expo start 来运行这个项目。app

2. 查找并安装所需的 packages

在 Expo 文档中的 Expo documentation部分,找到要添加到项目中的 API。 跳转到 Installation 部分,并按照连接进入 Bare React Native 的安装说明。 大多数软件包都有相同的简单安装流程,但在少数状况下,除了配置依赖项以外,您还须要添加一些代码。 接下来,你就能够应用程序中使用它了。

须要注意的是,SDK 中包含的某些 api 不是 Unimodules: MapView 只是 react-native-mapsSVGreact-native-svgGestorehandlerreact-native-gesturehandlertakeSnapshotAsyncreact-native-view-shot 的包装。 全部这些 API 均可以按照相应 READMEs 中的说明进行安装。

在 Managed 应用程序中安装 Unimodule

当你在 expo init 的时候选择 Managed 时,你将获得一个能够在 Expo 客户端打开的项目,其中包括 expo package,它是构成 expo SDK 的包的集合。 例如,它依赖于并从新导出 expo-permissions, expo-file-system, expo-web-browser 等模块。

在不久的未来,expo package 将只包含最小的核心包,相似于 react-native-unimodules,要在应用程序中使用其余包,你须要安装 npm 包,但不须要本修改原生代码。 这将实现更小的 bundle 大小和更快的构建时间,由于只包含你在应用程序中使用的代码。

社区中的其余人可能开始围绕 Unimodule 工具构建他们的原生模块。 咱们不能在 Expo 客户端中支持任意的原生模块,同时经过 App Store 发布,因此你如今不能在 Managed 应用中安装这些模块。

Expo 团队设计和建立的 Unimodules 都将做为基础设施,咱们将继续为其添加 WebTypeScript 的支持,更多特性,敬请期待。

ExpoKit 的将来

在博客 ExpoKit 2019中,我有提到咱们计划继续支持和改进 ExpoKit 工做流。 这是对其进行评估的第一个结果。 经过在一个简单的 React Native 应用程序中安装 Unimodules,你已经能够很是接近使用 ExpoKit 的效果了。 不过仍是缺乏了 Expo 里基于 TaskManagerAppLoadingSplashScreen 实现的 notifications services, background tasks 以及咱们的实验性的 AR 相关的 API。 咱们已经开始着手将后台任务移植到 React Native,并将在以后不久启动 OTA 更新 和 Notifications 的 Unimodules。

What’s next

image

Update : 2019年3月14日,咱们发布了这个功能! 使用 react-native-unimodules,大部分 Unimodules 的安装都是为你自动完成

原文:咱们对接下来要发生的事情很是兴奋:an open pull request 自动将 Unimodules 安装到 iOS 和 Android 项目中,这样在大多数状况下,你只须要从 npm 安装包就能够了。 咱们但愿使 Unimodules 的安装尽量简单。

咱们也期待着将咱们的 OTA 更新 和 Background Tasks APIs 交到 Bare 工做流用户手中。 最后,咱们但愿帮助其余人使用 Unimodules 基础设施来创建本身的库,若是这对他们有益的话,所以咱们将记录如何从头开始构建本身的 Unimodule,以及如何转换现有的 React Native 库。

相关文章
相关标签/搜索