From 639fc0baf35fceffc7a6ffb300f4f1fe2f0082a7 Mon Sep 17 00:00:00 2001 From: daiwei Date: Thu, 24 Jul 2025 17:42:44 +0800 Subject: [PATCH] chore: add comments --- packages/compiler-core/src/transforms/cacheStatic.ts | 6 ++++++ packages/runtime-core/src/vnode.ts | 6 ++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/compiler-core/src/transforms/cacheStatic.ts b/packages/compiler-core/src/transforms/cacheStatic.ts index fe995b97da..c4d29f7124 100644 --- a/packages/compiler-core/src/transforms/cacheStatic.ts +++ b/packages/compiler-core/src/transforms/cacheStatic.ts @@ -219,6 +219,12 @@ function walk( // #6978, #7138, #7114 // a cached children array inside v-for can caused HMR errors since // it might be mutated when mounting the first item + // #13221 + // fix memory leak in cached array: + // cached vnodes get replaced by cloned ones during mountChildren, + // which bind DOM elements. These DOM references persist after unmount, + // preventing garbage collection. Array spread avoids mutating cached + // array, preventing memory leaks. exp.needArraySpread = true return exp } diff --git a/packages/runtime-core/src/vnode.ts b/packages/runtime-core/src/vnode.ts index baa7b17746..cd1ef948d7 100644 --- a/packages/runtime-core/src/vnode.ts +++ b/packages/runtime-core/src/vnode.ts @@ -680,9 +680,7 @@ export function cloneVNode( scopeId: vnode.scopeId, slotScopeIds: vnode.slotScopeIds, children: - // if vnode is cached, deep clone it's children to prevent cached children - // from retaining detached DOM nodes - patchFlag === PatchFlags.CACHED && isArray(children) + __DEV__ && patchFlag === PatchFlags.CACHED && isArray(children) ? (children as VNode[]).map(deepCloneVNode) : children, target: vnode.target, @@ -740,7 +738,7 @@ export function cloneVNode( } /** - * for HMR of hoisted vnodes reused in v-for + * Dev only, for HMR of hoisted vnodes reused in v-for * https://github.com/vitejs/vite/issues/2022 */ function deepCloneVNode(vnode: VNode): VNode { -- 2.47.2