From 588de481bafc0236b43912ddf4b8e63b180fbde6 Mon Sep 17 00:00:00 2001 From: daiwei Date: Fri, 26 Sep 2025 09:12:47 +0800 Subject: [PATCH 1/3] fix(Suspense): reset vnode.placeholder to null when removing placeholder --- packages/runtime-core/src/components/Suspense.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/runtime-core/src/components/Suspense.ts b/packages/runtime-core/src/components/Suspense.ts index 0109d77c3f2..368d834f198 100644 --- a/packages/runtime-core/src/components/Suspense.ts +++ b/packages/runtime-core/src/components/Suspense.ts @@ -728,6 +728,8 @@ function createSuspenseBoundary( optimized, ) if (placeholder) { + // clean up placeholder reference + vnode.placeholder = null remove(placeholder) } updateHOCHostEl(instance, vnode.el) From d3109ee34b473208028a7ab9c5fa9f2d4884f724 Mon Sep 17 00:00:00 2001 From: daiwei Date: Wed, 5 Nov 2025 20:46:53 +0800 Subject: [PATCH 2/3] fix(Suspense): clear el reference from fallback vnode to allow garbage collection --- packages/runtime-core/src/components/Suspense.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/runtime-core/src/components/Suspense.ts b/packages/runtime-core/src/components/Suspense.ts index 368d834f198..3136958f344 100644 --- a/packages/runtime-core/src/components/Suspense.ts +++ b/packages/runtime-core/src/components/Suspense.ts @@ -570,6 +570,10 @@ function createSuspenseBoundary( anchor = next(activeBranch) } unmount(activeBranch, parentComponent, suspense, true) + // clear el reference from fallback vnode to allow GC + if (suspense.isInFallback && vnode.ssFallback) { + vnode.ssFallback.el = null + } } if (!delayEnter) { // move content from off-dom container to actual container From 9954f4546e0563c17fadf91fb9cfdf525bd7ff74 Mon Sep 17 00:00:00 2001 From: daiwei Date: Wed, 5 Nov 2025 20:46:53 +0800 Subject: [PATCH 3/3] fix(Suspense): clear el reference from fallback vnode to allow garbage collection --- packages/runtime-core/src/components/Suspense.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/runtime-core/src/components/Suspense.ts b/packages/runtime-core/src/components/Suspense.ts index 368d834f198..d14e96be3d0 100644 --- a/packages/runtime-core/src/components/Suspense.ts +++ b/packages/runtime-core/src/components/Suspense.ts @@ -530,6 +530,7 @@ function createSuspenseBoundary( effects, parentComponent, container, + isInFallback, } = suspense // if there's a transition happening we need to wait it to finish. @@ -551,6 +552,10 @@ function createSuspenseBoundary( MoveType.ENTER, ) queuePostFlushCb(effects) + // clear el reference from fallback vnode to allow GC after transition + if (isInFallback && vnode.ssFallback) { + vnode.ssFallback.el = null + } } } } @@ -570,6 +575,11 @@ function createSuspenseBoundary( anchor = next(activeBranch) } unmount(activeBranch, parentComponent, suspense, true) + // clear el reference from fallback vnode to allow GC + // only clear immediately if there's no delayed transition + if (!delayEnter && isInFallback && vnode.ssFallback) { + vnode.ssFallback.el = null + } } if (!delayEnter) { // move content from off-dom container to actual container