From: daiwei Date: Thu, 25 Dec 2025 09:55:57 +0000 (+0800) Subject: chore(runtime-core): mark idle callbacks initialization as pure X-Git-Tag: v3.6.0-beta.2~13 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cb5aa504aedd7ae86b2f16b812cc018d0ac220a3;p=thirdparty%2Fvuejs%2Fcore.git chore(runtime-core): mark idle callbacks initialization as pure --- diff --git a/packages/runtime-core/src/hydrationStrategies.ts b/packages/runtime-core/src/hydrationStrategies.ts index bb448236fd..0e961be242 100644 --- a/packages/runtime-core/src/hydrationStrategies.ts +++ b/packages/runtime-core/src/hydrationStrategies.ts @@ -3,10 +3,17 @@ import { DOMNodeTypes, isComment } from './hydration' // Polyfills for Safari support // see https://caniuse.com/requestidlecallback -const requestIdleCallback: Window['requestIdleCallback'] = - getGlobalThis().requestIdleCallback || (cb => setTimeout(cb, 1)) -const cancelIdleCallback: Window['cancelIdleCallback'] = - getGlobalThis().cancelIdleCallback || (id => clearTimeout(id)) +// Use lazy initialization to allow tree-shaking when hydrateOnIdle is not used +let requestIdleCallback: Window['requestIdleCallback'] +let cancelIdleCallback: Window['cancelIdleCallback'] + +function ensureIdleCallbacks() { + if (!requestIdleCallback) { + const g = getGlobalThis() + requestIdleCallback = g.requestIdleCallback || (cb => setTimeout(cb, 1)) + cancelIdleCallback = g.cancelIdleCallback || (id => clearTimeout(id)) + } +} /** * A lazy hydration strategy for async components. @@ -29,6 +36,7 @@ export type HydrationStrategyFactory = ( export const hydrateOnIdle: HydrationStrategyFactory = (timeout = 10000) => hydrate => { + ensureIdleCallbacks() const id = requestIdleCallback(hydrate, { timeout }) return () => cancelIdleCallback(id) }