剛過年,最近忙著找一份實習(xí)的工作。電話面試了幾家大公司,他們都提到了Virtual DOM 的 diff 算法,一下子讓我慌得不行,網(wǎng)上找來找去,學(xué)來學(xué)去還是有很多地方不是很明白。希望大佬們指點小妹一番。
深度剖析:如何實現(xiàn)一個 Virtual DOM 算法
這里構(gòu)建一個真正的DOM樹,插到文檔當(dāng)中?這句話的意思應(yīng)該是全部更新,而react和vue都是按需更新,那么react 和 vue是如何根據(jù)最新的狀態(tài)更新dom的?
jsf
或者 js
描述一個頁面結(jié)構(gòu),這個結(jié)構(gòu)會被用來構(gòu)造真正的 DOM
樹,然后掛載到 container
<div id="app"/>
) 上。DOM
和 真實 DOM
的橋梁,所謂的雙向綁定就是靠這個中間人。頁面載入時的初始狀態(tài)樹就是由所有構(gòu)造函數(shù) (React.Component
之類的東西,里邊的 this.state = {...}
,就是在描述初始狀態(tài)樹)匯總而來。UI
事件、網(wǎng)絡(luò)事件導(dǎo)致新的狀態(tài)產(chǎn)生,就會導(dǎo)致狀態(tài)樹進(jìn)行迭代。方式就是根據(jù)新的狀態(tài)構(gòu)造一棵新的狀態(tài)樹,并與舊的進(jìn)行比對,掃描出涉及到的虛擬 DOM
(因為你通過構(gòu)造函數(shù)里、props
等等方式告訴系統(tǒng)哪些狀態(tài)與哪些節(jié)點相關(guān)),這一步有的叫 臟標(biāo)記,就是 節(jié)點臟了,要更新了 的意思。DOM
對應(yīng)的節(jié)點(一開始通過 jsf
或繼承 Component
等方式登記了這個信息)進(jìn)行更新,有的是改變樣式、有的是增刪、有的是重用節(jié)點修改內(nèi)容、有的是修改節(jié)點值(value
等等)。然后 2 3 步循環(huán)。
太久沒看 react
和 vue
了,不知道現(xiàn)在有沒有更新思路,記憶里是這樣的。
簡單講一下我的理解:
先拋開框架本身,理解上述的幾個步驟。
1.用javascript對象結(jié)構(gòu)表示DOM樹的結(jié)構(gòu),然后用樹構(gòu)建一個真正的樹
2.當(dāng)狀態(tài)變更的時候,重新造一顆樹,然后用新舊樹對比
3.把2所記錄的差異應(yīng)用到步驟1所構(gòu)建的DOM樹上,視圖更新。
首先,簡單描述就是。所有節(jié)點,都是通過js來創(chuàng)建,這樣我們才有辦法用js來保存一個虛擬dom樹。
現(xiàn)在有了虛擬dom樹了,我們需要面對兩個問題。
第一點,通過虛擬dom,以一定的算法來生成一個真實的dom樹,然后以某種方式插入到界面中??赡苁沁@樣xxx.innerHtml = xxx...
第二點,也就是更新dom,但是頁面上的節(jié)點數(shù)非常的多,所以我們希望以最快的速度來更新dom。
那么毫無疑問,目前內(nèi)存中應(yīng)該是最為方便的,也最快的。
于是就出來了各式各樣的diff算法。
首先想想,你能實現(xiàn)的最簡單的方式。
遍歷最新的節(jié)點與之前生成樹進(jìn)行比較,比如你隨意修改了一個節(jié)點,找到兩顆樹之間修改的復(fù)雜度是o(n3).
這時候React出來了(我就了解react),我們要降低算法復(fù)雜度,我對我需要比較的節(jié)點來進(jìn)行限制。就是我認(rèn)為我們是同級的我才比較。
React 通過同級比較,將算法復(fù)雜度降低到o(n),
盜了張圖
Matt-Esch 一個diff算法
snabbdo 另外一個
diff算法,怎么寫都是算法,重點的是不同的diff他們的思路如何實現(xiàn)的。
如何降低算法復(fù)雜度,也就是制定規(guī)則,或者預(yù)處理。
比如react就是通過只比較同層級直接的變化,那么我就可以從一棵樹的層級,直接定位到另一顆樹的對應(yīng)層級上,而不需要去遍歷整顆樹,也就是算法優(yōu)化問題。
菜鳥愚見。。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。