说说真实DOM和虚拟DOM的区别?它们的优缺点是什么?:深入理解前端渲染机制与性能优化之道
一、真实DOM与虚拟DOM的本质概念
1.1 真实DOM的定义与结构
真实DOM是浏览器原生提供的文档对象模型,它是HTML 或XML文档在内存中的对象表示。当浏览器解析HTML时,会构建出一棵由节点组成的树形结构,每个节点都是DOM对象,包含标签名、属性、子节点、文本内容等信息。
真实DOM的核心特点如下:
它是浏览器原生API,由C++实现,运行在浏览器底层
每个DOM节点都是一个重量级对象,包含大量属性和方法
DOM操作会触发浏览器的重排与重绘,性能开销较大
它是页面可视元素的直接映射,操作DOM会立即影响页面呈现
一个真实DOM节点的简化创建过程如下:
const div = document.createElement('div');
div.id = 'app';
div.className = 'container';
div.textContent = 'Hello World';
上述代码创建的div对象在浏览器中包含上百个属性和方法,如childNodes、parentNode、style、addEventListener等,这些都是浏览器为每个DOM节点提供的标准接口。
1.2 虚拟DOM的定义与结构
虚拟DOM是用普通JavaScript对象来描述真实DOM的一种轻量级数据结构。它本质上是一棵普通的JavaScript对象树,通过属性来描述DOM节点的标签、类型、属性和子节点,而不是真正的浏览器DOM节点。
虚拟DOM的核心特点如下:
它是普通的JavaScript对象,创建和操作成本极低
不依赖浏览器环境,可以运行在Node.js等服务端
通过Diff算法比对前后两棵虚拟DOM树的差异
最终将差异批量应用到真实DOM,减少直接操作DOM的次数
一个虚拟DOM节点的简化结构如下:
{
tag: 'div',
props: {
id: 'app',
className: 'container'
},
children: [
{
tag: 'span',
props: {},
children: ['Hello World']
}
]
}
在React中,虚拟DOM通过createElement函数创建:
const element = React.createElement(
'div',
{ id: 'app', className: 'container' },
React.createElement('span', null, 'Hello World')
);
1.3 两者的核心关系
虚拟DOM与真实DOM并非对立关系,而是协作关系。虚拟DOM是真实DOM在JavaScript层的抽象映射,最终仍需转换为真实DOM才能在页面上呈现。它们的关系可以用如下流程描述:

从流程图可以看出,虚拟DOM充当了数据与真实DOM之间的中间层,通过最小化真实DOM操作来提升性能。
二、真实DOM与虚拟DOM的区别详解
2.1 渲染流程对比
真实DOM的渲染流程相对直接:开发者通过原生API 操作DOM,浏览器立即响应并触发重排或重绘。每次操作都会引发浏览器的渲染流程,缺乏批量处理的机制。
真实DOM渲染流程如下:

