從 2024 React Conf 看 React Native 發展
今年的 React Conf 除了眾所矚目的 React 19 ,同時以 meta 開發團隊開發的 React Native 也帶來了不少亮點。有關於 React Native 的討論都集中在第二天的議程。
New Architecture 上 beta 了
截至 2024 年 3 月 React Native 的在 npm 上的每週下載數突破了220萬,越來越多的開發者使用;同時 React Native 開發團隊也宣布 New Architecture 終於上 beta 了,從 0.68 版本 2022 年 3 月在 React Native 加入了 New Architecture 到現在升級到 0.74 版本後使用 react-native-cli 可以分別在 Android 的 gradle.properties
啟用、iOS 則是在 iOS 的位置執行 bundle install && RCT_NEW_ARCH_ENABLED=1 bundle exec pod install
、使用 Expo 則可以 Expo 51 的設定檔案分別開啟 iOS 跟 Android 是否支援 New Architecture。官方是建議大家可以先玩看看新架構,然後如果有遇到問題的話幫忙回報一下 issue。
至於為什麼要改整個大改呢?這就要回歸到現在 React Native 的架構,目前的 Javascript 用 bridge 的方式和原生構通,透過 JSON 反序列化和序列化經由 bridge 來傳遞訊息,但使用 bridge 來溝通一次只能有一端通過,而且每傳遞一次就要用 JSON 反序列化和序列化來轉換資料,是相當耗費的效能的。
那麼 New Architecture 是如何改善這個問題呢?主要使用 JavaScript Interface(簡稱 JSI )讓 JavaScript 與原生進行溝通,JSI 是用 C++ 寫的,他使用 memory sharing 的方式讓 JavaScript 層與 native 層溝通,也可以讓 JavaScript 同步運行在 native 層,直接讓 JavaScript 程式碼呼叫原生程式碼的函數,更有效率地去直接溝通原生層。
官方建議使用 React native framework - Expo
這次官方也宣布他們改了 React native 的官網,從 0.75 開始版本開始,直接建議開發者使用 Framework 來開發,例如:Expo,先針對先前對於 Expo 的原生支援度不足等原因而採用 react-native-cli 作為開發選項的痛點,Expo 這次更新了一些功能以提升開發者體驗:
原生的支援
對於原生的支援 Expo 提供了
-
Expo sdk : 提供了一些原生的 api,例如:camera、location、notification...等
-
Expo module api : 使用 Expo module api 可 以寫自己原生 kotlin、swift 的 module 引入 React-Native 專案
expo router
採取 file system-based routing 的設計,分別針對 iOS 跟 Android、web 、 tv OS 給出不同的 UX 設計。
管理原生程式碼
使用 continuous native generation 管理原生程式碼
整體看下來,如果 Expo 這些功能可以解決原生支援度不足、可以整合自己寫原生的引入專案、再加上整合 build 跟 deploy 的平台,整體的開發者體驗相較使用 react-native-cli 來的好很多,如果有用過 Xcode build ipa 檔案或 android command line build apk 檔案、aab 檔案就可以心領神會其中的痛苦~但是我覺得這背後有一個隱憂就是 Expo 是一間私人的公司,會不會當使用者累積到一個量後,使用 Expo 的服務就會新增一些要考量的開發成本?
順道一提,React Conf 的 App 就是使用了 Expo 開發的,當然也有包含上方提及的新功能,都可以在 https://github.com/expo/react-conf-app 的 repo 中看到實際的應用。