自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

?不數(shù)不知道,React已經(jīng)有22個(gè)Hook了

開發(fā) 前端
如果說CSR時(shí)期的hook都是面向開發(fā)者直接使用的。那么并發(fā)時(shí)期最初的2個(gè)Hook(useTransition、useDeferredValue)已經(jīng)鮮有開發(fā)者使用了,而后期類似useMutableSource這樣的Hook,普通開發(fā)者則根本用不到。

大家好,我卡頌。

5月30日剛好是React10周年紀(jì)念日。

圖片

我順手拉了下React最新代碼,這一看不要緊,居然已經(jīng)有22個(gè)hook了。

其中:

  • react包導(dǎo)出了21個(gè)。
  • react-dom包導(dǎo)出了1個(gè)(useFormStatus)。

圖片

本文會(huì)從React這些年發(fā)展脈絡(luò)的角度,聊聊這些hook的作用。

時(shí)代的更迭

截止當(dāng)前,React的發(fā)展主要經(jīng)歷了3個(gè)時(shí)期:

  • CSR時(shí)期(客戶端渲染時(shí)期)
  • 并發(fā)時(shí)期
  • RSC時(shí)期(服務(wù)端組件時(shí)期)

當(dāng)前的22個(gè)hook也都是這3個(gè)時(shí)期的產(chǎn)物。

CSR時(shí)期

時(shí)間回到2013年,為了解決facebook日益復(fù)雜的交互,「jordwalke」開發(fā)了React。經(jīng)過一段時(shí)間摸索,React逐漸形成一套滿足CSR的開發(fā)模式。

這套開發(fā)模式從ClassComponent遷移到FunctionComponent后,便形成了最初的一批hook。這些hook都與CSR的開發(fā)模式相關(guān)。比如:

與狀態(tài)的流轉(zhuǎn)相關(guān)的:

  1. useState
  2. useReducer
  3. useContext

與處理副作用相關(guān)的:

  1. useEffect
  2. useLayoutEffect

與提高操作自由度相關(guān)的:

  1. useRef

與性能優(yōu)化相關(guān)的:

  1. useMemo
  2. useCallback

與調(diào)試相關(guān):

  1. useDebugValue

隨著React持續(xù)迭代,又引入了幾個(gè)hook,本質(zhì)來說他們都是為了完善CSR的開發(fā)模式,對(duì)現(xiàn)有hook能力進(jìn)行補(bǔ)充或約束:

  1. useImperativeHandle(控制useRef防止其失控)
  2. useEffectEvent(對(duì)useEffect能力的補(bǔ)充)
  3. useInsertionEffect(對(duì)useEffect場(chǎng)景的補(bǔ)充)
  4. useMemoCache[1](減少性能優(yōu)化心智負(fù)擔(dān))

這里簡(jiǎn)單聊聊useMemoCache。長久以來,不管是ClassComponent的shouldComponentUpdate,還是FC中2個(gè)性能優(yōu)化相關(guān)hook,都存在比較重的心智負(fù)擔(dān),比如:

  • 開發(fā)者需要考慮是否需要性能優(yōu)化
  • 開發(fā)者需要考慮何時(shí)使用useMemo、useCallback

為了解決這個(gè)問題,在2021年的React Conf,黃玄帶來了「能夠通過編譯器生成等效于useMemo、useCallback代碼」的方案 —— React Forget。

圖片

useMemoCache就是React內(nèi)部為React Forget提供緩存支持的hook。

所以這個(gè)hook是給編譯器用的,而不是我們普通開發(fā)者。

并發(fā)時(shí)期

在13年誕生之初,React的作者「jordwalke」就指出 —— React未來會(huì)發(fā)展「并發(fā)特性」。

這并不是什么高瞻遠(yuǎn)矚的預(yù)言,React本身是個(gè)重運(yùn)行時(shí)的框架,這意味著他的迭代方向需要圍繞「運(yùn)行時(shí)」展開。而「并發(fā)特性」是一種優(yōu)秀的運(yùn)行時(shí)性能優(yōu)化策略。

隨著并發(fā)特性落地,首先推出的是2個(gè)并發(fā)相關(guān)hook:

  1. useTransition
  2. useDeferredValue

這2個(gè)hook的本質(zhì)都是降低更新的優(yōu)先級(jí),「更新」意味著「視圖渲染」,所以當(dāng)更新?lián)碛胁煌瑑?yōu)先級(jí)后,這意味著「視圖渲染」擁有不同優(yōu)先級(jí)。

這就是并發(fā)更新的理論基礎(chǔ)。

但是,并發(fā)更新的出現(xiàn),打破了React沿襲多年的「一次更新對(duì)應(yīng)一次渲染」的模式。

為了讓現(xiàn)有的庫兼容并發(fā)模式,推出了如下hook:

  1. useMutableSource
  2. useSyncExternalStore

所以,上述2個(gè)hook主要是面向開源庫作者。

RSC時(shí)期

