Vue.js 是一個JavaScript框架,最早由中國大陸的尤雨溪開發。該框架可以用來開發單頁Web應用和跨應用組件。Vue.js使用了MVVM模式,是一款高效、靈活、易于上手的框架。Vue.js之所以能夠快速、高效地渲染數據,就要靠它的Virtual DOM。
Vue.js 中的Virtual DOM 可以理解成是一個虛擬的DOM,它相當于在操作JavaScript對象,這使得Vue.js可以高效地操作大型數據,且不必頻繁的改動真實的DOM。在Vue.js中,Virtual DOM 會被用來進行Diff算法,比較現有虛擬DOM 和新的虛擬DOM,只更新發生變更的地方。
function patch(oldVnode, vnode) { const isRealElement = oldVnode.nodeType !== undefined if (!isRealElement && sameVnode(oldVnode, vnode)) { patchVnode(oldVnode, vnode) } else { const oldElm = oldVnode.elm const parentElm = api.parentNode(oldElm) createElm(vnode, insertedVnodeQueue) parentElm.insertBefore(vnode.elm, oldElm.nextSibling) if (isDef(oldVnode.parent)) { removeVnodes(oldVnode.parent, [oldVnode], 0, 0) } else if (isDef(oldVnode.tag)) { api.removeChild(parentElm, oldVnode.elm) } } }
當我們調用Vue.js 的update( ) 方法,會傳遞舊虛擬DOM和新虛擬DOM兩個參數,Vue.js會比較新舊兩個參數,并執行Diff算法,Diff算法指的是比較兩個虛擬DOM樹的算法。Vue.js的Diff算法也是很高效的一種算法,采用了時間復雜度O(n) 的操作,也就是說,會遍歷整個虛擬DOM樹,而不是只遍歷有差異的部分,這樣可以減少DOM操作,節約時間。
在Vue.js 中,Diff算法不需要考慮整個DOM樹需要做出的哪些更改,而是需要關注哪些組件需要被重新渲染。如果組件的數據沒有發生更改,Vue.js 只需要比較兩個組件的虛擬DOM 是否一致即可,避免沒有必要的虛擬DOM 操作。
在Vue.js 2.0版本中,采用了雙向比較的策略。從parentNode開始比較,先判斷節點是否相等,如果不相等,在比較子節點,如果子節點數量不同,則直接將舊節點全部刪除,創建新節點,如果子節點數量相同,則進行一一比較。如果是文本節點,則比較是否相同。如果是組件節點,則比較組件的虛擬DOM 是否相同。
總的來說,Vue.js的Diff算法對于大型的單頁應用有很好的優化效果。Diff算法采用了快速的雙向比較,減少了虛擬DOM的操作次數,提高了操作的效率。