React 18 Beta 來了
經(jīng)過「React18工作組」幾個月工作,11月16日v18終于從Alpha版本更新到Beta版本。
本文會解釋:
這次更新帶來的變化
對開發(fā)者的影響
如何安裝
v18 Betav18穩(wěn)定版何時會來

帶來的變化
經(jīng)過與社區(qū)不斷溝通,Beta版將有如下三個API變動:
useSyncExternalStore將替代useMutableSource用于訂閱外部源,見:#86討論[1]
用法類似如下:
import?{useSyncExternalStore}?from?'react';
//?基礎(chǔ)用法,getSnapshot返回一個緩存的值
const?state?=?useSyncExternalStore(store.subscribe,?store.getSnapshot);
//?根據(jù)數(shù)據(jù)字段,使用內(nèi)聯(lián)的getSnapshot返回緩存的數(shù)據(jù)
const?selectedField?=?useSyncExternalStore(store.subscribe,?()?=>?store.getSnapshot().selectedField);
useId用于在客戶端與服務(wù)端之間產(chǎn)生唯一ID,避免SSR hydrate時元素不匹配,見#111討論[2]
用法類似如下:
function?Checkbox()?{
??const?id?=?useId();
??return?(
????<>
??????<label?htmlFor={id}>Do?you?like?React?label>
??????<input?type="checkbox"?name="react"?id={id}?/>
????>
??);
);
useInsertionEffect用于插入全局DOM節(jié)點,見#110討論[3]
useInsertionEffect工作原理類似useLayoutEffect,區(qū)別在于回調(diào)執(zhí)行時還不能訪問ref中的DOM節(jié)點。
你可以在這個Hook內(nèi)操作全局DOM節(jié)點(比如或SVG
操作CSS的庫(比如CSS-IN-JS方案)可以用這個Hook插入全局。
用法類似如下:
function?useCSS(rule)?{
??useInsertionEffect(()?=>?{
????if?(!isInserted.has(rule))?{
??????isInserted.add(rule);
??????document.head.appendChild(getStyleForRule(rule));
????}
??});
??return?rule;
}
function?Component()?{
??let?className?=?useCSS(rule);
??return?<div?className={className}?/>;
}
至此,v18的特性已經(jīng)完備,正式版發(fā)布之前不會再新增API。
對開發(fā)者的影響
React團隊已經(jīng)在多個應(yīng)用的生產(chǎn)環(huán)境測試了Beta版本幾個月,并且相信他足夠穩(wěn)定。所以,開發(fā)者已經(jīng)可以升級至v18 Beta版本。
Beta作為「預(yù)發(fā)布版本」,與最終的正式版的區(qū)別是:可能還有少許bug,但整體穩(wěn)定。
社區(qū)中兼容v18的知名項目包括:
Next.js
Gatsby
React Redux
React Testing Library
安裝Beta
安裝命令如下:
#?npm
npm?install?react@beta?react-dom@beta
#?yarn
yarn?add?react@beta?react-dom@beta
穩(wěn)定版何時回來
根據(jù)Andrew的回復(fù),正式版最早發(fā)布時間可能會在22年1月底。

總結(jié)
不管是新文檔[4]還是Beta版,可以發(fā)現(xiàn)下半年React團隊節(jié)奏明顯加快了。
從v15升級到v16啟用Fiber架構(gòu)那天開始,React團隊就在為并發(fā)更新的穩(wěn)定努力了。
這一天,終于不遠了......
參考資料
#86討論: https://github.com/reactwg/react-18/discussions/86
[2]#111討論: https://github.com/reactwg/react-18/discussions/111
[3]#110討論: https://github.com/reactwg/react-18/discussions/110
[4]新文檔: http://beta.reactjs.org/
