Appearance
Vue 调度器:job queue、批量更新与 flush 顺序
主题边界
- Vue 更新不是“数据变了,DOM 立刻改”,而是 effect 被 scheduler 放进队列统一刷新。
- 调度器的目标是去重、批处理、保证父子顺序,并给 watcher 提供
pre、post、sync时机。
机制与流程
queueJob把组件更新 job 推入队列,并通过去重避免同一轮事件循环里重复执行。- flush 通常发生在微任务边界,这样同步代码中的多次状态修改会合并成一次刷新。
watch/watchEffect默认flush: 'pre',post适合读更新后的 DOM,sync则跳过队列立即执行。
关键差异
- scheduler 解决的是“什么时候更新”,不是“怎么 diff”;内容更新仍由 render effect 和 patch 决定。
nextTick依赖当前这一轮队列刷新完成后的时机,因此通常是微任务语义而不是宏任务语义。
边界条件
- 过度使用
syncwatcher 会破坏批处理收益,并增加递归触发风险。 nextTick不等于“下一个 setTimeout”,把它和宏任务等价会判断错 DOM 可见性时机。
工程落点
- 很多“为什么拿不到最新 DOM”“为什么 watcher 先跑”的问题,本质上都是 flush 顺序问题。
- 理解 scheduler 之后,生命周期、watch 时机和性能优化会自然串成一条主链。