昨日,React 工程經理 Sophie Alpert 在其官方部落格上宣布 Facebook 将要重構 React Native,使其更輕量,更具靈活性,更适應 JavaScript 生态圈的發展。
在部落格中 Sophie Alpert 表示,React Native 項目的設計初衷是成為 JavaScript 和原生應用之間的橋梁。React DOM 将 React 的狀态更新變成了指令式、可變的 DOM API 調用,如
document.createElement(attrs)
和 .appendChild()
,而 React Native 則傳回一個單獨的 JSON 消息,它列出了要執行的一些操作,如 [["createView", attrs], ["manageChildren", ...]]
。
他們将整個系統設計為永不依賴擷取同步響應,并確定該清單中所有的内容都可以完全序列化為 JSON,并且可以反序列化回來。這樣做是為了提升靈活性:在這個架構之上,能夠建構諸如 Chrome 調試器之類的工具,這些工具可以通過 WebSocket 連接配接異步運作所有的 JavaScript 代碼。
但在過去的 5 年裡,他們發現最初的設計原則加大了某些特性的開發難度。異步橋接(asynchronous bridge)意味着不能直接将 JavaScript 邏輯與很多原生 API 內建在一起,因為這些原生 API 是同步的。
批量橋接(本地調用隊列)意味着 React Native 應用程式調用原生實作的函數會更加困難。而且串行化的橋接意味着不必要的複制,因為它不是直接在兩個世界之間共享記憶體。對于完全使用 React Native 建構的應用程式,這些限制通常是可承受的。但對于在 React Native 與現有應用程式代碼之間進行複雜內建的應用程式,情況則變得十分糟糕。
是以,Facebook 正在對 React Native 進行大規模重構,讓架構變得更加靈活,并更好地與混合 JavaScript/原生應用開發中的原生基礎設施內建。
通過這個項目,他們将應用在過去 5 年中學到的知識,逐漸讓架構更現代化。他們正在對 React Native 内部進行大量的重寫,當然大部分工作都是在底層進行的,是以現有的 React Native 應用程式幾乎不需要做出更改。
為了使 React Native 更輕量化并能更好地适應現有的原生應用,此次重構主要從三個方面進行:
- 首先,改變線程模型。UI 更新不再需要在三個不同的線程上執行,而是可以在任意線程上同步調用 JavaScript 進行優先更新,同時将低優先級工作推出主線程,以便保持對 UI 的響應
- 其次,将異步渲染功能引入 React Native 中,允許執行多個渲染并簡化異步資料處理
- 最後,簡化橋接,讓它更快、更輕量。原生和 JavaScript 之間的直接調用效率更高,并且可以更輕松地建構調試工具,如跨語言堆棧跟蹤