告别页面卡顿!用空闲进程渲染打造高性能图片加载体验

146 阅读1分钟

告别页面卡顿!用空闲进程渲染打造高性能图片加载体验

有以下工作场景?

  • 打开一个图片密集型页面时,浏览器像被按下了慢放键
  • 滚动页面时,图像加载导致页面抖动卡顿
  • 想要快速操作页面,但因为图片在后台疯狂加载而反应迟缓

这些问题的根源往往是主线程被阻塞。当我们的代码一次性执行大量DOM操作或资源加载时,浏览器无法及时响应用户交互,导致体验极差,使用requestIdleCallback可以解决这个问题,在此基础上做了代码优化。

// 封装的requestIdleWork函数
function requestIdleWork(workFn, timeout = 100) {
  if (typeof requestIdleCallback === 'function') {
    requestIdleCallback(nonEssentialWork, { timeout })
  } else {
    // 降级为setTimeout
    setTimeout(workFn, timeout)
  }
  
  function nonEssentialWork(deadline) {
    // 如果帧内有富余的时间,或者超时
    if ((deadline?.timeRemaining && deadline.timeRemaining() > 0) || (timeout && deadline?.didTimeout)) {
      workFn()
    } else {
      requestIdleCallback(nonEssentialWork, { timeout })
    }
  }
}
// 调用方法
requestIdleWork(loadImages, 1000);

git地址

gitee.com/xcxsj/code-…