Skip to content

Vue 调度器:job queue、批量更新与 flush 顺序

主题边界

  • Vue 更新不是“数据变了,DOM 立刻改”,而是 effect 被 scheduler 放进队列统一刷新。
  • 调度器的目标是去重、批处理、保证父子顺序,并给 watcher 提供 prepostsync 时机。

机制与流程

  • queueJob 把组件更新 job 推入队列,并通过去重避免同一轮事件循环里重复执行。
  • flush 通常发生在微任务边界,这样同步代码中的多次状态修改会合并成一次刷新。
  • watch / watchEffect 默认 flush: 'pre'post 适合读更新后的 DOM,sync 则跳过队列立即执行。

关键差异

  • scheduler 解决的是“什么时候更新”,不是“怎么 diff”;内容更新仍由 render effect 和 patch 决定。
  • nextTick 依赖当前这一轮队列刷新完成后的时机,因此通常是微任务语义而不是宏任务语义。

边界条件

  • 过度使用 sync watcher 会破坏批处理收益,并增加递归触发风险。
  • nextTick 不等于“下一个 setTimeout”,把它和宏任务等价会判断错 DOM 可见性时机。

工程落点

  • 很多“为什么拿不到最新 DOM”“为什么 watcher 先跑”的问题,本质上都是 flush 顺序问题。
  • 理解 scheduler 之后,生命周期、watch 时机和性能优化会自然串成一条主链。

相关主题