高效操作 DOM

我将讨论在管理和更新 DOM 时避免过度内存使用的最佳实践,以使您的应用程序达到极快的速度™️。

DOM: 文档对象模型 – 简介

当您渲染 HTML 时,浏览器中这些渲染元素的实时视图称为 DOM。您可以在开发者工具的 “元素” 检查器中看到它:

Chrome 开发者工具中的元素面板

它本质上是一个树结构,其中每个元素都是一个叶子。整个 API 集专门用于修改这个元素树。

以下是一些常见的 DOM API 列表:

  • querySelector()
  • querySelectorAll()
  • createElement()
  • getAttribute()
  • setAttribute()
  • addEventListener()
  • appendChild()

这些 API 附加在 document 对象上,所以您可以像这样使用它们:const el = document.querySelector("#el");。它们也可用于所有其他元素,因此如果您有一个元素引用,您可以使用这些方法,并且它们的功能范围限于该元素。

1
2
const nav = document.querySelector("#site-nav");
const navLinks = nav.querySelectorAll("a");

这些方法将在浏览器中可用以修改 DOM,但在服务器端 JavaScript(如 Node.js)中不可用,除非您使用像 js-dom 这样的 DOM 模拟器。

作为一个行业,我们将大部分直接渲染工作转移到了框架上。所有 JavaScript 框架(React、Angular、Vue、Svelte 等)都在底层使用这些 API。虽然我认识到框架的生产力优势通常超过了手动 DOM 操作的潜在性能提升,但我希望在本文中揭开这些底层操作的神秘面纱。

为什么首先要自己操作 DOM?

主要原因是性能。框架可能会添加不必要的数据结构和重渲染,导致许多现代 Web 应用中令人讨厌的卡顿/冻结现象。这是由于垃圾回收器需要处理大量代码而被迫超负荷工作。

缺点是手动操作 DOM 会产生更多代码。这可能会变得复杂,这也是为什么使用框架和围绕 DOM 的抽象会带来更好的开发者体验的原因。尽管如此,有些情况下您可能需要额外的性能提升。这个指南就是为这些情况准备的。

VS Code 是基于手动 DOM 操作构建的

Visual Studio Code 就是这样的案例之一。VS Code 是用原生 JavaScript 编写的,“尽可能接近 DOM”。像 VS Code 这样的大型项目需要对性能进行严格控制。由于其强大的插件生态系统,核心必须尽可能核心和轻量化,这也是其广泛采用的原因。