掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
大家好,我卡頌。

創(chuàng)新互聯(lián)于2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站設(shè)計制作、做網(wǎng)站網(wǎng)站策劃,項目實(shí)施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元劍河做網(wǎng)站,已為上家服務(wù),為劍河各地企業(yè)和個人服務(wù),聯(lián)系電話:028-86922220
5月30日剛好是React10周年紀(jì)念日。
我順手拉了下React最新代碼,這一看不要緊,居然已經(jīng)有22個hook了。
其中:
本文會從React這些年發(fā)展脈絡(luò)的角度,聊聊這些hook的作用。
截止當(dāng)前,React的發(fā)展主要經(jīng)歷了3個時期:
當(dāng)前的22個hook也都是這3個時期的產(chǎn)物。
時間回到2013年,為了解決facebook日益復(fù)雜的交互,「jordwalke」開發(fā)了React。經(jīng)過一段時間摸索,React逐漸形成一套滿足CSR的開發(fā)模式。
這套開發(fā)模式從ClassComponent遷移到FunctionComponent后,便形成了最初的一批hook。這些hook都與CSR的開發(fā)模式相關(guān)。比如:
與狀態(tài)的流轉(zhuǎn)相關(guān)的:
與處理副作用相關(guān)的:
與提高操作自由度相關(guān)的:
與性能優(yōu)化相關(guān)的:
與調(diào)試相關(guān):
隨著React持續(xù)迭代,又引入了幾個hook,本質(zhì)來說他們都是為了完善CSR的開發(fā)模式,對現(xiàn)有hook能力進(jìn)行補(bǔ)充或約束:
這里簡單聊聊useMemoCache。長久以來,不管是ClassComponent的shouldComponentUpdate,還是FC中2個性能優(yōu)化相關(guān)hook,都存在比較重的心智負(fù)擔(dān),比如:
為了解決這個問題,在2021年的React Conf,黃玄帶來了「能夠通過編譯器生成等效于useMemo、useCallback代碼」的方案 —— React Forget。
useMemoCache就是React內(nèi)部為React Forget提供緩存支持的hook。
所以這個hook是給編譯器用的,而不是我們普通開發(fā)者。
在13年誕生之初,React的作者「jordwalke」就指出 —— React未來會發(fā)展「并發(fā)特性」。
這并不是什么高瞻遠(yuǎn)矚的預(yù)言,React本身是個重運(yùn)行時的框架,這意味著他的迭代方向需要圍繞「運(yùn)行時」展開。而「并發(fā)特性」是一種優(yōu)秀的運(yùn)行時性能優(yōu)化策略。
隨著并發(fā)特性落地,首先推出的是2個并發(fā)相關(guān)hook:
這2個hook的本質(zhì)都是降低更新的優(yōu)先級,「更新」意味著「視圖渲染」,所以當(dāng)更新?lián)碛胁煌瑑?yōu)先級后,這意味著「視圖渲染」擁有不同優(yōu)先級。
這就是并發(fā)更新的理論基礎(chǔ)。
但是,并發(fā)更新的出現(xiàn),打破了React沿襲多年的「一次更新對應(yīng)一次渲染」的模式。
為了讓現(xiàn)有的庫兼容并發(fā)模式,推出了如下hook:
所以,上述2個hook主要是面向開源庫作者。
RSC(服務(wù)端組件)是一個浩大的工程,他的實(shí)現(xiàn)不是一蹴而就的,這一點(diǎn)從新出的hook就能看出。
既然是服務(wù)端組件,那就涉及到組件在服務(wù)端渲染。那么,對于存在唯一標(biāo)識(比如下面的id props)的組件,如何保證這個唯一標(biāo)識在服務(wù)端與客戶端一致呢?
如果組件僅在一端渲染,簡單使用Math.random()就能獲得唯一標(biāo)識:
const id = Math.random();
但如果這段邏輯在服務(wù)端/客戶端都運(yùn)行一次,顯然id就不唯一了。
為了生成在服務(wù)端/客戶端唯一的id,有了:
在并發(fā)時期,由于引入了「渲染優(yōu)先級」的概念,那勢必存在一些由于優(yōu)先級不足,而處于pending中的渲染。
如何展示「渲染的pending狀態(tài)」呢?React引入了
到了RSC時期,React團(tuán)隊發(fā)現(xiàn),「渲染的pending狀態(tài)」是pending,「數(shù)據(jù)請求的pending狀態(tài)」不也是pending嗎?
換言之,任何需要中間pending狀態(tài)的流程,不都可以納入
那該怎么標(biāo)記一個流程可以被納入
通過這個hook聲明的流程中的pending狀態(tài)都會被納入
既然
到這一步,RSC的基礎(chǔ)設(shè)施算是搭好了,下一步該構(gòu)建上層應(yīng)用了。
在瀏覽器端,與RSC理念最契合的便是form標(biāo)簽,圍繞form標(biāo)簽的action屬性,React推出了如下hook:
這2個hook都是為了優(yōu)化「表單提交」這一場景(也可以說是RSC與客戶端的交互場景)。
關(guān)于這2個hook,更詳細(xì)的解釋可以參考form 元素是 React 的未來一文。
如果說CSR時期的hook都是面向開發(fā)者直接使用的。那么并發(fā)時期最初的2個hook(useTransition、useDeferredValue)已經(jīng)鮮有開發(fā)者使用了,而后期類似useMutableSource這樣的hook,普通開發(fā)者則根本用不到。
同樣的,再往后的RSC時期的所有hook,普通開發(fā)者都用不到。他們都是為其他庫、框架(比如Next.js)提供的。
這標(biāo)志著React發(fā)展方向的不斷變化:
[1]useMemoCache:https://github.com/facebook/react/pull/25123。
[2]useCacheRefresh:https://github.com/reactwg/react-18/discussions/25。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流