增量 DOM 充分利用了這一點,因為它使用了基于指令的方法。如前所述,增量 DOM 在編譯之前將每個組件編譯成一組指令,這有助于識別未使用的指令。因此,它們可以在編譯時進行刪除操作。
虛擬 DOM 不能夠 Tree Shaking,因為它使用解釋器,并且沒有辦法在編譯時識別未使用的代碼。
2. 減少內(nèi)存使用
如果你明白虛擬 DOM 和增量 DOM 的主要區(qū)別,你就應(yīng)該已經(jīng)知道這背后的秘密了。
與虛擬 DOM 不同,增量 DOM 在重新呈現(xiàn)應(yīng)用程序 UI 時不會生成真實 DOM 的副本。此外,如果應(yīng)用程序 UI 沒有變化,增量 DOM 就不會分配任何內(nèi)存。大多數(shù)情況下,我們都是在沒有任何重大修改的情況下重新呈現(xiàn)應(yīng)用程序 UI。因此,按照這種方法可以極大地節(jié)省設(shè)備的內(nèi)存使用。
增量 DOM 似乎有一個減少虛擬 DOM 內(nèi)存占用的解決方案。但是你可能想知道為什么其他框架不使用它?
這里存在一個權(quán)衡
雖然增量 DOM 通過按照更有效的方法來計算差異,從而減少了內(nèi)存使用,但是該方法比虛擬 DOM 更耗時。
因此,在選擇使用增量 DOM 和虛擬 DOM 時,會對運行速度和內(nèi)存使用之間進行權(quán)衡。
最終思考
在這兩種文檔對象模型(DOM)中,虛擬 DOM 長期以來一直處于領(lǐng)先地位??梢哉f“虛擬 DOM 之所以流行是因為 React 流行”,另一方面 React 主要得益于這個虛擬 DOM 的特性。
因此,很明顯虛擬 DOM 提供的速度和性能提升有助于 React 與其它框架競爭。
虛擬 DOM 的優(yōu)缺點
讓我們看一下虛擬 DOM 的一些主要優(yōu)點:
高效的 diff 算法。
簡單且有助于提升性能。
沒有 React 也能使用。
輕量。
允許構(gòu)建應(yīng)用程序且不考慮狀態(tài)轉(zhuǎn)換。
雖然虛擬 DOM 快速高效,但有一個缺點:
這個區(qū)分過程(diffing process)確實減少了真實 DOM 的工作量。但它需要將當前的虛擬 DOM 狀態(tài)與之前的狀態(tài)進行比較,以識別變化。為了更好地理解這一點,讓我們舉一個小的 React 代碼示例:
function WelcomeMessage(props) {
return(
"welcome">
Welcome{props.name}
);
}
假設(shè) props.name 的初始值是 Chameera ,后來改成了 Reader。整個代碼中唯一的變化就是 props,不需要改變 DOM 節(jié)點或者比較
標簽內(nèi)部的屬性。然而,使用 diff 算法,有必要檢查所有步驟來識別變化。
我們在開發(fā)過程中可以看到大量這樣的微小變化,比較用戶 UI 中的每個元素無疑是一種開銷。這可以被認為是虛擬 DOM 的主要缺點之一。
然而,增量 DOM 為這個大量內(nèi)存使用問題提供了一個解決方案。
增量 DOM 的優(yōu)缺點
正如我前面提到的,增量 DOM 通過使用真實 DOM 跟蹤變化,提供了一個減少虛擬 DOM 內(nèi)存消耗的解決方案。這種方法大大降低了計算開銷,也優(yōu)化了應(yīng)用程序的內(nèi)存使用。
所以,這是使用增量 DOM 相對于虛擬 DOM 的主要優(yōu)勢,我們可以列出增量 DOM 的其他優(yōu)點:
易于與許多其他框架結(jié)合使用。
簡單的 API 使其成為強大的目標模板引擎。
適合基于移動設(shè)備的應(yīng)用程序。
在大多數(shù)情況下,增量 DOM 不如虛擬 DOM 運行快。
雖然增量 DOM 帶來了減少內(nèi)存使用的解決方案,但是該解決方案影響了增量 DOM 的速度,因為增量 DOM 的差異計算比虛擬 DOM 方法耗費更多時間。因此,我們可以認為這是使用增量 DOM 的主要缺點。
這兩種 DOM 各有特色,我們不能只說虛擬 DOM 更好,或者增量 DOM 更好。然而,我可以肯定地說,虛擬 DOM 和增量 DOM 都是很好的選項,它們可以毫無問題地處理動態(tài) DOM 更新。