页面上有100万个任务需要执行,如何保证页面不卡顿?

预计阅读时间: 3 分钟

核心:为浏览器留下渲染的时间

1. 分批执行任务:

  • 不要一次性全部执行 100 万个任务,而是将其分成多个小批次执行。
  • 可以使用 setTimeout 或 requestAnimationFrame 等方法,每次执行一小批任务,并在下一个空闲时间片再执行下一批。
  • 这样可以确保每次执行的任务数量不会过多,从而避免阻塞主线程,导致页面卡顿。

2. 使用 Web Worker:

  • 将耗时的任务移到 Web Worker 中执行,让主线程保持响应。
  • Web Worker 运行在独立的线程中,不会阻塞主线程的 UI 更新和交互响应。
  • 主线程可以与 Web Worker 通过消息传递的方式进行通信,从而协调任务的执行和结果的处理。

3. 利用 requestIdleCallback:

  • 使用 requestIdleCallback 在浏览器空闲时执行任务。
  • 这样可以确保任务执行不会影响到用户的交互体验。
  • 可以在 requestIdleCallback 的回调函数中分批执行任务,并根据 deadline 对象调整任务的执行策略。

4. 增量式更新 UI:

  • 不要一次性将所有 100 万个任务的结果渲染到页面上,而是采取增量式更新 UI。
  • 每执行完一批任务,就立即更新页面上相应的部分,而不是等到所有任务都完成后再一次性更新。
  • 这样可以保证用户在任务执行过程中也能看到部分结果,从而获得更好的体验。

5.React Fiber:React 16中引入的新的调度算法,可以将任务拆分成多个小任务,优先级高的任务先执行。