現有框架幾乎都引入了虛擬 DOM 來對真實 DOM 進行抽象,也就是現在大家所熟知的 VNode 和 VDOM,那麼為 什麼需要引⼊虛擬 DOM 呢?本文圍繞這個疑問來解答即可!(學習視訊分享:)
虛擬dom顧名思義就是虛擬的dom物件,它本身就是⼀個 JavaScript 物件,只不過它是通過不同的屬性去 描述⼀個檢視結構。
1. 將真實元素節點抽象成 VNode,有效減少直接操作 dom 次數,從而提高程式效能
2. 方便實現跨平臺
SSR(Nuxt.js/Next.js)
、原生應用(Weex/React Native
)、小程式(mpvue/uni-app
)等 、渲染到 WebGL 中等等。補充:vue 為什麼採用 vdom?
引入 Virtual DOM
在效能方面的考量僅僅是一方面。
效能受場景的影響是非常大的,不同的場景可能造成不同實現方案之間成倍的效能差距,所以依賴細粒度繫結及 Virtual DOM
哪個的效能更好還真不是一個容易下定論的問題。
Vue
之所以引入了 Virtual DOM
,更重要的原因是為了解耦 HTML
依賴,這帶來兩個非常重要的好處是:
HTML
解析器進行模版解析,可以進行更多的 AOT
工作提高執行時效率:通過模版 AOT
編譯,Vue
的執行時體積可以進一步壓縮,執行時效率可以進一步提升;DOM
以外的平臺,實現 SSR
、同構渲染這些高階特性,Weex
等框架應用的就是這一特性。綜上,
Virtual DOM
在效能上的收益並不是最主要的,更重要的是它使得Vue
具備了現代框架應有的高階特性。
在vue中我們常常會為元件編寫模板 - template, 這個模板會被編譯器 - compiler編譯為渲 染函數,在接下來的掛載(mount)過程中會呼叫render函數,返回的物件就是虛擬dom。但它們還不是真正的dom,所以會在後續的patch過程中進⼀步轉化為dom。
掛載過程結束後,vue程式進入更新流程。如果某些響應式資料發生變化,將會引起元件重新render,此時就會生成新的vdom,和上一次的渲染結果diff就能得到變化的地方,從而轉換為最小量的dom操作,高效更新檢視。
vnode定義:https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/vnode.ts#L127-L128
[建立vnode]:
createElementBlock:https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/vnode.ts#L291-L292
createVnode:https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/vnode.ts#L486-L487
首次呼叫時刻:https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/apiCreateApp.ts#L283-L284
mount:https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/renderer.ts#L1171-L1172
(學習視訊分享:)
以上就是聊聊什麼是虛擬dom?vue為什麼採用vdom?的詳細內容,更多請關注TW511.COM其它相關文章!