精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

React Hooks 的實現(xiàn)必須依賴 Fiber 么?

開發(fā) 前端
現(xiàn)在,不止 react 中實現(xiàn)了 hooks,在 preact、react ssr、midway 等框架中也實現(xiàn)了這個特性,它們的實現(xiàn)就是不依賴 fiber 的。

React 的 hooks 是在 fiber 之后出現(xiàn)的特性,所以很多人誤以為 hooks 是必須依賴 fiber 才能實現(xiàn)的,其實并不是,它們倆沒啥必然聯(lián)系。

現(xiàn)在,不止 react 中實現(xiàn)了 hooks,在 preact、react ssr、midway 等框架中也實現(xiàn)了這個特性,它們的實現(xiàn)就是不依賴 fiber 的。

我們分別來看一下這些不同框架中的 hooks 都是怎么實現(xiàn)的:

react 如何實現(xiàn) hooks

react 是通過 jsx 描述界面的,它會被 babel 或 tsc 等編譯工具編譯成 render function,然后執(zhí)行產(chǎn)生 vdom:

這里的 render function 在 React17 之前是 React.createElement:

在 React 17 之后換成了 jsx:

這個 jsx-runtime 會自動引入,不用像之前那樣每個組件都要保留一個 React 的 import 才行。

render function 執(zhí)行產(chǎn)生 vdom:

vdom 的結(jié)構(gòu)是這樣的:

在 React16 之前,會遞歸渲染這個 vdom,增刪改真實 dom。

而在 React16 引入了 fiber 架構(gòu)之后就多了一步:首先把 vdom 轉(zhuǎn)成 fiber,之后再渲染 fiber。

vdom 轉(zhuǎn) fiber 的過程叫做 reconcile,最后增刪改真實 dom 的過程叫做 commit。

為什么要做這樣的轉(zhuǎn)換呢?

因為 vdom 只有子節(jié)點 children 的引用,沒有父節(jié)點 parent 和其他兄弟節(jié)點 sibling 的引用,這導(dǎo)致了要一次性遞歸把所有 vdom 節(jié)點渲染到 dom 才行,不可打斷。

萬一打斷了會怎么樣呢?因為沒有記錄父節(jié)點和兄弟節(jié)點,那只能繼續(xù)處理子節(jié)點,卻不能處理 vdom 的其他部分了。

所以 React 才引入了這種 fiber 的結(jié)構(gòu),也就是有父節(jié)點 return、子節(jié)點 child、兄弟節(jié)點 sibling 等引用,可以打斷,因為斷了再恢復(fù)也能找到后面所有沒處理過的節(jié)點。

fiber 節(jié)點的結(jié)構(gòu)是這樣的:

這個過程可以打斷,自然也就可以調(diào)度,也就是 schdule 的過程。

所以 fiber 架構(gòu)就分為了 schdule、reconcile(vdom 轉(zhuǎn) fiber)、commit(更新到 dom)三個階段。

函數(shù)組件內(nèi)可以用 hooks 來存取一些值,這些值就是存在 fiber 節(jié)點上的。

比如這個函數(shù)組件內(nèi)用到了 6 個 hook:

那么對應(yīng)的 fiber 節(jié)點上就有個 6 個元素的 memorizedState 鏈表:

通過 next 串聯(lián)起來:

不同的 hook 在 memorizedState 鏈表不同的元素上存取值,這就是 react hooks 的原理。

這個鏈表有創(chuàng)建階段和更新階段,所以你會發(fā)現(xiàn) useXxx 的最終實現(xiàn)都分為了 mountXxx 和 updateXxx:

這里的 mount 階段就是創(chuàng)建 hook 節(jié)點并組裝成鏈表的:

會把創(chuàng)建好的 hook 鏈表掛到 fiber 節(jié)點的 memorizedState 屬性上。

那更新的時候自然也就能從 fiber 節(jié)點上取出這個 hook 鏈表:

這樣在多次渲染中,useXxx 的 api 都能在 fiber 節(jié)點上找到對應(yīng)的 memorizedState。

