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

圖解 React 的 Diff 算法:核心就兩個(gè)字 — 復(fù)用

開發(fā) 前端
React 是基于 Vdom 的前端框架,組件渲染產(chǎn)生 Vdom,渲染器把 Vdom 渲染成 Dom。

React 是基于 vdom 的前端框架,組件 render 產(chǎn)生 vdom,然后渲染器把 vdom 渲染出來。

state 更新的時(shí)候,組件會(huì)重新 render,產(chǎn)生新的 vdom,在瀏覽器平臺(tái)下,為了減少 dom 的創(chuàng)建,React 會(huì)對兩次的 render 結(jié)果做 diff,盡量復(fù)用 dom,提高性能。

diff 算法是前端框架中比較復(fù)雜的部分,代碼比較多,但今天我們不上代碼,只看圖來理解它。

首先,我們先過一下 react 的 fiber 架構(gòu):

Fiber 架構(gòu)

React 是通過 jsx 描述頁面結(jié)構(gòu)的:

function Profile() {
return <div>
<img src="avatar.png" className="profile" />
<h3>{[user.firstName, user.lastName].join(" ")}</h3>
</div>
}

經(jīng)過 babel 等的編譯會(huì)變成 render function:

import { jsx as _jsx } from "react/jsx-runtime";
import { jsxs as _jsxs } from "react/jsx-runtime";
const profile = _jsxs("div", {
children: [
_jsx("img", {
src: "avatar.png",
className: "profile",
}),
_jsx("h3", {
children: [user.firstName, user.lastName].join(" "),
}),
],
});

render function 執(zhí)行結(jié)果就是 vdom,也就是 React Element 的實(shí)例:

圖片圖片

在 16 之前,React 是直接遞歸渲染 vdom 的,setState 會(huì)觸發(fā)重新渲染,對比渲染出的新舊 vdom,對差異部分進(jìn)行 dom 操作。

在 16 之后,為了優(yōu)化性能,會(huì)先把 vdom 轉(zhuǎn)換成 fiber,也就是從樹轉(zhuǎn)換成鏈表,然后再渲染。整體渲染流程分成了兩個(gè)階段:

  • render 階段:從 vdom 轉(zhuǎn)換成 fiber,并且對需要 dom 操作的節(jié)點(diǎn)打上 effectTag 的標(biāo)記。
  • commit 階段:對有 effectTag 標(biāo)記的 fiber 節(jié)點(diǎn)進(jìn)行 dom 操作,并執(zhí)行所有的 effect 副作用函數(shù)。

從 vdom 轉(zhuǎn)成 fiber 的過程叫做 reconcile(調(diào)和),這個(gè)過程是可以打斷的,由 scheduler 調(diào)度執(zhí)行。

圖片圖片

diff 算法作用在 reconcile 階段:

第一次渲染不需要 diff,直接 vdom 轉(zhuǎn) fiber。

再次渲染的時(shí)候,會(huì)產(chǎn)生新的 vdom,這時(shí)候要和之前的 fiber 做下對比,決定怎么產(chǎn)生新的 fiber,對可復(fù)用的節(jié)點(diǎn)打上修改的標(biāo)記,剩余的舊節(jié)點(diǎn)打上刪除標(biāo)記,新節(jié)點(diǎn)打上新增標(biāo)記。

接下來我們就來詳細(xì)了解下 React 的 diff 算法:

React 的 diff 算法

在講 diff 算法實(shí)現(xiàn)之前,我們要先想明白為什么要做 diff,不做行么?

當(dāng)然可以,每一次渲染都直接把 vdom 轉(zhuǎn)成 fiber 就行,不用和之前的做對比,這樣是可行的。

其實(shí) SSR 的時(shí)候就不用做 diff,因?yàn)闀?huì)把組件渲染成字符串,第二次渲染也是產(chǎn)生字符串,難道這時(shí)候還要和之前的字符串對比下,有哪些字符串可以復(fù)用么?

