Virtual DOM(虛擬DOM)

引言


你可能聽說在Vue.js 2.0已經(jīng)發(fā)布,并且在其中新添加如了一些新功能。其中一個功能就是“Virtual DOM”。

Virtual DOM是什么


在之前,React和Ember早就開始用虛擬DOM技術(shù)來提高頁面更新的速度了。 若想了解它是如何工作的,就要先認(rèn)清這幾個概念:

1.更新DOM是非常昂貴的操作


當(dāng)我們使用Javascript來修改我們的頁面,瀏覽器已經(jīng)做了一些工作,以找到DOM節(jié)點(diǎn)進(jìn)行更改,例如:

document.getElementById('myId').appendChild(myNewNode);

在現(xiàn)代的應(yīng)用中,會有成千上萬數(shù)量個DOM節(jié)點(diǎn)。所以因更新的時候產(chǎn)生的計算非常昂貴?,嵥榍翌l繁的更新會使頁面緩慢,同時這也是不可避免的。

2.我們可以用JavaScript對象來代替DOM節(jié)點(diǎn)


DOM節(jié)點(diǎn)在HTML文檔中的表現(xiàn)通常是這樣的:

?<ul id="myId">

? ?<li>item1</li>

? ? <li>item2</li>

</ul>

DOM節(jié)點(diǎn)也可以表示為一個JavaScript對象,就像這樣:

//用Javascript代碼表示DOM節(jié)點(diǎn)的偽代碼

Let domNode = {

????????????????tag: 'ul',

????????????????attributes: { id: 'myId' },

????????????????children: [ //這里是 li ]

};

這就是虛擬的DOM節(jié)點(diǎn),很好理解吧。

3.更新虛擬節(jié)點(diǎn), 并不昂貴貴

//更新虛擬DOM的代碼

domNode.children.push('

    Item 3
');

如果我們用一個虛擬DOM,而不是直接調(diào)用像.getElementById的方法,這樣只操作JavaScript對象,這樣是相當(dāng)便宜的。

然后,再把更改的部分更新到真正的DOM,方法如下:

//這個方法是調(diào)用DOM API來更改真正DOM的

//它會分批執(zhí)行從而獲取更高的效率

sync(originalDomNode, domNode);

Vue.js在2.0 版本中引入虛擬DOM是一個正確的選擇嗎 ?

引入虛擬DOM實(shí)際上有優(yōu)點(diǎn)也缺點(diǎn)。

1、尺寸

更多的功能意味著更多的代碼。幸運(yùn)的是Vue.js 2.0仍然是相當(dāng)小的(21.4kb當(dāng)前版本)。

2、內(nèi)存

虛擬DOM需要在內(nèi)存中的維護(hù)一份DOM的副本。在DOM更新速度和使用內(nèi)存空間之間取得平衡。

3、不是適合所有情況

如果虛擬DOM大量更改,這是合適的。但是單一的,頻繁的更新的話,虛擬DOM將會花費(fèi)更多的時間處理計算的工作。

所以,如果你有一個DOM節(jié)點(diǎn)相對較少頁面,用虛擬DOM,它實(shí)際上有可能會更慢。

但對于大多數(shù)單頁面應(yīng)用,這應(yīng)該都會更快。

除了性能提升外還有什么

引入虛擬DOM,這不僅僅是一種性能增強(qiáng),這同時意味著更多的功能。

例如,您可以在虛擬DOM中的 render() 方法直接創(chuàng)建新的節(jié)點(diǎn):

new Vue({

????????????el: '#app',

????????????data: {

????????????????message: 'hello world'

????????????},

????????????render() {

????????????????var node = this.$createElement;

????????????????return node( 'div', { attrs: { id: 'myId' } }, this.message );

????????????}

});

輸出:

<div id="app">

? ? ? ? <div id="myId">hello world</div>

</div>

為什么這樣做?你可以用全編程語言JavaScript編程,您可以創(chuàng)建工廠式的功能來建立虛擬節(jié)點(diǎn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 參考文章:深度剖析:如何實(shí)現(xiàn)一個Virtual DOM 算法 作者:戴嘉華React中一個沒人能解釋清楚的問題——...
    waka閱讀 6,147評論 0 21
  • 之前通過深入學(xué)習(xí)DOM的相關(guān)知識,看了慕課網(wǎng)DOM探索之基礎(chǔ)詳解篇這個視頻(在最近看第三遍的時候,準(zhǔn)備記錄一點(diǎn)東西...
    微醺歲月閱讀 4,761評論 2 61
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,177評論 0 29
  • 前七章探索了思考發(fā)生的內(nèi)容。你現(xiàn)在知道了一些受歡迎的概念,個體不是自發(fā)產(chǎn)生的,必須一次一次的贏得;批判性思考應(yīng)該像...
    張?zhí)硌?/span>閱讀 319評論 0 1
  • 和蕭沐分別后的那天晚上,我像往常一樣平靜安然的入睡,大概是那些惱人的數(shù)學(xué)題,讓我已經(jīng)感到無比的遲鈍和乏力,所以我睡...
    若荷_閱讀 411評論 0 0

友情鏈接更多精彩內(nèi)容