domTree 在内存中挂载和在页面中渲染的本质区别是什么?

110 阅读4分钟

DOM Tree 在内存中挂载在页面中渲染本质上的区别可以从以下几个方面理解:内存中的挂载主要是数据结构的构建,而页面中的渲染是将这些数据结构转换为视觉化的内容,供用户浏览和交互。


1. 核心区别

1.1 内存中的挂载

  • 本质:指在内存中构建 DOM 节点树(即 document 对象模型)。
    例如,通过 JavaScript 使用 document.createElementinnerHTML 动态生成 DOM 结构,构建出一棵完整的 DOM 树。

  • 行为

    • 创建 DOM 节点对象并存储在内存中。
    • 设置节点的属性(attributes)和内容(textContent)。
    • 建立父子节点之间的引用关系。
  • 状态:仅存在于 JavaScript 的运行环境中,尚未映射到屏幕上。

  • 性能

    • 操作在内存中完成,速度较快。
    • 不触发浏览器的重绘(repaint)或回流(reflow)。
  • 示例代码:

    const div = document.createElement('div'); // 创建内存中的节点
    div.textContent = 'Hello, DOM Tree!';
    

1.2 页面中的渲染

  • 本质:指浏览器将 DOM 树转换为渲染树(Render Tree),然后通过 GPU 将可见的内容绘制到屏幕上。

  • 行为

    • 浏览器解析 DOM 和 CSSOM(CSS 对象模型),结合两者构建渲染树。
    • 计算每个节点的样式和布局信息(回流)。
    • 将渲染树中的节点逐步绘制到屏幕上(重绘)。
  • 状态:用户可以通过视觉看到最终渲染的页面。

  • 性能

    • 涉及浏览器的渲染管线,可能会因布局计算和绘制而消耗更多时间。
    • 对页面中已存在的 DOM 节点进行修改,会触发回流和重绘。
  • 示例代码:

    const app = document.getElementById('app');
    app.appendChild(div); // 挂载节点到页面
    

2. 主要差异点

特性内存中的挂载页面中的渲染
作用构建逻辑树,建立节点关系将逻辑树可视化,展示给用户
位置存在于内存(未映射到屏幕)已经由浏览器绘制到屏幕上
性能操作较快,不涉及绘制开销受限于浏览器渲染性能
触发的机制仅改变 JavaScript 对象的状态触发浏览器的布局计算和绘制
用户是否可见用户不可见用户可见
操作的影响不直接影响页面影响页面布局和显示
渲染流程不涉及渲染管线流程涉及 DOM -> Render Tree -> 绘制

3. 内存挂载和页面渲染的关系

3.1 DOM 树和渲染树的区别

  • DOM 树:HTML 和 JavaScript 创建的对象树,表示页面的结构信息,包括所有节点。
  • 渲染树:DOM 树和 CSSOM 树结合后的产物,仅包含可见的节点及其计算后的样式信息。

在内存中挂载的 DOM 节点只是被添加到了 DOM 树中,只有当这些节点被浏览器渲染管线处理后,才会映射到页面中。

3.2 渲染过程

当节点从内存挂载到页面时,浏览器的渲染管线会执行以下步骤:

  1. 构建 DOM 树:将 HTML 和动态操作解析为 DOM 树。
  2. 构建 CSSOM 树:解析 CSS 规则并匹配到对应的 DOM 节点。
  3. 生成渲染树:DOM 和 CSSOM 结合,移除不可见节点(如 display: none)。
  4. 布局(回流) :计算每个节点的位置和大小。
  5. 绘制(重绘) :将渲染树绘制到屏幕。

4. 为什么需要区分两者?

4.1 优化性能

  • 在内存中批量挂载多个节点后,再一次性插入页面,可以避免频繁的回流和重绘:

    const fragment = document.createDocumentFragment(); // 创建文档片段
    for (let i = 0; i < 1000; i++) {
      const div = document.createElement('div');
      div.textContent = `Item ${i}`;
      fragment.appendChild(div); // 节点挂载到内存中
    }
    document.body.appendChild(fragment); // 一次性插入页面
    

4.2 减少渲染开销

在操作 DOM 树时,可以在内存中修改和挂载,避免直接对页面进行多次更新,从而提高渲染性能。

4.3 支持虚拟 DOM 的实现

现代前端框架(如 React、Vue)通过虚拟 DOM 技术,先在内存中构建和更新虚拟 DOM 树,再与页面中的 DOM 树对比,尽可能减少实际的页面渲染。


5. 总结

  • 内存中的挂载:逻辑层面的 DOM 树操作,构建出页面结构的描述。
  • 页面中的渲染:将内存中的 DOM 树通过浏览器渲染管线转换为屏幕上的视觉结果。
  • 区分两者有助于优化性能、减少不必要的页面更新,以及更好地理解现代前端框架的工作原理。

如果优化得当,可以有效避免不必要的回流和重绘,提升页面性能和用户体验。