]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
chore(runtime-core): mark idle callbacks initialization as pure
authordaiwei <daiwei521@126.com>
Thu, 25 Dec 2025 09:55:57 +0000 (17:55 +0800)
committeredison <daiwei521@126.com>
Fri, 26 Dec 2025 05:37:59 +0000 (13:37 +0800)
packages/runtime-core/src/hydrationStrategies.ts

index bb448236fd8b972a1003b929302ea18ce5f25489..0e961be2427fc1edf5a49e01ccb298ee87f4f8f6 100644 (file)
@@ -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<Options> = (
 export const hydrateOnIdle: HydrationStrategyFactory<number> =
   (timeout = 10000) =>
   hydrate => {
+    ensureIdleCallbacks()
     const id = requestIdleCallback(hydrate, { timeout })
     return () => cancelIdleCallback(id)
   }