虚拟DOM

虚拟DOM的由来和作用

介绍虚拟DOM前,先来看一下DOM是什么和虚拟DOM产生的原因

DOM是浏览器提供操作HTML元素的一套API,W3C负责DOM标准的制定,浏览器厂商按照W3C标准去实现这套API;DOM操作是一个比较耗费系统资源的,在Jquery时代,前端都是使用Jquery在原生DOM API下封装好的API来进行前端页面交互逻辑的编写。

随着时代发展,web应用越来越复杂的情况下,使用Jqeury操作DOM的问题就显现出来了,DOM操作是很耗费系统资源的,频繁操作DOM经常会出现一些页面卡顿相关的问题,那么我们就需要对DOM操作进行优化了,那么怎么优化呢?那么虚拟DOM就是为了解决这个问题而产生的。

最早React.js中使用到了虚拟DOM技术

虚拟DOM核心原理

虚拟DOM是使用一个js对象来映射HTML,示例如下

let vNodes = {
    tagName: "div", // 标签名
    // 存放标签属性
    attributes: {
        "className": "parent",
        ...
    },
    // 子节点
    children: [
        {
            tag: "div",
            attributes: {
                "className": "child1",
                ...
            },
            chiidren: [
                ...
            ]                        
        },
        ...
    ]
}

上面js对象映射出来这样的HTML结构

<!-- 三个点表示省略的元素或者属性 -->
<div class="parent" ...>
    <div class="child1">
        ...
    </div>
    ...
</div>

有了js数据结构的映射之后呢,就需要根据数据结构去生成真实的HTML,这里有个函数render,需要提供js映射的数据

function render (vNodes) {
    // 具体实现就是调用原生的DOM API去生成真实的HTML
}

当页面有一系列变化的时候,会将变化映射到js对象上面,有了变化前的数据和变化后的数据,会使用一套diff算法,找到页面变化的一个最优的DOM操作,核心就是这个diff算法的实现,算法会得到一个最优的DOM操作来优化

综上,虚拟DOM解决的问题是复杂页面DOM操作优化的问题,核心是diff算法的实现