不需要,SSR 的時(shí)候就沒有 diff,每次都是 vdom 渲染出新的字符串。

那為什么瀏覽器里要做 diff 呢?

因?yàn)?dom 創(chuàng)建的性能成本很高,如果不做 dom 的復(fù)用,那前端框架的性能就太差了。

diff 算法的目的就是對比兩次渲染結(jié)果,找到可復(fù)用的部分,然后剩下的該刪除刪除,該新增新增。

那具體怎么實(shí)現(xiàn) React 的 diff 算法呢?

比如父節(jié)點(diǎn)下有 A、B、C、D 四個(gè)子節(jié)點(diǎn),那渲染出的 vdom 就是這樣的:

圖片

經(jīng)過 reconcile 之后,會(huì)變成這樣的 fiber 結(jié)構(gòu):

圖片

那如果再次渲染的時(shí)候,渲染出了 A、C、B、E 的 vdom,這時(shí)候怎么處理呢?

圖片

再次渲染出 vdom 的時(shí)候,也要進(jìn)行 vdom 轉(zhuǎn) fiber 的 reconcile 階段,但是要盡量能復(fù)用之前的節(jié)點(diǎn)。

那怎么復(fù)用呢?

一一對比下不就行了?

先把之前的 fiber 節(jié)點(diǎn)放到一個(gè) map 里,key 就是節(jié)點(diǎn)的 key:

圖片

然后每個(gè)新的 vdom 都去這個(gè) map 里查找下有沒有可以復(fù)用的,找到了的話就移動(dòng)過來,打上更新的 effectTag:

圖片

這樣遍歷完 vdom 節(jié)點(diǎn)之后,map 里剩下一些,這些是不可復(fù)用的,那就刪掉,打上刪除的 effectTag;如果 vdom 中還有一些沒找到復(fù)用節(jié)點(diǎn)的,就直接創(chuàng)建,打上新增的 effectTag。

這樣就實(shí)現(xiàn)了更新時(shí)的 reconcile,也就是上面的 diff 算法。其實(shí)核心就是找到可復(fù)用的節(jié)點(diǎn),剩下的舊節(jié)點(diǎn)刪掉,新節(jié)點(diǎn)新增。

但有的時(shí)候可以再簡化一下,比如上次渲染是 A、B、C、D,這次渲染也是 A、B、C、D,那直接順序?qū)Ρ认戮托校瑳]必要建立 map 再找。

所以 React 的 diff 算法是分成兩次遍歷的:

第一輪遍歷,一一對比 vdom 和老的 fiber,如果可以復(fù)用就處理下一個(gè)節(jié)點(diǎn),否則就結(jié)束遍歷。

如果所有的新的 vdom 處理完了,那就把剩下的老 fiber 節(jié)點(diǎn)刪掉就行。

如果還有 vdom 沒處理,那就進(jìn)行第二次遍歷:

第二輪遍歷,把剩下的老 fiber 放到 map 里,遍歷剩下的 vdom,從 map 里查找,如果找到了,就移動(dòng)過來。

第二輪遍歷完了之后,把剩余的老 fiber 刪掉,剩余的 vdom 新增。

這樣就完成了新的 fiber 結(jié)構(gòu)的創(chuàng)建,也就是 reconcile 的過程。

比如上面那個(gè)例子,第一輪遍歷就是這樣的:

圖片

一一對比新的 vdom 和 老的 fiber,發(fā)現(xiàn) A 是可以復(fù)用的,那就創(chuàng)建新 fiber 節(jié)點(diǎn),打上更新標(biāo)記。

C 不可復(fù)用,所以結(jié)束第一輪遍歷,進(jìn)入第二輪遍歷。

圖片

把剩下的 老 fiber 節(jié)點(diǎn)放到 map 里,然后遍歷新的 vdom 節(jié)點(diǎn),從 map 中能找到的話,就是可復(fù)用,移動(dòng)過來打上更新的標(biāo)記。

