以後沒有 React Concurrent Mode 了
大家好,我卡頌。
相信很多關注React
的朋友都知道Concurrent Mode
,他是React
漸進升級策略的產物。
即然是策略,那就有可能調整,這不,根據 What happened to concurrent mode?[1],在v18
中將不會有Concurrent Mode
了。
本文讓我們一起了解React
漸進升級策略的演進過程。
React 新老架構的區別
可以認爲採用Fiber架構
前的React
只支持一種優先級:同步優先級
,即所有更新是 “同步、不可中斷” 的形式。
採用Fiber架構
後的React
支持包括同步優先級
在內的多種優先級,或者說新架構支持併發更新
。
所以新架構可以模擬老架構的運行機制(即不開啓併發更新
)。
當新架構開啓併發更新
後,就能使用React
爲了解決CPU的瓶頸
、IO的瓶頸
而設計的併發特性
(Concurrent Feature),比如:
-
useDeferredValue
-
useTransition
-
全功能的 Suspense
React 所有版本可能的情況
當前所有React
版本一定屬於如下情況之一:
-
v15 及之前的老架構
-
v16 之後的新架構,未開啓併發更新,與情況 1 行爲一致
-
v16 之後的新架構,未開啓併發更新,但是啓用了一些新功能(比如
Automatic Batching
) -
v16 之後的新架構,開啓併發更新
v16、v17 默認屬於情況 2。
之所以劃分多種情況,是因爲情況 4 的React
一些行爲異於情況 1、2、3(比如部分以componentWill
開頭的生命週期函數的調用時機發生變化),也就是說開啓併發更新
可能造成老代碼不兼容。
爲了讓廣大開發者能夠平滑過渡,React
團隊採用了**「漸進升級」**方案。
早期的漸進升級策略
v16.3 新增了StrictMode
,對開發者編寫的**「不符合併發更新規範的代碼」**作出提示,逐步引導開發者寫出規範代碼。
此時React
團隊的**「漸進升級」**策略是:讓頁面中可以同時存在三種模式的應用,具體如下:
-
Legacy
模式,通過ReactDOM.render(<App />, rootNode)
創建的應用遵循該模式。默認關閉StrictMode
,表現同情況 2 -
Blocking
模式,通過ReactDOM.createBlockingRoot(rootNode).render(<App />)
創建的應用遵循該模式,作爲從Legacy
向Concurrent
過渡的中間模式,默認開啓StrictMode
,表現同情況 3 -
Concurrent
模式,通過ReactDOM.createRoot(rootNode).render(<App />)
創建的應用遵循該模式,默認開啓StrictMode
,表現同情況 4
三種模式可用特性對比
在 v17 之前,大多數事件會冒泡到HTML
元素,爲了讓同一個頁面下不同應用獨立,v17 之後事件會冒泡到應用所在根元素。
所以 v17 也被稱爲**「墊腳石」**版本,他是爲**「開啓併發更新」**做鋪墊的版本。
當前的漸進升級策略
但是,根據社區的反饋,React 團隊意識到當前的**「漸進升級」**策略存在問題。
這三種模式影響的是整個應用,從Legacy
升級到Blocking
後,由於開啓StrictMode
,整個應用的**「併發不兼容警告」**都會上報。從這個角度看,並沒有起到**「漸進升級」**的目的。
另一方面,開發者從新架構中獲益更多是由於使用了併發特性
,即然新架構支持**「開關併發更新」**,完全可以在使用了併發特性
後再開啓併發更新
。這樣就只需在**「使用了併發特性的組件」**部分啓用StrictMode
。
相比劃分三種模式,這種以**「是否使用併發特性」**作爲是否開啓併發更新
的依據,更符合**「漸進升級」**中**「漸進」**的理念。
所以在 v18 中,不再有三種模式,統一使用ReactDOM.createRoot(rootNode).render(<App />)
創建應用。當不使用併發特性時,表現如情況 3。使用併發特性後,表現如情況 4。
總結
一句話總結:v18
以後只會有併發特性
,不會有併發模式
。
作爲一個發展了 8 年之久的前端框架,要想推進社區完成帶有breaking change
的迭代升級,註定是困難的。
我們也看到了React
團隊在此確實付出很多心血。
想問問各位,還學得動麼?
參考資料
[1]
What happened to concurrent mode?: https://github.com/reactwg/react-18/discussions/64
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/hiocM5u_6SfJy5Adcck-3Q