這就是 react hooks 的原理,可以看到它是把 hook 存在 fiber 節(jié)點上的。

那 preact 有什么不同呢?

preact 如何實現(xiàn) hooks

preact 是兼容 react 代碼的更輕量級的框架,它支持 class 組件和 function 組件,也支持了 hooks 等 react 特性。不過它沒有實現(xiàn) fiber 架構(gòu)。

因為它主要考慮的是體積的極致(只有 3kb),而不是性能的極致。

剛才我們了解了 react 是把 hook 鏈表存放在 fiber 節(jié)點上的,那 preact 沒有 fiber 節(jié)點,會把 hook 鏈表存在哪呢?

其實也很容易想到,fiber 只是對 vdom 做了下改造用于提升性能的,和 vdom 沒啥本質(zhì)的區(qū)別,那就把 hook 存在 vdom 上不就行了?

確實,preact 就是把 hook 鏈表放在了 vdom 上。

比如這個有 4 個 hooks 的函數(shù)組件:

它的實現(xiàn)就是在 vdom 上存取對應(yīng)的 hook:

它沒有像 react 那樣把 hook 分為 mount 和 update 兩個階段,而是合并到一起處理了。

如果,它把 hooks 存在了 component.__hooks 的數(shù)組上,通過下標(biāo)訪問。

這個 component 就是 vdom 上的一個屬性:

也就是把 hooks 的值存在了 vnode._component._hooks 的數(shù)組上。

對比下 react 和 preact 實現(xiàn) hooks 的差異:

  • react 中是把 hook 鏈表存放在 fiberNode.memorizedState 屬性上,preact 中是把 hook 鏈表存放在 vnode._component._hooks 屬性上。
  • react 中的 hook 鏈表通過 next 串聯(lián),preact 中的 hook 鏈表就是個數(shù)組,通過下標(biāo)訪問。
  • react 把 hook 鏈表的創(chuàng)建和更新分離開,也就是 useXxx 會分為 mountXxx 和 updateXxx 來實現(xiàn),而 preact 中合并在一起處理的。

所以說,hooks 的實現(xiàn)并不依賴 fiber,它只不過是找個地方存放組件對應(yīng)的 hook 的數(shù)據(jù),渲染時能取到就行,存放在哪里是無所謂的。

因為 vdom、fiber 和組件渲染強相關(guān),所以存放在了這些結(jié)構(gòu)上。

像 react ssr 實現(xiàn) hooks,就既沒有存在 fiber 上,也沒有存在 vdom 上:

react ssr 如何實現(xiàn) hooks

其實 react-dom 包除了可以做 csr 外,也可以做 ssr:

csr 時使用 react-dom 的 render 方法:

ssr 的時候使用 react-dom/server 的 renderToString 方法或 renderToStream 方法:

大家覺得 ssr 的時候會做 vdom 到 fiber 的轉(zhuǎn)換么?

肯定不會呀,fiber 是為了提高在瀏覽器中運行時的渲染性能,把計算變成可打斷的,在空閑時做計算,才引入的一種結(jié)構(gòu)。

服務(wù)端渲染自然就不需要 fiber。

不需要 fiber 的話,它把 hook 鏈表存放在哪里呢?vdom 么?

確實可以放在 vdom,但是其實并沒有。

比如 useRef 這個 hooks:

它是從 firstWorkInProgressHook 開始的用 next 串聯(lián)的一個鏈表。

而 firstWorkInProgressHook 最開始用 createHook 創(chuàng)建的第一個 hook 節(jié)點:

并沒有掛載到 vdom 上。

為什么呢?

因為 ssr 只需要渲染一次呀,又不需要更新,自然沒必要掛到 vdom 上。

只要每次處理完每個組件的 hooks 就清空一下這個 hook 鏈表就行:

所以,react ssr 時,hooks 是存在全局變量上的。

