精品欧美一区二区三区在线观看 _久久久久国色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)

国内精品久久久久久久97牛牛| 精品三级国产| 国产午夜一区二区三区| 国产日韩在线观看av| 精品国产乱码久久久久久鸭王1 | 欧美亚洲免费| 日韩一区二区三区国产| 在线播放第一页| 性欧美videohd高精| 亚洲日本一区二区| 日本午夜精品一区二区| av网站在线观看免费| 在线亚洲观看| 欧美日韩高清区| 日本理论中文字幕| 成人自拍在线| 欧美高清dvd| 欧美国产激情视频| 怡红院在线观看| 国产欧美日韩在线看| 国产福利久久精品| 97在线视频人妻无码| 欧美亚洲在线| 久久久噜久噜久久综合| 亚洲区一区二区三| 自拍亚洲一区| 亚洲国产精品专区久久| 日本亚洲一区二区三区| 国产在线|日韩| 懂色av影视一区二区三区| 久久久天堂国产精品| eeuss影院www在线播放| 久久精品一二三| 国产综合色一区二区三区| 国产xxxx在线观看| 麻豆免费看一区二区三区| 奇米4444一区二区三区 | 欧美日韩福利| 精品国产拍在线观看| 99精品欧美一区二区| 天堂成人娱乐在线视频免费播放网站| 精品久久久久久久久久久久久久久 | 久久久久久久久久久影院| 好看的av在线不卡观看| 久久91亚洲精品中文字幕| 亚洲女同二女同志奶水| 欧洲乱码伦视频免费| 亚洲午夜精品久久久久久久久久久久| xxxx黄色片| 精品嫩草影院| 亚洲精品按摩视频| 国产亚洲色婷婷久久99精品91| 国产成人高清精品免费5388| 亚洲第一页自拍| 波多野结衣一二三区| 国内自拍欧美| 亚洲黄一区二区| 欧美深性狂猛ⅹxxx深喉| 香蕉久久精品| 亚洲网址你懂得| 久久久国产一级片| 天天做天天爱天天综合网2021| 色偷偷综合社区| 男的操女的网站| 香蕉久久网站| 欧美激情免费观看| 日本免费一二三区| 国产精品呻吟| 国产精品中文字幕久久久| 一级特黄特色的免费大片视频| 国内久久精品视频| 成人在线观看网址| 深夜福利视频在线免费观看| 国产亚洲精品bt天堂精选| 亚洲欧美日韩国产yyy| a级网站在线播放| 亚洲国产中文字幕在线视频综合| 自慰无码一区二区三区| 日韩高清在线| 日韩欧美一区中文| 最新中文字幕视频| 欧美综合在线视频观看| 不卡毛片在线看| 青青国产在线观看| 麻豆免费看一区二区三区| 成人av片网址| 可以直接在线观看的av| 亚洲色图19p| 免费看国产曰批40分钟| 福利一区视频| 精品国产在天天线2019| a级在线免费观看| 中文字幕人成人乱码| 欧美在线视频观看| 国产一区二区三区三州| 91在线观看下载| 一级全黄肉体裸体全过程| 96av在线| 欧美精选一区二区| 熟妇人妻久久中文字幕| 欧美成人milf| 91国在线精品国内播放| 一级特黄aa大片| 91免费观看视频| 国产精品啪啪啪视频| 欧美无毛视频| 亚洲国产精品一区二区久| 国产小视频你懂的| 免费亚洲视频| 国产精品裸体一区二区三区| 日本中文字幕在线播放| 欧美日韩裸体免费视频| 中文字幕久久久久久久| 郴州新闻综合频道在线直播| 久久免费视频在线| 国产免费黄色片| 中文字幕av一区二区三区免费看| 久久国产午夜精品理论片最新版本| 国产极品一区| 亚洲人成五月天| 国产黄色片免费看| 成人涩涩免费视频| 黄色一级片网址| 久久女人天堂| 亚洲图片欧洲图片av| 国产成人在线免费视频| 成人h动漫精品| 17c丨国产丨精品视频| 日韩成人在线电影| 国产一区二区动漫| 青草视频在线观看免费| 成人激情小说网站| 欧美亚洲色图视频| 99re6热只有精品免费观看| 久久不射电影网| 国产乱码精品一区二区三区精东 | 亚洲精品国精品久久99热| 五月婷婷一区二区| 国产精品夜夜嗨| 玖玖精品在线视频| 天天看片中文字幕| 亚洲 另类 春色 国产| 国产精品久久久久久久裸模| 午夜精品久久久内射近拍高清| 久久超级碰碰| 97精品视频在线播放| 成人av免费播放| 亚洲午夜视频在线| 午夜性福利视频| 欧美理论在线| 99中文字幕| 美女精品导航| 亚洲高清色综合| 全部毛片永久免费看| wwwwww.欧美系列| 成人小视频在线看| jizz亚洲少妇| 中国字幕a在线看韩国电影| 亚洲电影av在线| 国产无遮挡又黄又爽在线观看| 成人国产精品免费观看| 日本三级免费网站| 九九在线精品| 国产美女精品免费电影| 国产鲁鲁视频在线观看特色| 精品日韩成人av| 中国一级免费毛片| 国产欧美精品在线观看| 中文字幕亚洲欧洲| 欧美日韩一卡| 欧美日韩国产一二| 成人精品国产亚洲| 色综合五月天导航| 五月婷婷伊人网| 欧美在线观看禁18| 久久人妻无码aⅴ毛片a片app| 国产成人av网站| 免费无码不卡视频在线观看| 日韩欧美精品综合| 91沈先生播放一区二区| 瑟瑟视频在线看| 中文字幕日韩欧美精品在线观看| 国产chinasex对白videos麻豆| 亚洲二区在线视频| 干b视频在线观看| 国产精品12区| 成人在线免费播放视频| 性xxxx欧美老肥妇牲乱| 国产在线视频欧美一区二区三区| 91在线亚洲| 欧美理论片在线观看| 国内三级在线观看| 欧美一区二视频| 国产成人无码av| 亚洲综合偷拍欧美一区色| 色狠狠一区二区三区香蕉| 久久人人妻人人人人妻性色av| 日韩精彩视频在线观看| 992tv快乐视频| 精品国产91乱码一区二区三区四区| 91免费精品国偷自产在线| 妞干网免费在线视频| 久热在线中文字幕色999舞| 天堂中文在线资| 91精品国产综合久久精品图片| 中文字幕激情小说| 亚洲一区二区三区中文字幕| 免费成人深夜天涯网站| 99久久er热在这里只有精品15| 九九九九九伊人| 日韩二区在线观看| 欧美精品一区二区三区三州| 66视频精品| 亚洲精品影院| 九九免费精品视频在线观看| 高清一区二区三区视频| 亚洲高清影院| 国产精品一区二区久久久| 成人av观看| 77777少妇光屁股久久一区| www视频在线免费观看 | 国产精品秘入口| 亚洲激情国产精品| 亚洲精品久久久久久动漫器材一区| 欧美色爱综合网| 国产一级免费视频| 午夜国产不卡在线观看视频| 九九九免费视频| 亚洲蜜臀av乱码久久精品蜜桃| 亚洲精品91在线| 久久久久久电影| 国产伦精品一区二区三区妓女 | 日韩精品电影在线观看| 大肉大捧一进一出好爽视频| 亚洲电影在线| 大伊香蕉精品视频在线| 欧美特黄一区| 成人小视频在线观看免费| 一区二区在线| 国产激情片在线观看| 一本精品一区二区三区| 亚洲成年人专区| 99久久99视频只有精品| 亚洲一区影院| 国产精品久久久久蜜臀| 中文字幕在线亚洲精品| 99久久夜色精品国产亚洲96| 亚洲一区不卡在线| 国产精品91一区二区三区| 一区二区冒白浆视频| 久久要要av| 久久精品国产精品亚洲精品色| 自拍欧美日韩| 性高湖久久久久久久久aaaaa| 欧美特黄一区| 国内自拍在线观看| 老司机精品久久| 国产成人精品视频ⅴa片软件竹菊| 视频一区二区三区入口| 亚洲精品一二三四五区| 久久国产福利国产秒拍| 日韩精品视频网址| 成人永久免费视频| 欧美 变态 另类 人妖| 久久久精品国产免大香伊| 国产精品理论在线| 亚洲欧美一区二区三区极速播放| 九九热国产精品视频| 调教+趴+乳夹+国产+精品| 国产在线观看黄色| 欧美日韩激情一区二区三区| 免费日韩av电影| 免费动漫网站在线观看| 亚洲午夜久久久影院| 性开放的欧美大片| 欧美精品在线免费| 樱桃视频成人在线观看| 国产噜噜噜噜久久久久久久久| 麻豆视频久久| 九九九九九九精品| 四季av在线一区二区三区| 亚洲中文字幕无码一区二区三区| 亚洲少妇诱惑| 最新天堂在线视频| 成人黄色综合网站| 特级西西人体高清大胆| 洋洋av久久久久久久一区| 久久久久99精品成人片我成大片| 欧美日韩国产区一| 成人乱码一区二区三区| 亚洲天堂开心观看| 影音先锋男人资源在线| 国产精品白丝jk喷水视频一区| 精品国产18久久久久久二百| 欧美一区1区三区3区公司 | 黄色免费视频大全| 久久国产精品色婷婷| 国产亚洲精品成人a| 中文字幕精品—区二区四季| 国产无遮挡又黄又爽又色| 欧美性xxxxxx少妇| 色窝窝无码一区二区三区成人网站| 色悠悠久久久久| 热三久草你在线| 91av免费看| 日韩精品四区| 伊人成色综合网| 国产成人亚洲综合a∨猫咪| 精品人妻中文无码av在线| 午夜一区二区三区视频| 国产精品视频第一页| 亚洲色图欧美制服丝袜另类第一页| 丝袜美腿av在线| 成人观看高清在线观看免费| 亚洲日产av中文字幕| 日本阿v视频在线观看| 国产在线国偷精品产拍免费yy| 久久精品国产亚洲av久| 亚洲成年人影院| 免费看污污视频| xxxxxx欧美| 91亚洲精品丁香在线观看| 久久人人88| 浓精h攵女乱爱av| 国产人伦精品一区二区| 国产原创视频在线| 亚洲国产日韩精品在线| 欧美bbbxxxxx| 亚洲影院色在线观看免费| 久久影院一区| 91福利国产成人精品播放| 久久久久国产精品麻豆ai换脸| 国产精品suv一区二区三区| 亚洲第一天堂无码专区| 亚洲色图美国十次| 91在线观看免费高清完整版在线观看| 久久视频精品| 男女视频在线看| 欧美国产日韩亚洲一区| av手机天堂网| 国产亚洲福利一区| 亚洲www啪成人一区二区| 日产精品久久久一区二区| 久久精品日韩欧美| 69视频在线观看免费| 91国模大尺度私拍在线视频| 搞黄视频免费在线观看| 国产精品久久久91| 久久成人综合| 中文 日韩 欧美| 亚洲免费在线视频| 亚洲第一免费视频| 久久久免费精品| 日韩av三区| 成人精品视频一区二区| 国产精品三级电影| 欧美成人一区二区视频| 最近中文字幕mv在线一区二区三区四区| 91在线亚洲| 国产成人免费高清视频| 国产91色综合久久免费分享| 国产无遮无挡120秒| 亚洲男人天堂视频| 老司机精品视频网| 青青草综合视频| 91丨porny丨国产入口| 丁香社区五月天| 日韩中文字幕国产| 视频在线一区| av观看免费在线| 国产精品福利电影一区二区三区四区| 国产精品视频在线观看免费 | 999av小视频在线| 日产国产精品精品a∨| 国产在线精品视频| 在线看成人av| 在线播放精品一区二区三区| 久久爱www.| 九九九九免费视频| 中文字幕制服丝袜成人av| 性一交一乱一伧老太| 欧美孕妇孕交黑巨大网站| 久久综合成人| 99热超碰在线| 欧美日韩小视频| av资源在线看片| 五月天久久综合网| 成人教育av在线| 91丨porny丨在线中文 | 国产精品对白久久久久粗| xvideos亚洲人网站| 欧美家庭影院| 日韩在线电影一区| 国产高清在线观看免费不卡| 在线观看日本视频| 欧美成人一二三| 国产亚洲电影| 少妇精品无码一区二区三区| 欧美久久高跟鞋激| a一区二区三区|