Vue.js 2.0引入Virtual DOM,比Vue.js 1.0的初始渲染速度提升了2-4倍,並大大降低了內存消耗;
vue中模板轉換成視圖的大致過程是:vue.js 通過編譯將 template 模板轉換成渲染函數(render),執行渲染函數就可以得到一個虛擬的節點;然后在對 model 進行操作的時候,會觸發 Dep 中的 Watcher 對象; watcher 對象會調用相應的 update 來修改視圖,這個過程主要是將新舊虛擬節點進行差異對比,然后根據對比進行 DOM 操作來更新視圖;在這個過程中主要涉及了幾個概念:渲染函數、VNOde虛擬節點、patch(patching算法);
渲染函數:主要是用來生成 virtual DOM 的;vue 雖然推薦使用 template 來構建頁面,但是其實也是支持直接寫渲染函數的;
VNode虛擬節點:它是節點描述,可以代表一個真實的dom,最終真實的dom就是通過createElement將VNode渲染成真實的dom的;
patch(也叫patching算法):它是虛擬dom最核心的部分,VNode最終就是經過這個算法成為真實的dom的,這個過程是對比新舊節點之間的不同,然后根據對比結果找出需要更新的節點進行更新;
Virtual DOM 簡單的說就是一顆樹,一顆以javaScript對象(VNode)作為基礎的樹,用對象的屬性來描述節點,因此這個對象至少包含標簽名(tag)、屬性(attrs)、和 子元素對象(chuildren)
Virtual DOM 的最終目的是將虛擬的節點渲染到視圖上,其實它主要做了兩件事:(1)、提供與真實DOM節點對應的虛擬節點VNode;(2)、將虛擬節點VNode和舊虛擬節點(oldVNode)進行對比,然后更新視圖;
Virtual DOM 的優勢:
(1)、具備跨平台的優勢;
(2)、操作DOM慢,js運行的效率高;vue 將DOM對比放在js層,提高效率,Virtual DOM 本質上其實就是js 和 dom 之間的一個緩存,通過 patching 算法計算出真正需要更新的節點,最大限度的減少DOM操作;
(3)、提升渲染的性能;dom操作的減少,可以避免更多的回流和重繪等,更加高效的提高性能