从原理层面解释前端大数据量性能优化系列——分片加载

这里写自定义目录标题

分片加载

背景

我们知道,浏览器渲染时如果节点宽高有变化,会触发重排,进而引起重绘大部分浏览器在一秒钟内可以显示的最大帧数是60(FPS=60Hz)。可以理解为两帧之间的最大间隔时长是1000/60ms,而如果当浏览器渲染某一帧的时长超过了1000/60ms,就会挤占掉下一帧的渲染时间,当前帧渲染完毕而时间却没有用完,就会出现空白、卡顿的现象(掉帧)

解决方案

分片加载的核心原理,就是主动打断长任务,让出主线程,把大任务切分成多个小任务,与浏览器的帧率对齐。

setTimeout

最直接的想法,我们可以使用setTimeout分片,但是问题也是显而易见的:浏览器对嵌套的 setTimeout 有最小间隔限制(通常大于等于 4ms)。这意味着在每 1000/60ms 的渲染周期中,有 4ms 被白白浪费,降低了执行效率。并且setTimeout 只是将回调"塞进队列等待",它不保证准时执行,容易受到其他宏任务或微任务的阻塞影响。

requestAnimationFrame

所幸我们有更好的解决方案:

requestAnimationFrame是 HTML5 新增的 API,它的核心优势在于与浏览器的渲染心跳同频共振:主要用于在浏览器的下一次重绘之前调用指定的回调函数。如果系统绘制率是 60Hz,那么回调函数就会 1000/60ms 再 被执行一次。这保证了你的代码永远在浏览器绘制新一帧之前执行,浏览器可以一气呵成地完成后续渲染,完美避免了中间状态的撕裂。

需要注意的一点是:当页面不可见(如快速滚动导致元素移出视口,或切换了标签页)时,浏览器会自动暂停 requestAnimationFrame 的执行,从而节省电量和 CPU 资源。而这可能会带来一个问题:如果你的业务逻辑依赖于持续不断的后台更新,使用 requestAnimationFrame 会导致任务中断。

相关推荐
杨先生哦2 小时前
2026 热端攻防:AI 驱动 Web 前端安全全景透析
前端·笔记·安全·web安全
李白的天不白2 小时前
SmartAdmin(基于 Spring Boot 框架)中配置跨域请求 VUE3 设置请求头
java·前端
一个被程序员耽误的厨师2 小时前
01-设计篇-我用前端那一套手艺造了一个AI-Native工具
前端·ai-native
不吃糖葫芦32 小时前
vue3实现拓扑图编辑功能(谨以此纪念我当前的最后一份前端工作)
前端
大家的林语冰2 小时前
超越 TypeScript,Flow 强势回归,语法高仿 TS,功能更丰富,类型更安全!
前端·javascript·typescript
এ慕ོ冬℘゜2 小时前
jQuery 高可用多图上传组件(企业级封装 + 踩坑全解 + 可直接上线)
前端·javascript·jquery
爱勇宝2 小时前
AI 时代,前端工程师的话语权正在下降?
前端·后端
kymjs张涛2 小时前
一个月,纯VibeCoding,全平台云笔记APP
前端·javascript·后端