在前端开发中,如果你尝试在短时间内往 DOM 中添加大量元素,比如一次性插入 100 万条数据,页面极有可能卡顿甚至直接崩溃。为了解决这一性能问题,我们可以借助浏览器提供的 `requestIdleCallback` 方法,利用浏览器空闲时间进行渐进式渲染。
本文将介绍 `requestIdleCallback` 的原理,并通过一个加载百万数据的例子,展示如何优化加载逻辑。我们会进行优化前后的代码对比,并最终输出完整的优化后代码。
`requestIdleCallback` 是浏览器提供的一种任务调度 API,它允许我们在主线程空闲时执行低优先级任务,从而避免阻塞用户交互。
requestIdleCallback(callback, { timeout });
假设我们要一次性渲染 100 万条数据,最直观的做法就是通过 `for` 循环和 DOM 操作一次性插入:
开始渲染
function startRender() {
for (let i = 0; i < 1000000; i++) {
const div = document.createElement('div');
div.textContent = \`第\${i + 1}条数据\`;
document.body.appendChild(div);
}
}
⚠️ 问题:
我们将渲染任务分批处理,并在每次主线程空闲时执行下一批操作。这样浏览器可以在用户交互和渲染之间进行调度,避免“线程阻塞”。
未优化:一次性插入100w条
┌────┬────┬────┬────┬────┬────┐
│████████████ 卡顿 ███████████│
└────┴────┴────┴────┴────┴────┘
优化后:空闲时分批插入100条
┌█───█───█───█───█───█───█───█┐
│ 渐进渲染中… 用户可交互 │
└█───█───█───█───█───█───█───█┘
✨ 如果你觉得这篇文章对你有帮助,不妨点个 免费的赞 或留言交流哦!