Vue虚拟DOM

244 阅读2分钟

无论是Vue还是react都有一个核心的结构那就是虚拟DOM。为什么要在框架中加入虚拟DOM?通过对VNode的分析提高我们对前端框架设计的理解。

虚拟DOM

虚拟DOM的本质其实就是一个普通的JS对象

虚拟DOM最终是通过render函数生成。 在Vue脚手架中我们通常是利用tempelate模板进行AST(抽象语法树分析)来生成虚拟DOM,本质还是还是通过render函数生成。tempelate模板作用只是方便我们书写代码,在脚手架工具编译后只是一个字符串。

每个组件都对应一颗虚拟DOM树,最终生成真实DOM节点。

VNode的基本属性

属性含义类型
tag元素标签string
data标签属性object
children子元素array
text文本string
key标志string
<div id="demo">
    <p class="txt">Hello World</p>
</div>
{
    tag: 'div'
    data: {
        id: 'demo'
    },
    children: [
        {
            tag: 'p',
            data: {
                class: 'txt'
            }
            text: 'Hello World'
        }
    ]
}

虚拟DOM优势

创建效率快

console.time();
for (let i = 0; i < 100000; i++) {
    const obj =  new Object();
}
console.timeEnd();
console.time('doc');
for (let i = 0; i < 100000; i++) {
    const obj =  document.createElement('div')
}
console.timeEnd('doc');

image.png

通过对比我们可以看出,创建真实DOM节点是十分耗费性能的。

提高组件更新效率

虚拟DOM的用途就是为了在组件更新时提高渲染效率。 如果我们只是单纯的写一些静态页面,页面不会发生重新渲染,vue的效率其实是更差的。
虚拟DOM的作用就好比我们去饭店吃饭,先在手机上预约好我要吃什么,然后到饭店之后就可以直接享用,就可以省去排队的时间啦。
Vue组件的每次更新,并不会直接改变真实的DOM节点。会重新执行render函数,创建出一个新的虚拟DOM,将新旧两个虚拟DOM对比找出不同的节点,只更新变化的真实DOM节点。这个过程是通过Vue的patch算法实现。

跨平台

由于 Virtual DOM 是以 JavaScript 对象为基础而不依赖真实平台环境,所以使它具有了跨平台的能力。