省流:
首先,React Fiber并沒(méi)有解決更新龐大組件樹(shù)耗時(shí)長(zhǎng)的問(wèn)題饱普,實(shí)際上總的耗時(shí)還是一樣的長(zhǎng)孝常。但是它解決了一個(gè)被廣大開(kāi)發(fā)者口誅筆伐的惡行:長(zhǎng)時(shí)間霸占主線程不放。
它的工作原理是這樣的:把耗時(shí)長(zhǎng)的更新任務(wù)拆解成一個(gè)個(gè)小的任務(wù)分片廷痘,每執(zhí)行完一個(gè)小的任務(wù)分片蔓涧,都?xì)w還一次主線程,看看有沒(méi)有什么其他緊急任務(wù)要做笋额。如果在歸還主線程時(shí)恰巧發(fā)現(xiàn)有緊急任務(wù)元暴,那么會(huì)馬上停掉當(dāng)前更新任務(wù),轉(zhuǎn)而讓主線程去做緊急任務(wù)兄猩,等主線程做完緊急任務(wù)茉盏,再重新做更新任務(wù)。(注意:是重新枢冤!不是從上次被打斷的點(diǎn)繼續(xù))鸠姨;如果沒(méi)有緊急任務(wù),才敢繼續(xù)做接下來(lái)的任務(wù)分片淹真。
React Fiber實(shí)現(xiàn)的難點(diǎn)有兩個(gè):暫停/重啟如何實(shí)現(xiàn)讶迁?任務(wù)如何分散執(zhí)行?
對(duì)于前者核蘸,暫停/重啟意味著我們需要保存狀態(tài)巍糯,這里在實(shí)現(xiàn)上用到了具有鏈表和指針的“單鏈表樹(shù)遍歷算法”,能夠記錄遍歷過(guò)程中的上一步和下一步值纱。
而對(duì)于后者鳞贷,則用到了requestAnimationFrame和requestIdelCallback這兩個(gè)API,其中requestAnimationFrame是瀏覽器在每一幀都一定會(huì)執(zhí)行的虐唠,可以放一些高優(yōu)先級(jí)的任務(wù)搀愧;而requestIdelCallback則是瀏覽器在一幀中最后如果有空閑時(shí)間才會(huì)去執(zhí)行,可以放一些低優(yōu)先級(jí)的任務(wù),需要polyfill(因?yàn)榧嫒菪圆患眩?br> 部分引用:https://www.jb51.net/article/210296.htm