RSC(服務(wù)端組件)是一個(gè)浩大的工程,他的實(shí)現(xiàn)不是一蹴而就的,這一點(diǎn)從新出的hook就能看出。

既然是服務(wù)端組件,那就涉及到組件在服務(wù)端渲染。那么,對(duì)于存在唯一標(biāo)識(shí)(比如下面的id props)的組件,如何保證這個(gè)唯一標(biāo)識(shí)在服務(wù)端與客戶端一致呢?

<SomeCpn id={id}/>

如果組件僅在一端渲染,簡(jiǎn)單使用Math.random()就能獲得唯一標(biāo)識(shí):

const id = Math.random();

<SomeCpn id={id}/>

但如果這段邏輯在服務(wù)端/客戶端都運(yùn)行一次,顯然id就不唯一了。

為了生成在服務(wù)端/客戶端唯一的id,有了:

  1. useId

在并發(fā)時(shí)期,由于引入了「渲染優(yōu)先級(jí)」的概念,那勢(shì)必存在一些由于優(yōu)先級(jí)不足,而處于pending中的渲染。

如何展示「渲染的pending狀態(tài)」呢?React引入了<Suspense>組件。

到了RSC時(shí)期,React團(tuán)隊(duì)發(fā)現(xiàn),「渲染的pending狀態(tài)」是pending,「數(shù)據(jù)請(qǐng)求的pending狀態(tài)」不也是pending嗎?

換言之,任何需要中間pending狀態(tài)的流程,不都可以納入<Suspense>的管理范圍?

那該怎么標(biāo)記一個(gè)流程可以被納入<Suspense>的管理呢?于是有了:

  1. use

通過這個(gè)hook聲明的流程中的pending狀態(tài)都會(huì)被納入<Suspense>的管理。

既然<Suspense>越來越重要,那我們是不是要針對(duì)他做些優(yōu)化?既然<Suspense>可以在不同視圖之間切換,那為他增加緩存顯然是種不錯(cuò)的優(yōu)化方式,于是有了:

  1. useCacheRefresh[2](用于建立<Suspense>緩存)

到這一步,RSC的基礎(chǔ)設(shè)施算是搭好了,下一步該構(gòu)建上層應(yīng)用了。

在瀏覽器端,與RSC理念最契合的便是form標(biāo)簽,圍繞form標(biāo)簽的action屬性,React推出了如下hook:

  1. useOptimistic
  2. useFormStatus

這2個(gè)hook都是為了優(yōu)化「表單提交」這一場(chǎng)景(也可以說是RSC與客戶端的交互場(chǎng)景)。

關(guān)于這2個(gè)hook,更詳細(xì)的解釋可以參考form 元素是 React 的未來一文。

總結(jié)

如果說CSR時(shí)期的hook都是面向開發(fā)者直接使用的。那么并發(fā)時(shí)期最初的2個(gè)hook(useTransition、useDeferredValue)已經(jīng)鮮有開發(fā)者使用了,而后期類似useMutableSource這樣的hook,普通開發(fā)者則根本用不到。

同樣的,再往后的RSC時(shí)期的所有hook,普通開發(fā)者都用不到。他們都是為其他庫、框架(比如Next.js)提供的。

這標(biāo)志著React發(fā)展方向的不斷變化:

  • 早期,定位是前端框架,主要為了解決facebook自身問題,順便開源,受眾是開發(fā)者。
  • 中期,定位是底層UI庫,受眾是開源庫作者。
  • 當(dāng)前,定位是web底層操作系統(tǒng),受眾是上層全棧框架。

參考資料

[1]useMemoCache:https://github.com/facebook/react/pull/25123。

[2]useCacheRefresh:https://github.com/reactwg/react-18/discussions/25。

責(zé)任編輯:姜華 來源: 魔術(shù)師卡頌
相關(guān)推薦

2023-01-02 10:08:42

StampedLocAQS框架

2015-09-18 16:11:04

圖標(biāo)桌面環(huán)境KDE

2024-01-26 06:26:42

Linuxfzf工具

2015-07-14 10:18:42

Windows 10正式版

2018-04-26 13:33:20

Python語法Bug

2020-09-27 06:47:20

5G網(wǎng)絡(luò)運(yùn)營商

2022-02-25 11:04:21

Reactlanelanes

2022-10-12 08:22:44

Guava工具Collection

2019-10-28 08:44:29

Code Review代碼團(tuán)隊(duì)

2019-11-29 16:49:42

HTML語言開發(fā)

2023-12-21 14:40:09

Python編程語言

2024-05-20 09:27:00

Web 開發(fā)CSS

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2022-04-12 09:04:57

前端監(jiān)控數(shù)據(jù)采集

2019-12-24 09:49:02

微軟英語瀏覽器

2017-01-17 15:46:17

路由器地址網(wǎng)關(guān)

2022-06-18 23:03:05

Seata分布式事務(wù)

2023-06-30 08:01:04

Reactuse關(guān)鍵詞

2009-04-14 21:38:05

LinuxUbuntu技巧
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)