遍歷完之后,剩下的老 fiber 節(jié)點(diǎn)刪掉,剩下的新 vdom 新增。

這樣就完成了更新時(shí)的 reconcile 的過程。

總結(jié)

react 是基于 vdom 的前端框架,組件渲染產(chǎn)生 vdom,渲染器把 vdom 渲染成 dom。

瀏覽器下使用 react-dom 的渲染器,會(huì)先把 vdom 轉(zhuǎn)成 fiber,找到需要更新 dom 的部分,打上增刪改的 effectTag 標(biāo)記,這個(gè)過程叫做 reconcile,可以打斷,由 scheducler 調(diào)度執(zhí)行。reconcile 結(jié)束之后一次性根據(jù) effectTag 更新 dom,叫做 commit。

這就是 react 的基于 fiber 的渲染流程,分成 render(reconcile + schedule)、commit 兩個(gè)階段。

當(dāng)渲染完一次,產(chǎn)生了 fiber 之后,再次渲染的 vdom 要和之前的 fiber 對比下,再?zèng)Q定如何產(chǎn)生新的 fiber,目標(biāo)是盡可能復(fù)用已有的 fiber 節(jié)點(diǎn),這叫做 diff 算法。

react 的 diff 算法分為兩個(gè)階段:

第一個(gè)階段一一對比,如果可以復(fù)用就下一個(gè),不可以復(fù)用就結(jié)束。

第二個(gè)階段把剩下的老 fiber 放到 map 里,遍歷剩余的 vdom,一一查找 map 中是否有可復(fù)用的節(jié)點(diǎn)。

最后把剩下的老 fiber 刪掉,剩下的新 vdom 新增。

這樣就完成了更新時(shí)的 reconcile 過程。

其實(shí) diff 算法的核心就是復(fù)用節(jié)點(diǎn),通過一一對比也好,通過 map 查找也好,都是為了找到可復(fù)用的節(jié)點(diǎn),移動(dòng)過來。然后剩下的該刪刪該增增。

理解了如何找到可復(fù)用的節(jié)點(diǎn),就理解了 diff 算法的核心。

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

2022-04-15 08:07:21

ReactDiff算法

2022-07-09 20:35:23

數(shù)字化企業(yè)轉(zhuǎn)型

2021-02-01 08:33:16

Redis排序內(nèi)存

2024-12-05 09:45:25

Reactdiff 算法前端開發(fā)

2022-04-01 11:39:32

互聯(lián)網(wǎng)裁員紅利

2021-05-13 07:30:27

Kafka消息流系統(tǒng)

2023-07-03 07:51:47

2017-06-14 13:42:00

字典數(shù)據(jù)社交

2011-09-01 21:41:42

SQL Server把字符分割成兩個(gè)字符串

2022-05-06 07:19:11

DOMDiff算法

2020-10-26 08:19:53

算法隊(duì)列

2022-06-28 15:13:12

Vuediff 算法

2023-03-14 07:23:48

ReactJSX語法

2020-05-20 14:25:45

Reactreact.js前端

2021-08-03 08:13:47

數(shù)據(jù)

2023-12-06 07:16:31

Go語言語句

2017-06-05 11:23:45

LinuxDiff和Meld工具

2022-01-05 09:40:03

DIff算法前端

2010-03-04 09:50:14

企業(yè)定制軟件開發(fā)

2022-12-07 11:21:30

Reactdiff
點(diǎn)贊
收藏

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

