React Native V0.74 穩(wěn)定版發(fā)布
React Native 最近有個(gè)令人興奮的消息——V0.74 版本在幾天前發(fā)布了,包含了超過1600個(gè)提交。亮點(diǎn)如下:
- Yoga 3.0
 - 新架構(gòu):默認(rèn)無橋模式
 - 新架構(gòu):批量 onLayout 更新
 - 新項(xiàng)目使用 Yarn 3
 
下面我們深入了解每個(gè)新亮點(diǎn)。

Yoga 3.0
首先了解一下 React Native 中的 Yoga 是什么。
Yoga —— 布局引擎
Yoga 是一個(gè)由 Meta 開發(fā)的開源布局引擎。它負(fù)責(zé)在用戶界面內(nèi)排列和定位 UI 元素(如按鈕、文本、圖像等)。
Yoga 為每個(gè) UI 元素計(jì)算以下四個(gè)方面:
- 定位
 - 尺寸
 - 對齊
 - 間距
 
通過 Yoga,你可以創(chuàng)建響應(yīng)式布局,適應(yīng)不同的屏幕尺寸和方向。它還在 React Native 中實(shí)現(xiàn)了一個(gè)廣泛使用的概念——CSS Flexbox。因此,Yoga 可以說是 React Native 靈活 UI 的核心。
Yoga 3.0 —— 新特性
在之前的所有 React Native 版本中,存在一些不正確的布局行為。Yoga 3 解決了這些問題。其中一個(gè)最常見的問題是 ‘row-reverse’ 樣式無法正常工作。
來看下圖,左邊是 V0.73,右邊是 V0.74。

在上圖中,我們有一個(gè) <Container />,內(nèi)部是一個(gè) <Parent /> 組件,再內(nèi)部是兩個(gè) <Child /> 組件。
我們在 <Parent /> 組件中應(yīng)用了如下樣式:
// <Parent /> 組件的樣式
style={{
      flexDirection: 'row-reverse',
      backgroundColor: 'dodgerblue',
      flex: 1,
      marginLeft: 100,
      marginRight: 20,
      marginVertical: 20,
      alignItems: 'center'
}}你注意到了嗎,我們?yōu)?nbsp;<Parent /> 添加了 100 像素的 marginLeft?是的,但看下 React Native V0.73(左邊)的輸出。它顯示右邊有 100 像素的邊距(而不是左邊)??!現(xiàn)在看下 React Native V0.74(右邊)的輸出。很好,在 V0.74 中,我們看到左邊有了完美的 100 像素邊距,并且兩個(gè) <Child /> 組件也被反轉(zhuǎn)了 ??。
所以,在 Yoga-2 中,如果你在組件上應(yīng)用了 ‘row-reverse’ 的 flex-direction 以及 “margin” 或 “padding” 或 “border”,那么該組件的邊緣也會被翻轉(zhuǎn)。但在 Yoga-3 中,這個(gè)問題已經(jīng)完美解決了 ??。
Yoga-3 還帶來了一些 Yoga-2 中缺失的重要樣式組件:
- alignContent 樣式的 space-evenly 屬性。
 - position 樣式的 static 屬性。
 
新架構(gòu):默認(rèn)無橋模式
舊架構(gòu)
React Native 以前使用橋來在 JavaScript 和原生模塊之間通信。這些模塊用 C++、Objective C、Java 或 Kotlin 編寫,以訪問攝像頭、傳感器等原生功能。不幸的是,橋有一些限制。
一個(gè)主要限制是,每次一個(gè)層與另一個(gè)層通信時(shí),都涉及序列化(將 JS 對象轉(zhuǎn)換為 JSON 字符串)和反序列化(將 JSON 字符串轉(zhuǎn)換回 JS 對象)數(shù)據(jù)。由于轉(zhuǎn)換需要時(shí)間,這個(gè)過程會給通信流程帶來性能問題。
新架構(gòu)——性能提升
好消息是,React Native 團(tuán)隊(duì)能夠用一個(gè)叫做 JSI(JavaScript 接口)的接口替換橋。它用 C++ 編寫,使所有原生功能都可以通過你的 JS 代碼訪問,這意味著你可以調(diào)用原生方法而無需數(shù)據(jù)序列化或反序列化,使應(yīng)用程序超級快速。
移除舊架構(gòu)依賴
JSI 是新架構(gòu)的核心部分。為了在我們的應(yīng)用程序中充分啟用 JSI(新架構(gòu)),我們需要先移除應(yīng)用程序?qū)εf橋架構(gòu)的依賴。為此,React Native 團(tuán)隊(duì)引入了新架構(gòu)的三個(gè)支柱,使我們能夠完全擺脫對橋的依賴。
- TurboModules:移除了應(yīng)用程序?qū)蛑性{(diào)用的依賴(在 V0.68 中發(fā)布)。
 - Fabric Renderer:移除了應(yīng)用程序?qū)蛑薪M件渲染的依賴(在 V0.68 中發(fā)布)。
 - Bridgeless Mode:移除了應(yīng)用程序?qū)蛑衅渌糠郑ㄈ珏e(cuò)誤處理、全局事件發(fā)射器、計(jì)時(shí)器等)的依賴(在 V0.73 中發(fā)布)。
 
