在原生 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 庫。

相關文章
相關標籤/搜索