From 1ac643f1eecbbc7736a4124bb8ad31c865b07531 Mon Sep 17 00:00:00 2001 From: harshmandan Date: Sat, 16 Aug 2025 23:37:40 +0530 Subject: [PATCH 1/2] fix: prevent component pre-mounting in async boundaries --- .../client/dom/blocks/svelte-component.js | 38 ++++++++----------- 1 file changed, 15 insertions(+), 23 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 be6611c96d11..02b6b5337cc1 100644 --- a/packages/svelte/src/internal/client/dom/blocks/svelte-component.js +++ b/packages/svelte/src/internal/client/dom/blocks/svelte-component.js @@ -4,7 +4,7 @@ import { EFFECT_TRANSPARENT } from '#client/constants'; import { block, branch, pause_effect } from '../../reactivity/effects.js'; import { current_batch } from '../../reactivity/batch.js'; import { hydrate_next, hydrate_node, hydrating } from '../hydration.js'; -import { create_text, should_defer_append } from '../operations.js'; +import { should_defer_append } from '../operations.js'; /** * @template P @@ -27,19 +27,13 @@ export function component(node, get_component, render_fn) { /** @type {Effect | null} */ var effect; - /** @type {DocumentFragment | null} */ - var offscreen_fragment = null; - /** @type {Effect | null} */ var pending_effect = null; function commit() { - if (offscreen_fragment) { - // remove the anchor - /** @type {Text} */ (offscreen_fragment.lastChild).remove(); - - anchor.before(offscreen_fragment); - offscreen_fragment = null; + if (effect) { + pause_effect(effect); + effect = null; } effect = pending_effect; @@ -51,25 +45,23 @@ 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; - if (defer) { - offscreen_fragment = document.createDocumentFragment(); - offscreen_fragment.append((target = create_text())); if (effect) { /** @type {Batch} */ (current_batch).skipped_effects.add(effect); } + /** @type {Batch} */ (current_batch).add_callback(() => { + if (effect) { + pause_effect(effect); + effect = null; + } + effect = branch(() => render_fn(anchor, component)); + }); + } else { + pending_effect = branch(() => render_fn(anchor, component)); + commit(); } - pending_effect = branch(() => render_fn(target, component)); - } - - if (defer) { + } else if (defer) { /** @type {Batch} */ (current_batch).add_callback(commit); } else { commit(); From eebadcdd16f6fd712fb6c3c471ef2600088ab8d1 Mon Sep 17 00:00:00 2001 From: harshmandan Date: Sun, 17 Aug 2025 00:12:36 +0530 Subject: [PATCH 2/2] chore: add changeset --- .changeset/green-lies-smell.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/green-lies-smell.md diff --git a/.changeset/green-lies-smell.md b/.changeset/green-lies-smell.md new file mode 100644 index 000000000000..bc266fb6529a --- /dev/null +++ b/.changeset/green-lies-smell.md @@ -0,0 +1,5 @@ +--- +'svelte': minor +--- + +fix: prevent component pre-mounting in async boundaries