本文翻译自 Expo 的一篇博客:You can now use Expo APIs in any React Native appreact
注: 本文最初于 2019 年 2 月 28 日发布,随后于 2019 年 3 月 14 日更新,以反映 Workflow 的改进。
从今天开始,你能够在任何 React Native 应用程序中使用尽量少或尽量多的 Expo SDK。 咱们已经花了不少时间构建和维护这些包含原生应用特性的跨平台 API,咱们很高兴最终实现了向整个 React Native 生态共享这些 API,并将它们做为一个总体继续优化。android
Expo 将来的两个主要的工程流分别是 Managed
和 Bare
。 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
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 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-ios
或 react-native run-android
而不是 expo start
来运行这个项目。app
在 Expo 文档中的 Expo documentation部分,找到要添加到项目中的 API。 跳转到 Installation 部分,并按照连接进入 Bare React Native
的安装说明。 大多数软件包都有相同的简单安装流程,但在少数状况下,除了配置依赖项以外,您还须要添加一些代码。 接下来,你就能够应用程序中使用它了。
须要注意的是,SDK 中包含的某些 api 不是 Unimodules: MapView
只是 react-native-maps
,SVG
是 react-native-svg
,Gestorehandler
是 react-native-gesturehandler
,takeSnapshotAsync
是 react-native-view-shot
的包装。 全部这些 API 均可以按照相应 READMEs 中的说明进行安装。
当你在 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 都将做为基础设施,咱们将继续为其添加 Web
和 TypeScript
的支持,更多特性,敬请期待。
在博客 ExpoKit 2019中,我有提到咱们计划继续支持和改进 ExpoKit 工做流。 这是对其进行评估的第一个结果。 经过在一个简单的 React Native 应用程序中安装 Unimodules,你已经能够很是接近使用 ExpoKit 的效果了。 不过仍是缺乏了 Expo 里基于 TaskManager
、 AppLoading
和 SplashScreen
实现的 notifications services
, background tasks
以及咱们的实验性的 AR
相关的 API。 咱们已经开始着手将后台任务移植到 React Native,并将在以后不久启动 OTA 更新 和 Notifications
的 Unimodules。
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 库。