React 在今天剛剛在官網發布了有關于 React 18 的計劃更新( The Plan for React 18 – React Blog ),同時發布了 Alpha 版本的 npm 包:The Plan for React 18 – React Blog ? reactjs.org
官推
最近雖然忙到沒時間做視頻,不過這么大的事還是值得來聊聊(趁著公司電腦強制要求升 Big Sur 不讓不讓用的間隙……)。本文并非逐字翻譯,一如既往的會帶不少個人想法,不代表公司觀點(聽說這句話其實說了并沒什么卵用是吧 Oppo)。
React 18 正式引入了對并發模式/特性的「漸進升級」策略
之前我就提到過 React 18 會把重點放在解決兼容性和如何做遷移的問題上。
自從 Concurrent Mode(并發模式,以下簡稱 CM)宣布以來,Core Team 成員每天在推上 Github 上「XXX is not CM-safe」嚇死個人,使得整個社區都一直在擔心未來的 React 是不是會為了上 CM 直接 breaking change,然后不兼容 CM 的代碼必須要全部遷移過來才能用 CM("all-or-nothing" upgrade strategy)。
這次 18 的計劃發布終于橫掃了大家的擔憂 —— 并發的引入將會是 opt-in 得,不用的話就沒有 breaking changes,整體采用了漸進升級的策略(gradual adoption strategy)。
博文里基本沒講怎么漸進,只是說「升級到 18 幾乎不需要任何改動」。其實大概上有兩個地方做到了「漸進」:
- React 團隊對 "Concurrency opt-in" roots 的兼容性做了很多優化,如果不用 CM 特性的話,大概率能 just works。如博客所說「concurrent rendering will only be enabled for updates triggered by one of the new features.」—— 從此再無 CM,只有 Concurrent Features(并發特性)
-
對于直接想讓應用的某一部分「躺平」的可以用 legacy root。我之前在VLOG 第四期中就和大家提到過,17 對事件系統的修改的目的之一就是為了讓你的 React 應用同時可以跑在不同「版本」上。18 的實際做法是引入了新的 Root API
ReactDOM.createRoot
來與舊的ReactDOM.render
API 區分開來,你可以將整個 React 樹分形成不同的 roots,用舊 API 的 legacy roots 會跑在「legacy mode 傳統模式」上(相當于跑在 17 上),用新 API 的 roots 會跑在 "Concurrency opt-in" roots 下。
React 18 的其他新特性
-
更加激進的「 自動 batching 」,React 17 只在事件回調中 batch,React 18 則會對任何來源的 setState 做盡可能多的 batching。 如果你跟我一樣是用類似 state monad 的 mental model 來思考 state 的話,你可能會以為 React 早就是這個行為了。對于 Hooks 來說你是沒有辦法拿到中間狀態的 state 而 Class 可以拿
this.state
。這也是我以前說過的 class 對比 FC 的純度問題。 -
新的
startTransition
與useDeferredValue
API,本質上都是允許你將 UI 的一部分標記為「較低的更新優先級」。 - Suspense SSR 。你可能知道也不知道的是,完全用 React 重寫的新Facebook.com 是用 Hermes 做 SSR 來優化首屏渲染得,所以 SSR 的優化就成為了 React 團隊的優先級之一啦……但是傳統 SSR 的一個問題是,全量渲染話延遲太高了。而 CM + Suspence 就可以做到用 Suspence boundary 將應用分片,然后以此為單位做流式 SSR,是不是有重新發明 BigPipe 的感覺了?
- StrictMode 在既 double-render 之后加入了 double-effect
可以看到,隨著 CM 的逐漸落地,其「底層能力」的一面終于開始逐漸顯著出來,越來越多的上層應用將會發布以及正在開發中(比如 Brian 提到的 Offscreen API 以及 RN Pre-render)等。
React 18 工作組
最后呢就是 React 成立了一個工作組(WG,Working Group)來向整個社區公開有關 18 的討論與進度。這里的重點是幫助社區的主要框架、類庫作者在 18 Alpha 階段開始遷移,這樣當 18 真正發布時社區能夠準備充分一些,React 團隊一向把開發者體驗放在非常高的位置。

原文鏈接:https://zhuanlan.zhihu.com/p/379072979?utm_source=tuicool&utm_medium=referral