什么是虛擬dom
用js模擬一顆dom樹,放在瀏覽器內存中.當你要變更時,虛擬dom使用diff算法進行新舊虛擬dom的比較,將變更放到變更隊列中,
反應到實際的dom樹,減少了dom操作.
虛擬DOM將DOM樹轉換成一個JS對象樹,diff算法逐層比較,刪除,添加操作,但是,如果有多個相同的元素,可能會浪費性能,所以,react和vue-for引入key值進行區分.
優點:
- 保證性能下限: 框架的虛擬 DOM 需要適配任何上層 API 可能產生的操作,它的一些 DOM 操作的實現必須是普適的,所以它的性能並不是最優的;但是比起粗暴的 DOM 操作性能要好很多,因此框架的虛擬 DOM 至少可以保證在你不需要手動優化的情況下,依然可以提供還不錯的性能,即保證性能的下限;
- 無需手動操作 DOM: 我們不再需要手動去操作 DOM,只需要寫好 View-Model 的代碼邏輯,框架會根據虛擬 DOM 和 數據雙向綁定,幫我們以可預期的方式更新視圖,極大提高我們的開發效率;
- 跨平台: 虛擬 DOM 本質上是 JavaScript 對象,而 DOM 與平台強相關,相比之下虛擬 DOM 可以進行更方便地跨平台操作,例如服務器渲染、weex 開發等等。
缺點:
- 無法進行極致優化: 雖然虛擬 DOM + 合理的優化,足以應對絕大部分應用的性能需求,但在一些性能要求極高的應用中虛擬 DOM 無法進行針對性的極致優化。
首次渲染大量DOM時,由於多了一層虛擬DOM的計算,會比innerHTML插入慢。