摘要
文章从 DOM 概念入手,阐述虚拟 DOM 的概念、产生原因、对 React 数据驱动视图的支持、优势,包括提供高效声明式编程载体、跨平台能力等,还纠正了对其性能的误解。
一、DOM 概念解读
DOM 即文档对象模型,是 HTML 和 XML 文档的编程接口。从渲染引擎角度,HTML 字节流经 HTML 解析器转化为 DOM,它是生成页面的基础数据结构;从 JavaScript 脚本视角,DOM 提供操作接口。DOM 不属于 JavaScript 语言,是浏览器提供的运行平台,在浏览器中 DOM 元素节点与 webkit 渲染引擎和 JS 引擎通过 V8 Binding 相关联,操作 DOM 对象实际是操作包装对象。
// 例如通过 JavaScript 操作 DOM 对象
const element = document.createElement('div');
document.body.appendChild(element);
二、虚拟 DOM 概念
Virtual DOM 简称 VDOM,是一种描述 DOM 应呈现样子的数据结构。微观上是内存中的 JS 对象包含原生 DOM 结构信息,宏观上是一种编程概念,用 JS 对象描述真实 DOM 节点,通过改变 JS 对象同步更改 DOM 节点。
// 简单示例(非真实 React 代码)
const virtualDOM = {
tag: 'div',
props: {
className: 'example'
},
children: []
};
三、虚拟 DOM 出现的原因
基于 React 分析,虽真实 DOM 操作耗性能,但虚拟 DOM 出现并非为解决此问题。传统原生开发手动管理 DOM 效率低,jQuery 虽简化 DOM 操作但未根本解决压力。随着前端工程化发展,React 等框架实现自动管理 DOM,数据驱动视图,虚拟 DOM 为 React 此思想提供载体,改变开发模式,主要矛盾在于研发体验和效率而非性能。
四、虚拟 DOM 对 React 数据驱动视图的支持
React 内置 Diff 算法,数据变化时重新构建虚拟 DOM 树,与上次的树对比,计算出改变部分,将变化部分进行实际 DOM 操作,步骤为生成树、对比差异、更新视图。
// 伪代码示例
function updateView(data) {
const newVirtualDOM = buildVirtualDOM(data);
const diff = compareVirtualDOM(newVirtualDOM, oldVirtualDOM);
updateRealDOM(diff);
oldVirtualDOM = newVirtualDOM;
}
五、虚拟 DOM 的优势
为数据驱动视图提供高效声明式编程载体,代码更简洁易维护;具有跨平台能力,以 JavaScript 对象为基础不依赖平台,同一套虚拟 DOM 可对接不同平台渲染逻辑实现多端运行。
六、关于虚拟 DOM 性能的误解
很多人误以为虚拟 DOM 为解决性能问题,源于早期观点传播,但比对性能需限定条件。虚拟 DOM 操作不一定比原生 DOM 操作快,其类似浏览器对 DOM 操作的批量处理优化,采用双缓存技术和 Diff 算法,操作优化中和了 Diff 算法代价以保持性能。