不再解釋什么是virtual dom了,爛大街了。
這里問題核心是vue本身具有數(shù)據(jù)綁定或者說數(shù)據(jù)劫持媳友,我們的數(shù)據(jù)是對應(yīng)著某個(gè)dom的某個(gè)屬性的。通過數(shù)據(jù)綁定产捞,我們的數(shù)據(jù)可以“靶向”定位出具體哪個(gè)dom的哪個(gè)屬性醇锚,然后直接dom操作進(jìn)行修改,何必搞什么virtual dom和diff坯临,直接更新過去不就行了焊唬?
至于最小化操作,我們完全可以保留一份老數(shù)據(jù)看靠,然后異步統(tǒng)一對比新老數(shù)據(jù)赶促,有不同的就更新,也不需要diff爸运瘛芳杏?
知乎 Vue采用虛擬DOM的目的是什么?
vue是從2.0引入virtual dom的矩屁,那么首先看:
Announcing Vue.js 2.0
Vue 2.0 發(fā)布了!
Vue 的理念問題
從性能方面:
現(xiàn)在的渲染層基于一個(gè)輕量級的 virtual-DOM 實(shí)現(xiàn)爵赵,在大多數(shù)場景下初試化渲染速度和內(nèi)存消耗都提升了 2~4 倍 (詳見這里的 benchmarks)吝秕。從模板到 virtual-DOM 的編譯器和運(yùn)行時(shí)是可以獨(dú)立開來的,所以你可以將模板預(yù)編譯并只通過 Vue 的運(yùn)行時(shí)讓你的應(yīng)用工作起來空幻,而這份運(yùn)行時(shí)的代碼 min+gzip 之后只有不到 12kb (提一下烁峭,React 15 在 min+gzip 之后的大小是 44kb)。編譯器同樣可以在瀏覽器中工作秕铛,也就是說你也可以寫一段 script 標(biāo)簽然后開始你的工作约郁,就像以前一樣。而即便你把編譯器加進(jìn)去但两,build 出來的文件 min+gzip 之后也僅有 17kb鬓梅,仍然小于目前的 1.0 版本。
2.0 用一個(gè) fork 自 snabbdom 的輕量 Virtual DOM 實(shí)現(xiàn)對渲染層進(jìn)行了重寫谨湘。在其上層绽快,Vue 的模板編譯器能夠在編譯時(shí)做一些智能的優(yōu)化處理,例如分析并提煉出靜態(tài)子樹以避免界面重繪時(shí)不必要的比對紧阔。新的渲染層較之 v1 帶來了巨大的性能提升坊罢,也讓 Vue 2.0 成為了最快速的框架之一。除此之外擅耽,它把你在優(yōu)化方面需要做的努力降到了最低活孩,因?yàn)?Vue 的響應(yīng)系統(tǒng)能夠在巨大而且復(fù)雜的組件樹中精準(zhǔn)的判斷其中需要被重繪的那部分。
總的來說:體積不變多少乖仇,初始化渲染性能提升憾儒,內(nèi)存占用減少。
1.體積不變暫且不說这敬,初始化渲染提升航夺、內(nèi)存占用減少是為什么?
單文件vue的加入崔涂,編譯時(shí)便可依靠vdom把模板文件進(jìn)行一定預(yù)編譯阳掐,無需如模板字符串template:"<div>...</div>"
等從零編譯,資源占用應(yīng)當(dāng)變少(好像不需要vdom也能這樣優(yōu)化冷蚂,會復(fù)雜了點(diǎn)...缭保?)。
2.關(guān)于vdom多了diff的問題蝙茶,vue并沒有拋棄自己響應(yīng)式的根艺骂。憑借原有基礎(chǔ)vue的vdom實(shí)現(xiàn)具有自我特色,無需像react那樣搞什么shouldcomponentupdate來優(yōu)化隆夯,vue自己就能較為精準(zhǔn)避免不需要的diff钳恕,速度仍然很快(不用vdom根本不用diff...别伏?)
3.又如列表方面,采用vdom可以提高復(fù)用真實(shí)dom忧额。如解析vue2.0的diff算法厘肮,這里如果不采用vdom,單憑數(shù)據(jù)綁定作出的選擇就是直接新建睦番、刪除已有節(jié)點(diǎn)
功能方面
最直接的就是多了render函數(shù)类茂、支持了jsx、可以實(shí)現(xiàn)服務(wù)器渲染托嚣。除此之外還有更多的可擴(kuò)展性和更高一層的抽象能力巩检,而且很大可能是出于這部分考慮而非性能(反正事實(shí)證明比原來快,也沒毛病)示启,引用作者尤雨溪部分原話:
Vue 2.0 引入 vdom 的主要原因是 vdom 把渲染過程抽象化了兢哭,從而使得組件的抽象能力也得到提升,并且可以適配 DOM 以外的渲染目標(biāo)丑搔。這一點(diǎn)是借鑒 React 毫無爭議厦瓢,因?yàn)槲艺J(rèn)為 vdom 確實(shí)是個(gè)好思想。