From 7f3a5868d35dccb0a31a6f33c8b09104db07f14f Mon Sep 17 00:00:00 2001 From: harshmandan Date: Fri, 15 Aug 2025 02:25:09 +0530 Subject: [PATCH 1/5] fix: do not defer unmount; immediately unmount components --- .../src/internal/client/dom/blocks/svelte-component.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/svelte/src/internal/client/dom/blocks/svelte-component.js b/packages/svelte/src/internal/client/dom/blocks/svelte-component.js index 2697722b3953..be6611c96d11 100644 --- a/packages/svelte/src/internal/client/dom/blocks/svelte-component.js +++ b/packages/svelte/src/internal/client/dom/blocks/svelte-component.js @@ -34,11 +34,6 @@ export function component(node, get_component, render_fn) { var pending_effect = null; function commit() { - if (effect) { - pause_effect(effect); - effect = null; - } - if (offscreen_fragment) { // remove the anchor /** @type {Text} */ (offscreen_fragment.lastChild).remove(); @@ -56,6 +51,11 @@ export function component(node, get_component, render_fn) { var defer = should_defer_append(); + if (effect) { + pause_effect(effect); + effect = null; + } + if (component) { var target = anchor; From 45ae96c41c8a15f1124bf57e57b23db9400d1636 Mon Sep 17 00:00:00 2001 From: harshmandan Date: Fri, 15 Aug 2025 02:34:23 +0530 Subject: [PATCH 2/5] fix: add changeset --- .changeset/few-geese-itch.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/few-geese-itch.md diff --git a/.changeset/few-geese-itch.md b/.changeset/few-geese-itch.md new file mode 100644 index 000000000000..8712733e571d --- /dev/null +++ b/.changeset/few-geese-itch.md @@ -0,0 +1,5 @@ +--- +'svelte': minor +--- + +Do not defer unmounting of component From d2c85f61ed41421e92fe984eab68cbab8d355fac Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Fri, 15 Aug 2025 13:46:19 +0200 Subject: [PATCH 3/5] Update .changeset/few-geese-itch.md Co-authored-by: Jeremiasz Major --- .changeset/few-geese-itch.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/few-geese-itch.md b/.changeset/few-geese-itch.md index 8712733e571d..e1ec036c53de 100644 --- a/.changeset/few-geese-itch.md +++ b/.changeset/few-geese-itch.md @@ -1,5 +1,5 @@ --- -'svelte': minor +'svelte': patch --- -Do not defer unmounting of component +fix: do not defer unmounting of component From b4cacabb427c95d14f434f4ed74356167f7b9655 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 15 Aug 2025 15:23:02 -0400 Subject: [PATCH 4/5] add test --- .../dynamic-component-destroy-then-create/A.svelte | 8 ++++++++ .../dynamic-component-destroy-then-create/B.svelte | 8 ++++++++ .../_config.js | 13 +++++++++++++ .../main.svelte | 13 +++++++++++++ 4 files changed, 42 insertions(+) create mode 100644 packages/svelte/tests/runtime-runes/samples/dynamic-component-destroy-then-create/A.svelte create mode 100644 packages/svelte/tests/runtime-runes/samples/dynamic-component-destroy-then-create/B.svelte create mode 100644 packages/svelte/tests/runtime-runes/samples/dynamic-component-destroy-then-create/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/dynamic-component-destroy-then-create/main.svelte diff --git a/packages/svelte/tests/runtime-runes/samples/dynamic-component-destroy-then-create/A.svelte b/packages/svelte/tests/runtime-runes/samples/dynamic-component-destroy-then-create/A.svelte new file mode 100644 index 000000000000..e73551cc28e2 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/dynamic-component-destroy-then-create/A.svelte @@ -0,0 +1,8 @@ + + +

A

diff --git a/packages/svelte/tests/runtime-runes/samples/dynamic-component-destroy-then-create/B.svelte b/packages/svelte/tests/runtime-runes/samples/dynamic-component-destroy-then-create/B.svelte new file mode 100644 index 000000000000..459aa313c4cf --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/dynamic-component-destroy-then-create/B.svelte @@ -0,0 +1,8 @@ + + +

B

diff --git a/packages/svelte/tests/runtime-runes/samples/dynamic-component-destroy-then-create/_config.js b/packages/svelte/tests/runtime-runes/samples/dynamic-component-destroy-then-create/_config.js new file mode 100644 index 000000000000..e750c48a0001 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/dynamic-component-destroy-then-create/_config.js @@ -0,0 +1,13 @@ +import { test } from '../../test'; +import { flushSync } from 'svelte'; + +export default test({ + mode: ['client', 'hydrate'], + + async test({ assert, target, logs }) { + const [button] = target.querySelectorAll('button'); + + flushSync(() => button.click()); + assert.deepEqual(logs, ['create A', 'destroy A', 'create B']); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/dynamic-component-destroy-then-create/main.svelte b/packages/svelte/tests/runtime-runes/samples/dynamic-component-destroy-then-create/main.svelte new file mode 100644 index 000000000000..c9ef5430a40c --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/dynamic-component-destroy-then-create/main.svelte @@ -0,0 +1,13 @@ + + + + + From 4f5ac21524bdf67a627a91415395157332f6fc16 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 15 Aug 2025 15:23:33 -0400 Subject: [PATCH 5/5] update changeset --- .changeset/few-geese-itch.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/few-geese-itch.md b/.changeset/few-geese-itch.md index e1ec036c53de..737aa019116b 100644 --- a/.changeset/few-geese-itch.md +++ b/.changeset/few-geese-itch.md @@ -2,4 +2,4 @@ 'svelte': patch --- -fix: do not defer unmounting of component +fix: destroy dynamic component instance before creating new one