日韩欧美高清在线| 中文字幕精品无码一区二区| 日韩av黄色| 亚洲欧美区自拍先锋| 国产精品毛片一区视频| 日韩欧美一区二区在线观看| 99er在线视频| 无码国产精品高潮久久99| 葵司免费一区二区三区四区五区| 色偷偷9999www| 中文字幕一二三区| 在线亚洲人成| 亚洲免费毛片网站| 久久久久久亚洲精品不卡4k岛国| 在线观看国产区| 欧美精品入口| 一区二区三区天堂av| 欧美人与性动交α欧美精品| 综合久久2023| 亚洲黄色av一区| 日本一区不卡| 欧洲成人一区二区三区| 蜜乳av一区二区三区| 久久久久久久久久国产| 日韩精品久久久久久久的张开腿让| 91成人午夜| 欧美日韩一区不卡| 缅甸午夜性猛交xxxx| 麻豆网站在线看| 久久久久成人黄色影片| 国产一区二区三区高清视频| 91在线你懂的| 日韩经典中文字幕一区| 性视频1819p久久| 免费中文字幕在线| 欧美激情另类| 在线视频欧美日韩| 91精品人妻一区二区三区蜜桃欧美 | 在线观看中文字幕2021| 97caopron在线视频| 91麻豆免费看片| 成人免费在线看片| 亚洲天堂自拍偷拍| 巨乳诱惑日韩免费av| 91极品视频在线| 欧美成欧美va| 污网站在线免费看| 久久久久久久久久美女| 99久久自偷自偷国产精品不卡| 一级一级黄色片| 久久精品动漫| 欧美孕妇性xx| 亚洲蜜桃av| 黑人操亚洲女人| 国产精品一区二区不卡| 91精品啪aⅴ在线观看国产| 在线观看国产黄| 热久久一区二区| 国产精品久久久久久网站| 一级黄色在线视频| 久久综合图片| 国产精品久久久久久久久影视 | 日本亚洲欧洲无免费码在线| 日本道在线观看一区二区| 91视频 -- 69xx| 无码小电影在线观看网站免费| 午夜视频在线观看一区二区三区| 国产精品久久..4399| 小h片在线观看| 一本大道久久精品懂色aⅴ| 女人扒开屁股爽桶30分钟| 欧美成人影院| 在线观看日韩精品| 亚洲美女性囗交| 日韩精品一区二区三区中文| 精品sm捆绑视频| 精品夜夜澡人妻无码av| 国产欧美日韩免费观看| xxx欧美精品| 欧美久久久久久久久久久久| 亚洲尤物在线| 国产精品美乳在线观看| 99在线小视频| 99在线精品观看| 日本一区视频在线| 免费观看成人高潮| 一个色综合av| 岛国在线视频网站| 国产成人av电影在线播放| 99久久精品久久久久久ai换脸| 老牛影视av牛牛影视av| 久久综合色之久久综合| 亚洲激情电影在线| 在线网址91| 欧美日韩国产色| 日本三级黄色网址| 成人性生交大片免费观看网站| 亚洲第一综合色| 欧美日韩在线中文| 欧美视频精品| 亚洲精品在线免费播放| 久久午夜福利电影| 一区二区电影| 国产精品青草综合久久久久99| 精品免费日产一区一区三区免费| 黑人与亚洲人色ⅹvideos| 亚洲婷婷国产精品电影人久久| 免费特级黄色片| 成人影院在线免费观看| 日韩成人影音| 欧美日韩国产在线看| 黄色在线视频网| 欧美韩一区二区| 久久亚洲欧美日韩精品专区 | 无码精品在线观看| 国产精品成人午夜| 99精品视频在线看| 亚洲精品一区二区三区中文字幕| 中文字幕精品—区二区| 国产尤物在线视频| 国产69精品久久久久毛片 | 91精品国产高清91久久久久久| 亚洲精品一区国产精品| 色网站在线播放| 麻豆精品蜜桃视频网站| 久精品国产欧美| av网址在线| 欧美日精品一区视频| jizz日本免费| 激情亚洲网站| 亚洲一区二区三区在线视频| 成人一区二区不卡免费| 欧美日韩一区二区在线| 国产精品成人免费一区久久羞羞| 日韩欧美综合| 亚洲精品国偷自产在线99热| 国产成人精品日本亚洲11| 成人高清在线| 欧美小视频在线| zjzjzjzjzj亚洲女人| 一个色综合网| 成人免费视频97| av网站在线免费观看| 在线观看免费一区| 黄色一级视频在线播放| 96视频在线观看欧美| 亚洲色图av在线| 亚洲天堂一区在线| 99精品一区二区| 日本欧美视频在线观看| 国内精品偷拍| 午夜精品一区二区三区在线| 黑人糟蹋人妻hd中文字幕| 国内精品视频| 乱亲女秽乱长久久久| 99精品在线看| 亚洲精品菠萝久久久久久久| 男人添女人荫蒂国产| 欧美日本亚洲韩国国产| 高清国产一区| 欧美日韩偷拍视频| 婷婷在线播放| 日韩午夜精品视频| 欧美日韩在线观看免费| 国产高清不卡一区| 大西瓜av在线| 欧美一区二区三区久久| 庆余年2免费日韩剧观看大牛| 免费在线视频一级不卡| 欧美性videosxxxxx| 天堂а√在线中文在线鲁大师| 极品美女销魂一区二区三区| 大片在线观看网站免费收看| 久久国产精品色av免费看| 欧美亚洲成人精品| porn亚洲| 日韩视频一区在线观看| 精品成人久久久| 久久日一线二线三线suv| 久久99爱视频| 欧美日韩日本国产亚洲在线| 久久精品国产综合精品| 亚洲第一会所| 美日韩丰满少妇在线观看| 日韩专区第一页| 欧美在线免费视屏| 日韩精品123区| 99精品热视频| 国产又黄又猛的视频| 亚洲第一毛片| 婷婷五月色综合| 51亚洲精品| 在线亚洲伦理| 国产高清精品一区| 日韩大尺度黄色| 日韩av一卡二卡| 91国内在线播放| 国产精品vip| 久久精品日产第一区二区三区精品版| 欧美暴力调教| 欧美国产激情18| 男人久久精品| 日韩一级免费观看| 亚洲 欧美 成人| 亚洲欧洲日韩精品在线| 亚洲午夜精品17c| 男男做爰猛烈叫床爽爽小说| 麻豆高清免费国产一区| 蜜臀精品一区二区| 青青草国产免费一区二区下载| 99在线观看视频网站| 视频精品导航| 欧美亚洲国产另类| 激情无码人妻又粗又大| 91在线免费播放| 久久精品无码一区二区三区毛片| 视频一区中文字幕| www.日本在线播放| 女人色偷偷aa久久天堂| 亚洲精品免费在线看| 国产真人做爰视频免费| 欧美va久久久噜噜噜久久| 国产亚洲福利社区| 日韩精品中文字幕吗一区二区| 国产精品视频一区二区三区四 | 日韩在线精品强乱中文字幕| 国产精品日日摸夜夜添夜夜av| av综合电影网站| 91精品国产免费久久久久久| 日韩欧美一起| 久久av在线播放| 日本a在线播放| 中文字幕在线精品| 成年人视频在线观看免费| 亚洲人成网站999久久久综合| 人人妻人人澡人人爽人人欧美一区 | www.久久草.com| 成人黄色免费网站在线观看| 日韩毛片在线| 国产精品看片资源| 欧洲成人一区| 国产精品吴梦梦| 激情中国色综合| 国产精品露脸自拍| 伦一区二区三区中文字幕v亚洲| 国产精品情侣自拍| 久久婷婷五月综合色丁香| 国产精品日韩在线播放| 九七电影院97理论片久久tvb| 国产精品久久久久久久久免费| 88xx成人网| 成人黄色片在线| 精品午夜av| 国产伦精品一区二区三毛| 成人直播在线观看| 国产99久久精品一区二区永久免费 | 欧美亚洲色图校园春色| 国产在线一区观看| 国产精品一区二区在线观看| 国产精久久久| 91在线国产电影| 动漫一区二区三区| 91国产丝袜在线放| 奇米一区二区| 国产精品麻豆免费版| 日韩在线影视| 一区二区三区在线播放欧美| 免费在线黄色影片| 亚洲新声在线观看| 日本不卡不卡| 欧美精品xxx| xxxxxx欧美| 国产精品十八以下禁看| 成人激情久久| 国产一区二区精品在线| 国产一区二区三区四区| 亚洲免费av网| 日韩一区二区久久| 久久久久国产精品熟女影院| 国产做a爰片久久毛片| 中文字幕无人区二| 久久综合九色综合欧美98| 色撸撸在线视频| 一区二区三区中文字幕电影| 草久视频在线观看| 欧美精品1区2区| 日韩在线视频免费| 中文字幕日韩精品有码视频| 中文字幕在线三区| 欧美在线视频一区| 香蕉成人在线| 精品产品国产在线不卡| 首页国产精品| 久久黄色片视频| 麻豆精品一区二区| 无码国产69精品久久久久网站| 国产日产欧美一区| 久久综合综合久久| 欧美午夜免费电影| 人妻一区二区三区四区| 精品国产一区二区在线| 韩国成人二区| 97se国产在线视频| 日韩成人影院| 大陆极品少妇内射aaaaa| 高清在线视频不卡| 午夜成人在线视频| 中文字幕福利视频| 日韩成人xxxx| 青青在线视频| 国产精品久久中文| 午夜精品福利影院| av网站手机在线观看| 激情文学综合插| 日本激情小视频| 亚洲国产精品视频| 国产乱子伦精品无码码专区| 亚洲欧美综合图区| 亚洲高清黄色| 草莓视频一区| 日韩电影免费网站| www国产精品内射老熟女| 国产一区二区三区免费观看| 成人片黄网站色大片免费毛片| 亚洲综合成人在线视频| 91超薄丝袜肉丝一区二区| 亚洲欧美日韩网| mm视频在线视频| 99国产在线| 一级欧洲+日本+国产| jizz18女人| 欧美韩日一区二区三区| 亚洲成熟少妇视频在线观看| 亚洲激情成人网| 91丝袜在线| 国产精品一码二码三码在线| 欧美88av| 色男人天堂av| 一区二区三区在线视频观看58 | 亚洲一区二区三区成人在线视频精品| 欧美日韩亚洲在线观看| 精品国产欧美日韩一区二区三区| av成人午夜| 香蕉国产精品| www.亚洲自拍| 亚洲欧洲日本在线| 91麻豆国产视频| 精品国偷自产在线| 精品国产18久久久久久二百| 久草精品在线观看| 中文字幕在线视频播放| 亚洲.国产.中文慕字在线| 日韩在线一区二区三区四区| 久久免费视频在线| 日韩极品在线| 国产一区亚洲二区三区| 久久久www成人免费毛片麻豆| 天天干天天操天天爱| 一本色道久久综合亚洲精品小说 | 91av在线网站| 欧美变态挠脚心| av免费中文字幕| 国产日韩欧美在线一区| 曰批又黄又爽免费视频| 日韩视频在线免费| 亚洲一区二区三区四区电影| 成人在线观看你懂的| 国产欧美综合在线| 一区二区久久精品66国产精品| 久久人体大胆视频| 大奶一区二区三区| 国产91美女视频| 中文字幕巨乱亚洲| 国产极品久久久| 69久久夜色精品国产69| 精品日韩毛片| 一级片黄色免费| 亚洲h精品动漫在线观看| 久草福利在线| 亚洲aa在线观看| 精品动漫av| www.日本高清视频| 日韩精品一区二区三区视频 | 国产精品一区=区| 欧美91精品| 精品无码国产污污污免费网站 | 亚洲色大成网站www| 国产精品福利久久久| 欧美日韩国产综合网| 一级黄色性视频| 日韩一区二区三区精品视频| 亚洲欧洲美洲av| 日韩精品第1页| 久久久久久久久久电影| 精品人妻久久久久一区二区三区| 欧美在线观看日本一区| 亚洲国产一成人久久精品| 亚洲黄色在线网站| 91精品午夜视频| 亚洲成人人体|