什么是虚拟 DOM?它的作用是什么?

希望简单了解虚拟 DOM,它的作用是什么?

阅读 187
avatarAI BotBETA

虚拟 DOM(Virtual DOM)是一种轻量级的 JavaScript 对象,本质上是真实 DOM 的抽象表示。它的核心作用是通过高效比对变化,减少直接操作真实 DOM 的频率,从而提升页面性能

核心作用:

  1. 性能优化

    • 直接操作真实 DOM 成本高(触发重排/重绘),频繁修改会导致性能问题。
    • 虚拟 DOM 先在内存中计算差异(Diff 算法),批量更新真实 DOM,减少直接操作次数。
  2. 简化开发逻辑

    • 开发者只需关注数据变化(如 state),无需手动操作 DOM。
    • 框架(如 React)自动将数据映射到虚拟 DOM,再同步到真实 DOM。
  3. 跨平台能力

    • 虚拟 DOM 不依赖浏览器,同一套逻辑可渲染到不同平台(如 React Native 渲染原生组件)。

工作流程示例:

  1. 初始渲染:数据 → 生成虚拟 DOM → 转为真实 DOM
  2. 数据变化:生成新虚拟 DOM → 对比新旧差异(Diff)→ 仅更新变化的部分到真实 DOM

为什么需要它?

  • 真实 DOM 属性多、操作慢,虚拟 DOM 对象结构简单,操作更快。
  • 手动优化 DOM 更新复杂且易出错,虚拟 DOM 自动优化差异更新。
3 个回答

虚拟DOM本质上是JavaScript对象,真实DOM的轻量级表示。它的主要作用有:

  1. 提升性能 - 通过批量计算DOM变化,减少实际DOM操作
  2. 简化开发 - 让开发者专注于描述UI状态,而非手动操作DOM
  3. 实现跨平台 - 同一套逻辑可用于Web、移动应用和服务器渲染

虚拟DOM工作流程就是创建虚拟树、比较新旧差异、只更新变化部分到真实DOM。牺牲了一点内存,但大大提高了开发效率和应用性能。

虚拟 DOM 是 React 中的一种技术,用于提高 DOM 操作的性能。

口语化解释:虚拟 DOM 是一个轻量级的 JavaScript 对象,它是对真实 DOM 的抽象。当状态变化时,React 会先更新虚拟 DOM,然后通过对比新旧虚拟 DOM 的差异,只更新真实 DOM 中需要变化的部分,从而减少直接操作 DOM 的开销。

简单来讲,虚拟dom是通过命令式和声明式来渲染来渲染页面的方式,你可以对比以下innerHtml和虚拟dom。

  • innerHtml是基于给定的模板字符串替换页面的真实dom,先把字符串解析成dom元素再渲染或替换掉页面的真实dom。
  • 虚拟dom则分为两步:第一步创建 JavaScript 对象,这个对象可以理解为真实 dom 的描述;第二步是递归地遍历虚拟 dom 树并创建真实 dom。

如果涉及到批量dom更新和频繁的dom更新,虚拟dom的性能会显著由于innerHtml。遇到新dom更新时,innerHTML会把之前渲染过的dom全部销毁然后再创建,这种属于大开大合的性能消耗。
而虚拟dom则会通过diff算法,比对新旧dom的不同处并只更新不同节点。

我来简单给你展示以下虚拟dom长什么样子:

const obj = {
    tag: 'div',
    children: [
        { tag: 'span', children: 'hello world' }
    ]
}

上述的代码就是一组虚拟dom的描述,div标签嵌套了span标签,span标签内部就是'hello world'字符串,然后通过Render生成真实dom渲染到页面

function Render(obj, root) {
    const el = document.createElement(obj.tag)
    if (typeof obj.children === 'string') {
        const text = document.createTextNode(obj.children)
        el.appendChild(text)
    } else if (obj.children) {
        // 数组,递归调用 Render,使用 el 作为 root 参数
        obj.children.forEach((child) => Render(child, el))
    }

    // 将元素添加到 root
    root.appendChild(el)
}

你日常开发过程中写的template模板代码vue也会提供一个编译函数给你,通过编译函数解析模板代码,然后生成真实dom
当然,真实的虚拟dom肯定比这个复杂得多,可能会有监听器、依赖收集器,编译器等等

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题