From 4a71105e284730b744c5f16c13c152eb2084fd51 Mon Sep 17 00:00:00 2001 From: dj <1042039504@qq.com> Date: Tue, 24 Feb 2026 22:06:33 +0800 Subject: [PATCH] =?UTF-8?q?feat(runtime-core):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E9=A2=84=E5=86=B2=E6=B4=97=E5=9B=9E=E8=B0=83=E9=98=9F=E5=88=97?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 runtime-core 中新增 queuePreFlushCb 函数用于管理预冲洗回调 - 在 vue 包中导出 queuePreFlushCb 函数供外部使用 - 实现调度器中的回调队列机制,包括队列管理和执行逻辑 - 添加去重逻辑确保回调函数只执行一次 - 新增示例文件展示调度器预冲洗回调的使用方法 --- packages/runtime-core/src/index.ts | 1 + packages/runtime-core/src/scheduler.ts | 34 +++++++++++++++++++ .../vue/examples/reactivity/scheduler-2.html | 28 +++++++++++++++ packages/vue/src/index.ts | 1 + 4 files changed, 64 insertions(+) create mode 100644 packages/vue/examples/reactivity/scheduler-2.html diff --git a/packages/runtime-core/src/index.ts b/packages/runtime-core/src/index.ts index e69de29..a3a2657 100644 --- a/packages/runtime-core/src/index.ts +++ b/packages/runtime-core/src/index.ts @@ -0,0 +1 @@ +export { queuePreFlushCb } from './scheduler' diff --git a/packages/runtime-core/src/scheduler.ts b/packages/runtime-core/src/scheduler.ts index 8f46835..b671ea8 100644 --- a/packages/runtime-core/src/scheduler.ts +++ b/packages/runtime-core/src/scheduler.ts @@ -1 +1,35 @@ let isFlushPending = false + +const resolvedPromise = Promise.resolve() as Promise + +let currentFlushPromise: Promise | null = null + +const pendingPreFlushCbs: Function[] = [] +export function queuePreFlushCb(cb: Function) { + queueCb(cb, pendingPreFlushCbs) +} +function queueCb(cb: Function, pendingQueue: Function[]) { + pendingQueue.push(cb) + queueFlush() +} + +function queueFlush() { + if (!isFlushPending) { + isFlushPending = true + currentFlushPromise = resolvedPromise.then(flushJobs) + } +} +function flushJobs() { + isFlushPending = false + flushPreFlushCbs() +} +export function flushPreFlushCbs() { + if (pendingPreFlushCbs.length) { + //拷贝去重,类似深拷贝 + let activePreFlushCbs = [...new Set(pendingPreFlushCbs)] + pendingPreFlushCbs.length = 0 + for (let i = 0; i < activePreFlushCbs.length; i++) { + activePreFlushCbs[i]() + } + } +} diff --git a/packages/vue/examples/reactivity/scheduler-2.html b/packages/vue/examples/reactivity/scheduler-2.html new file mode 100644 index 0000000..2cf8208 --- /dev/null +++ b/packages/vue/examples/reactivity/scheduler-2.html @@ -0,0 +1,28 @@ + + + + + Document + + + +
+ + + \ No newline at end of file diff --git a/packages/vue/src/index.ts b/packages/vue/src/index.ts index 6a2f477..8fb36c5 100644 --- a/packages/vue/src/index.ts +++ b/packages/vue/src/index.ts @@ -1 +1,2 @@ export { reactive, effect, ref, computed } from '@vue/reactivity' +export { queuePreFlushCb } from '@vue/runtime-core'