對比下 react csr 和 ssr 時的 hooks 實現(xiàn)原理的區(qū)別:

  • csr 時會從 vdom 創(chuàng)建 fiber,用于把渲染變成可打斷的,通過空閑調(diào)度來提高性能,而 ssr 時不會,是 vdom 直接渲染的。
  • csr 時把 hooks 保存到了 fiber 節(jié)點上,ssr 時是直接放在了全局變量上,每個組件處理完就晴空。因為不會用第二次了。
  • csr 時會把 hook 的創(chuàng)建和更新分為 mount 和 update 兩個階段,而 ssr 因為只會處理一次,只有創(chuàng)建階段。

hooks 的實現(xiàn)原理其實不復(fù)雜,就是在某個上下文中存放一個鏈表,然后 hooks api 從鏈表不同的元素上訪問對應(yīng)的數(shù)據(jù)來完成各自的邏輯。這個上下文可以是 vdom、fiber 甚至是全局變量。

不過 hooks 這個思想還是挺火的,淘寶出的服務(wù)端框架 midway 就在引入了 hooks 的思想:

midway 如何實現(xiàn) hooks

midway 是一個 Node.js 框架:

服務(wù)端框架自然就沒有 vdom、fiber 這種結(jié)構(gòu),不過 hooks 的思想并不依賴這些,實現(xiàn) hooks 的 api 只需要在某個上下文放一個鏈表就行。

midway 就實現(xiàn)了類似 react hooks 的 api:

具體它這個 hook 鏈表存在哪我還沒看,不過我們已經(jīng)掌握 hooks 的實現(xiàn)原理了,只要有個上下文存放 hook 鏈表就行,在哪都可以。

總結(jié)

react hooks 是在 react fiber 架構(gòu)之后出現(xiàn)的特性,很多人誤以為 hooks 必須配合 fiber 才能實現(xiàn),我們分別看了 react、preact、react ssr、midway 中的 hooks 的實現(xiàn),發(fā)現(xiàn)并不是這樣的:

  • react 是把 vdom 轉(zhuǎn)成 fiber,然后把 hook 鏈表存放到了 fiber.memorizedState 屬性上,通過 next 串聯(lián)
  • preact 沒有實現(xiàn) fiber,它是把 hook 鏈表放到了 vnode._component._hooks 屬性上,數(shù)組實現(xiàn)的,通過下標(biāo)訪問
  • react ssr 時不需要 fiber,但是也沒有把 hook 鏈表掛到 vdom 上,而是直接放在了一個全局變量上,因為只需要渲染一次,渲染完一個組件就清空這個全局變量就行
  • midway 是一個 Node.js 框架,它也實現(xiàn)了 hooks 類似的 api,具體放在哪我們沒深入,但是只要有個上下文存放 hook 鏈表就行

所以,react hooks 必須依賴 fiber 才能實現(xiàn)么?

明顯不是,搭配 fiber、搭配 vdom、搭配全局變量,甚至任何一個上下文都可以。在框架中引入 hooks 的 api 并不難。

責(zé)任編輯:姜華 來源: 神光的編程秘籍
相關(guān)推薦

2020-10-28 09:12:48

React架構(gòu)Hooks

2022-02-11 13:44:56

fiber架構(gòu)React

2022-07-13 15:23:57

Vue fiberreact前端

2022-08-21 09:41:42

ReactVue3前端

2023-03-21 08:31:13

ReconcilerFiber架構(gòu)

2023-12-01 09:14:58

ReactFiber

2019-08-20 15:16:26

Reacthooks前端

2023-11-06 08:00:00

ReactJavaScript開發(fā)

2021-03-18 08:00:55

組件Hooks React

2024-06-04 14:17:26

2022-03-31 17:54:29

ReactHooks前端

2020-09-19 17:46:20

React Hooks開發(fā)函數(shù)

2019-03-13 10:10:26

React組件前端

2022-02-10 19:15:18

React監(jiān)聽系統(tǒng)模式

2021-05-11 08:48:23

React Hooks前端

2023-05-08 07:52:29

JSXReactHooks

2022-07-18 09:01:58

React函數(shù)組件Hooks

2020-08-10 06:31:01

React Hooks前端開發(fā)

2022-03-16 22:24:50

ReactstateHooks

2021-11-05 10:36:19

性能優(yōu)化實踐
點贊
收藏

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

