本文翻譯自 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 庫。