大型列表渲染问题
了解渲染 10,000 个 DOM 节点为何会严重拖慢性能,以及虚拟化如何解决这一问题。
大型列表渲染问题 是 CoddyKit 上的免费 React Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。
渲染 10000 个 li 元素
假设您遍历一个包含一万个项目的数组,并为每个项目渲染一个 li。即使屏幕上一次只能容纳几十个项目,React 仍会逐一创建一万个 DOM 节点。
其中大多数节点都在屏幕外且不可见,但浏览器仍必须创建、布局并维护每一个节点。
大型 DOM 树的浏览器布局开销
大型 DOM 树会给浏览器带来实际的开销。布局、样式重新计算和内存占用都会随节点数量增长,因此超长列表会拖慢初始渲染并增加内存使用。
当引擎需要跟踪并重新排布数万个节点时,即使是简单的交互也可能出现卡顿。
滚动性能下降
用户最能感受到问题的场景就是滚动超长列表。内容移动时,浏览器会重新绘制,并可能重新计算布局;节点过多时,帧率会降到不再流畅的程度。
结果就是滚动卡顿、延迟明显,无论应用其他部分运行多快,界面都会显得响应迟缓。
在 DevTools 中测量节点数量
您可以在浏览器 DevTools 的内存面板中确认这个问题,该面板会报告页面上的 DOM 节点数量。创建数千个节点的列表会在这里清晰地显示出来。
观察渲染更多项目时节点数量不断增加,就能得到具体证据,证明 DOM 大小是性能瓶颈。
窗口化概念
窗口化有时也称为虚拟化,它只渲染当前可见的项目以及少量缓冲项目,而不是整个列表。随着您滚动,进入视口的项目会被挂载,离开视口的项目会被卸载。
这样无论数据包含多少项目,实际 DOM 都能保持很小,从而将 DOM 大小与数据集大小解耦。
计算可见窗口
可见窗口由滚动位置、容器高度和项目高度推导而来。用视口高度除以项目高度,可以大致得到能容纳多少行;滚动偏移量则能确定具体是哪些行。
该库利用这些数值决定任意时刻究竟渲染哪一部分项目。
react-virtualized、react-window 与 TanStack Virtual
有多个库实现了窗口化。react-virtualized 功能丰富但体积较大,react-window 是同一作者编写的更小巧、更专注的重写版本,而 TanStack Virtual 则是现代的无头选项。
对于大多数列表而言,react-window 在简单性和性能之间取得了很好的平衡,因此本课程将重点介绍它。
何时必须使用窗口化
当列表很长(大致达到几百行或更多),或者每行包含大量图片和嵌套组件时,窗口化才能带来明显收益。此时 DOM 大小确实会损害性能。
无限信息流、大型数据表和聊天记录,都是窗口化从可选方案变为必要方案的典型场景。
何时不值得使用
对于只有几十个简单项目的短列表,窗口化会增加复杂性,却没有明显收益。绝对定位和测量所带来的开销甚至可能得不偿失。
请仅在数据集确实很大时使用窗口化;对于小型数据集,普通的 map 更简单,而且速度完全足够。
收益
使用窗口化后,即使列表包含十万个项目,DOM 中也只保留少量可见项目,因此初始渲染速度快、内存占用低,滚动也很流畅。
您只需在设置时增加少许复杂性,就能换来不再取决于数据量的性能,这正是虚拟化的核心承诺。
快速检查:何时使用虚拟化
请判断何时值得使用虚拟化。
回顾:大型列表问题
渲染数千个 DOM 节点会增加布局开销、内存占用和滚动卡顿,您可以通过 DevTools 中的节点数量确认这一点。虚拟化只渲染可见窗口及其缓冲区,从而保持 DOM 较小。
在 react-virtualized 和 TanStack Virtual 等方案中,react-window 是一种专注且轻量的选择。请将它用于大型或内容繁重的列表,而对于短小简单的列表则跳过它。
常见问题解答
「大型列表渲染问题」课时是免费的吗?
是的 — 「大型列表渲染问题」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。
「大型列表渲染问题」这节课中我会学到什么?
了解渲染 10,000 个 DOM 节点为何会严重拖慢性能,以及虚拟化如何解决这一问题。 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 React Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「大型列表渲染问题」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 React Academy 课中编写并运行代码吗?
能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。