精品国产一区久久久| 日本一级理论片在线大全| 99久久精品一区二区成人| 在线免费观看日本欧美爱情大片| 欧美日韩在线另类| 91久久久久久久久久久久久| 免费观看a级片| 色wwwwww| 狠狠爱综合网| 欧美一区三区四区| 在线观看成人av电影| 国产 日韩 欧美 在线| 精品视频一二| 亚洲欧美综合色| 日本中文字幕成人| 菠萝菠萝蜜网站| 2018av在线| 成人动漫av在线| 欧美丰满少妇xxxxx| 久久精品久久99| 欧美极品视频| 国产综合一区二区| 日韩国产一区三区| 97超碰人人澡| 天天操天天射天天| 久久精品99国产国产精| 中文字幕一精品亚洲无线一区| 超碰97人人射妻| 久久免费看视频| 老司机午夜精品视频在线观看| 黄网页在线观看| 伊人精品视频| 日韩av网址在线| 日本r级电影在线观看| 黄色av电影在线播放| 2023国产精品| 国产精品劲爆视频| 国产精品18在线| crdy在线观看欧美| 亚洲最大成人综合| 超碰97网站| 精品一区二区三区人妻| 欧美日韩导航| 欧美日韩视频在线观看一区二区三区 | 19禁羞羞电影院在线观看| 国产精品久久久久影院| 91免费看片在线| 中文天堂在线播放| 自产国语精品视频| 自拍偷拍亚洲一区| av手机在线播放| 精品中文一区| 欧美另类videos死尸| 超薄肉色丝袜足j调教99| 超碰在线观看av| 性色一区二区三区| 日韩一区二区av| 波多野结衣办公室双飞| 毛片无码国产| 亚洲人成在线播放网站岛国| 国产视频精品网| 国语对白做受69按摩| 欧美成人中文| 亚洲性无码av在线| 亚洲AV无码久久精品国产一区| 麻豆视频在线观看免费网站黄| 亚洲国产福利| 亚洲小说欧美另类婷婷| 久久亚洲精品国产亚洲老地址| 苍井空张开腿实干12次| 原纱央莉成人av片| 日本韩国视频一区二区| 亚洲国产精品女人| 黄色片视频在线观看| 国产精品一区二区你懂的| 日韩免费观看网站| 波多野结衣mp4| 免费日本视频一区| 国模私拍视频一区| 亚洲女人久久久| 台湾佬综合网| 欧美成人精精品一区二区频| www.超碰com| 波多野结衣精品| 中文字幕一区二区三区不卡| 欧美h视频在线| 蜜桃视频污在线观看| 久久超碰97中文字幕| 欧美综合国产精品久久丁香| 久久久久久久中文字幕| 在线观看的日韩av| 国产成人亚洲综合| 日本一区二区不卡| xxx在线播放| 亚洲午夜精品| 欧美日韩视频第一区| 91热视频在线观看| 欧美色图婷婷| 丝袜一区二区三区| 在线免费观看视频| 66久久国产| 中文字幕亚洲无线码a| 丝袜 亚洲 另类 欧美 重口| 精品国产一区探花在线观看| 亚洲精品乱码久久久久久按摩观| 日本一道本视频| 国产成人高清| 亚洲欧美国产一本综合首页| 97精品人妻一区二区三区蜜桃| 欧美高清hd| 亚洲欧美国产精品专区久久| 青青草激情视频| 久久免费av| 国产一区二区三区在线看| 中国美女乱淫免费看视频| 久草精品视频| 亚洲国产精品成人一区二区| www.啪啪.com| 国产精品毛片一区二区在线看| 日韩在线观看你懂的| 日韩免费一级片| 亚洲黄色精品| 91av网站在线播放| 欧美一区二区三区网站| 日韩电影在线一区二区三区| 国产精品九九九| 天堂av资源网| 亚洲精品写真福利| 国产精品www在线观看| av中文资源在线资源免费观看| 欧美唯美清纯偷拍| 国产福利精品一区二区三区| 国产精品久久久久久av公交车| 欧美一级免费观看| 男男一级淫片免费播放| 亚洲欧洲美洲一区二区三区| 国产精品免费视频xxxx| 99在线观看免费| 大白屁股一区二区视频| 久久精品日韩精品| 亚洲国产精品无码久久久久高潮| 国产三级漂亮女教师| 国产精品77777竹菊影视小说| 99re在线观看视频| 视频一区二区三区不卡| 又紧又大又爽精品一区二区| 人妻少妇精品无码专区二区| 日韩成人在线看| 日韩电视剧在线观看免费网站 | 欧美亚洲大陆| 992tv在线成人免费观看| 韩国av在线免费观看| 91蜜桃视频在线| 一本久道久久综合狠狠爱亚洲精品| 国产日产一区二区三区| 欧美精品黑人性xxxx| 精品视频第一页| 久久福利视频一区二区| 在线看视频不卡| 国产一区二区三区免费在线| 久久亚洲精品视频| 国产黄色免费大片| 亚洲一区二区视频| 午夜精品久久久内射近拍高清| 女同一区二区三区| 26uuu亚洲国产精品| 国产精品无码久久av| 2020日本不卡一区二区视频| 日本成年人网址| 精品一区av| 成人性生交大片免费看视频直播| 天堂在线中文字幕| 亚洲色图欧美激情| av在线网站免费观看| 欧美黄在线观看| 久久精品一二三区| 91福利精品在线观看| 久久久国产一区二区| 老牛影视av牛牛影视av| 欧美日韩免费在线观看| 成人黄色免费网址| 亚洲视频成人| 国产精品国产一区二区| 国产不卡在线| 欧美日韩一二三| 欧产日产国产v| 91一区二区在线观看| 欧洲精品在线播放| 精品久久国产一区| 538国产精品视频一区二区| a天堂在线资源| 色噜噜夜夜夜综合网| 欧美特黄一级片| 成人免费毛片片v| 超碰影院在线观看| 精品一区毛片| 亚洲自拍中文字幕| 草莓福利社区在线| 日韩av一卡二卡| av网站免费大全| 色综合久久中文综合久久牛| 黄色录像a级片| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产在线视频综合| 青草国产精品| 国产欧美日韩91| 日韩子在线观看| 亚洲精品456在线播放狼人| 久久精品这里有| 成人免费电影视频| 亚洲欧美激情网| 日韩av有码| 成人黄色激情网| 综合日韩av| 欧美激情欧美狂野欧美精品| eeuss影院在线观看| 日韩激情av在线播放| 国产伦子伦对白视频| 91国产免费看| 全部毛片永久免费看| 亚洲在线中文字幕| 看黄色录像一级片| 国产亚洲一区二区三区在线观看| 另类小说第一页| 国产精品老牛| 91免费黄视频| 欧美二区视频| 中文字幕一区二区三区四区五区六区| 蜜桃tv一区二区三区| 高清av免费一区中文字幕| 欧美高清一区二区| 欧美亚洲系列| 日韩精品亚洲精品| 蜜臀99久久精品久久久久小说 | 日韩和一区二区| 久久欧美中文字幕| 午夜剧场免费看| 久久亚洲风情| 日韩在线综合网| 狠狠综合久久av一区二区蜜桃| 国产91精品一区二区绿帽| 亚洲视频自拍| 成人黄色激情网| 亚洲香蕉久久| 91视频国产高清| 久久天堂久久| 97se在线视频| 美女一区网站| 国产97色在线|日韩| 欧美少妇网站| 日本伊人精品一区二区三区介绍| 人人鲁人人莫人人爱精品| 久久精品夜夜夜夜夜久久| 男人在线资源站| 久久视频国产精品免费视频在线| 快射av在线播放一区| 久久精品99久久香蕉国产色戒| 日本暖暖在线视频| 久久久精品在线| 日韩av毛片| 欧美在线亚洲一区| 性欧美1819sex性高清| 欧美精品在线观看91| 久久精品蜜桃| 在线日韩精品视频| 麻豆传媒在线免费| 久久国产精品久久久久久久久久| 在线视频观看国产| 在线日韩中文字幕| 免费av毛片在线看| 久久亚洲影音av资源网| 日韩av激情| 日韩美女av在线免费观看| 久久av影院| 奇米一区二区三区四区久久| 欧美日韩不卡| 成人免费淫片aa视频免费| 视频亚洲一区二区| 精品一区二区三区日本| 亚洲国产精品免费视频| 国产成人成网站在线播放青青| 欧美日韩精品一区二区三区在线观看| 日产国产精品精品a∨| 国产精品黄网站| 91探花福利精品国产自产在线| 日本精品国产| 欧美日本韩国国产| 97精品97| 黄色一级视频片| 精品一区中文字幕| 国产麻豆剧传媒精品国产av| 国产三级精品三级| 国产一级片播放| 欧洲人成人精品| 中文字幕视频网| 福利一区福利二区微拍刺激| 中文字幕一二三四| 精品久久久影院| 在线观看完整版免费| 在线视频一区二区| 国产后进白嫩翘臀在线观看视频| 国产精品成人久久久久| av不卡一区| 亚洲a一级视频| 自拍偷拍欧美一区| 欧美一级二级三级| 自拍亚洲一区| 国内精品国产三级国产99| 久久久久国产精品午夜一区| 日本成年人网址| 国产suv一区二区三区88区| 杨幂一区二区国产精品| 久久久久久久网| 国产视频三区四区| 午夜久久久久久久久| 日韩av在线天堂| 欧美一区二区三区视频免费| 国产三级视频在线看| 中文日韩电影网站| 深夜成人在线| 国产精品国产精品| 亚洲精品一区二区在线看| 日本新janpanese乱熟| 99精品偷自拍| 激情综合网五月婷婷| 欧美一区二区人人喊爽| 无遮挡的视频在线观看 | 粉嫩一区二区三区性色av| 超碰人人干人人| 在线中文字幕一区| 日韩a在线观看| 亚洲网站在线观看| 大菠萝精品导航| 51精品国产黑色丝袜高跟鞋| 亚洲精品一区二区三区在线| 椎名由奈jux491在线播放| 日韩国产高清影视| 成人激情五月天| 在线免费视频一区二区| 嫩草在线播放| 全球成人中文在线| 日韩在线你懂的| 久久久免费视频网站| 91丝袜国产在线播放| a v视频在线观看| 日韩电影中文字幕av| 小视频免费在线观看| 久久综合婷婷综合| 美女视频一区免费观看| 亚洲天堂视频一区| 日本韩国欧美在线| 幼a在线观看| 成人黄色av网站| 欧美私人啪啪vps| 精品久久久噜噜噜噜久久图片| 91老师片黄在线观看| 免费的毛片视频| 最新91在线视频| 精品一区91| 国产高清av在线播放| 久久综合99re88久久爱| 成人毛片一区二区三区| 中文字幕日韩欧美| 国产精品视频一区二区三区综合 | 亚洲精品乱码久久久久久蜜桃麻豆| 国产精品果冻传媒| 狠狠做深爱婷婷久久综合一区| 欧洲伦理片一区 二区 三区| 国产精品xxxxx| 综合久久久久| a天堂视频在线观看| 色综合久久中文字幕综合网| 在线免费黄色| 成人欧美一区二区| 久草综合在线视频| 欧美精品v国产精品v日韩精品| 麻豆网站视频在线观看| 国产精品12| 久久字幕精品一区| 麻豆明星ai换脸视频| 欧美日韩一区免费| 成黄免费在线| 91青青草免费观看| 久久99伊人| 中文字幕av播放| 日韩精品亚洲元码| 成人免费观看49www在线观看| 一二三四视频社区在线| 国产激情视频一区二区在线观看| 日韩激情一区二区三区| 在线播放精品一区二区三区| 亚洲va欧美va人人爽成人影院| 国产免费毛卡片| 99久久久久免费精品国产| 国产免费无码一区二区视频| 亚洲精品天天看| 欧美片网站免费| 国产成人精品无码播放| 尤物视频一区二区| 东凛在线观看|