V0.74 中的新特性
從 V0.74 開始,一旦你啟用了新架構(gòu),你會看到“無橋模式”已自動啟用。然而,新架構(gòu)本身默認(rèn)仍未啟用。
當(dāng)你在 V0.74 中啟用新架構(gòu)時(shí),你會在 Metro 日志中看到如下兩行:

這就對了 ??。從 React Native V0.74 開始,啟用新架構(gòu)后,無需手動啟用無橋模式 ??。
新架構(gòu):批量 onLayout 更新
另一個(gè)好消息是,React Native 團(tuán)隊(duì)不僅將新架構(gòu)的無橋模式設(shè)為默認(rèn),還改進(jìn)了此架構(gòu),以處理批量 onLayout 更新(在單個(gè)渲染中執(zhí)行多個(gè)更新)。這種優(yōu)化通過減少渲染期間的布局相關(guān)計(jì)算來提高性能。
“onLayout” 屬性
React Native 中的 onLayout 屬性用于處理組件的布局(位置)變化。當(dāng)組件的布局發(fā)生變化(由于掛載、調(diào)整大小、旋轉(zhuǎn)或其他因素)時(shí),onLayout 回調(diào)函數(shù)會被觸發(fā)。
你可以像下面這樣使用這個(gè)屬性,根據(jù)更新的布局信息執(zhí)行操作。
function App(){
  return (
      <View
         notallow={() => {
          console.log('Component has been invoked ??')
         }}
      />
   )
}“onLayout” 批量更新如何工作?
假設(shè)組件 <App/> 如下所示,每個(gè) View 在掛載時(shí)觸發(fā) onLayout 回調(diào)函數(shù)。
function App() {
 const [state1, setState1] = useState(false)
 const [state2, setState2] = useState(false)
 const [state3, setState3] = useState(false)
 console.log('? COMPONENT RE-RENDERED .....')
 return (
  <View>
   <View
    notallow={() => {
     console.log('FIRST View invoked')
     setState1(true) // View 掛載時(shí)更新 state1
    }}></View>
   <View
    notallow={() => {
     console.log('SECOND View invoked')
     setState2(true) // View 掛載時(shí)更新 state2
    }}></View>
   <View
    notallow={() => {
     console.log('THIRD View invoked')
     setState3(true) // View 掛載時(shí)更新 state3
    }}></View>
  </View>
 )
}現(xiàn)在,在 React Native V0.73 中,你會看到如下輸出 ??。

每次執(zhí)行 onLayout 回調(diào)時(shí)都會重新渲染整個(gè)組件。
在 React Native V0.74 中啟用新架構(gòu)后的輸出 ??。

性能驚人??。在執(zhí)行所有 3 個(gè) “onLayout” 回調(diào)時(shí),組件只重新渲染了一次。
關(guān)于 “onLayout” 批量更新的總結(jié)如下圖 ??。

新項(xiàng)目使用 Yarn 3
Yarn 3 現(xiàn)在是通過 React Native Community CLI 初始化的新項(xiàng)目的默認(rèn) JavaScript 包管理器。它取代了已被棄用且之前用作默認(rèn)的 Yarn Classic(1.x)。
Yarn 3 加快了安裝和更新依賴項(xiàng)的過程,并優(yōu)化了依賴項(xiàng)的存儲方式。
結(jié)論
React Native 版本 0.74 在組件布局、架構(gòu)、批量 onLayout 更新和與 Yarn 3 的集成方面引入了重要改進(jìn)。















 
 
 

 
 
 
 