无需登录 数据私有 本地保存

scheduler.postTask优先级演示 - 用户交互优先

10
0
0
0
检测 scheduler.postTask API...
30ms
🔴 用户阻塞
0
已完成 / 0 等待
🔵 用户可见
0
已完成 / 0 等待
⚫ 后台
0
已完成 / 0 等待
⏱ 总完成任务
0
user-blocking 队列
0 个任务
等待添加任务...
user-visible 队列
0 个任务
等待添加任务...
background 队列
0 个任务
等待添加任务...
执行日志
0 条记录
暂无日志,添加任务开始演示...
常见问题 & 知识点

scheduler.postTask 是浏览器的优先级任务调度API(Prioritized Task Scheduling API),属于 Main Thread Scheduling 规范。它允许开发者以声明式的方式安排任务,并指定优先级(user-blockinguser-visiblebackground),浏览器会根据优先级和当前主线程负载智能调度。相比传统的 setTimeout,它能更好地响应用户交互,避免页面卡顿,提升INP(Interaction to Next Paint)等核心Web指标。

  • user-blocking(最高优先级):用于需要立即响应用户交互的任务,如处理点击事件、输入框响应、动画更新。延迟可能导致用户感知到卡顿。
  • user-visible(中等优先级):用户能看到但不紧急的任务,如渲染列表、加载图片、更新非关键UI。默认优先级。
  • background(最低优先级):用户不感知的后台任务,如数据预取、日志上报、分析统计、垃圾回收辅助。浏览器可能在空闲时才执行。

目前 Chrome 94+Edge 94+ 完整支持。Firefox 和 Safari 尚未原生支持。对于不支持的浏览器,可以使用 scheduler-polyfill 或回退到 setTimeout 模拟(本演示工具即采用此策略)。在生产环境中建议使用polyfill以获得跨浏览器的一致性体验。

使用 AbortControllersignal 参数。在调用 scheduler.postTask(callback, { signal }) 时传入 signal,之后调用 controller.abort() 即可取消尚未执行的任务。注意:已经开始执行的任务无法被取消,取消仅对等待中的任务生效。任务被取消后,其Promise会被reject并抛出 AbortError

  • setTimeout:简单延迟,不感知优先级,所有任务按时间顺序竞争主线程。
  • requestAnimationFrame:在渲染帧之前执行,适合动画和DOM更新,但无优先级概念。
  • scheduler.postTask:浏览器原生调度器感知用户交互、帧边界和任务优先级,能动态调整执行顺序,确保高优先级任务优先完成。它还支持 delay 延迟和 signal 取消,是更现代、更智能的调度方案。

"用户交互优先"是指将响应用户操作(点击、输入、滚动等)的任务赋予最高调度优先级。当主线程繁忙时,user-blocking 任务可以插队到 background 任务之前执行,确保用户感知的延迟最小。这对于优化 INP(Interaction to Next Paint) 指标至关重要——Google已将INP作为Core Web Vitals的核心指标之一。本演示工具正是为了直观展示这一机制。

delay 参数指定任务最早可以执行的时间(毫秒)。与 setTimeout 不同,delay过后任务会根据其优先级被调度,而非立即执行。例如,一个 delay=100ms 的 background 任务,在100ms后只是变得"可执行",但仍需等待更高优先级的任务完成。这比 setTimeout 更灵活,既能延迟又能保持优先级语义。