From dd221fc8d8699f96a08a690d1a6cce5dfda4dbff Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Mon, 9 Feb 2026 20:46:31 +0100 Subject: [PATCH] tweak --- .../3-transform/client/visitors/IfBlock.js | 8 +++++++- .../svelte/src/internal/client/dom/blocks/if.js | 16 +++++++++------- .../async-const/_expected/client/index.svelte.js | 4 +--- .../_expected/client/index.svelte.js | 4 +--- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/IfBlock.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/IfBlock.js index 36d782e9b4..c003b12c7f 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/IfBlock.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/IfBlock.js @@ -44,7 +44,13 @@ export function IfBlock(node, context) { // Wrap complex expressions (anything beyond a simple identifier) in $.derived() for memoization. // TODO check expression content more thoroughly to avoid wrapping for stuff like `foo > 1` or `foo.length` - if (branch.test.type !== 'Identifier') { + if ( + branch.test.type !== 'Identifier' && + branch.test.type !== 'Literal' && + (branch.test.type !== 'MemberExpression' || + // foo.bar is fine but foo[bar] is not + branch.metadata.expression.dependencies.size > 1) + ) { const derived_id = b.id(context.state.scope.generate('d')); statements.push(b.var(derived_id, b.call('$.derived', b.arrow([], expression)))); test = b.call('$.get', derived_id); diff --git a/packages/svelte/src/internal/client/dom/blocks/if.js b/packages/svelte/src/internal/client/dom/blocks/if.js index 78d77b1546..f2b1cf80a5 100644 --- a/packages/svelte/src/internal/client/dom/blocks/if.js +++ b/packages/svelte/src/internal/client/dom/blocks/if.js @@ -10,6 +10,7 @@ import { } from '../hydration.js'; import { block } from '../../reactivity/effects.js'; import { BranchManager } from './branches.js'; +import { HYDRATION_START, HYDRATION_START_ELSE } from '../../../../constants.js'; /** * @param {TemplateNode} node @@ -33,15 +34,16 @@ export function if_block(node, fn, elseif = false) { if (hydrating) { const data = read_hydration_instruction(node); - // Parse the hydration comment to determine which branch was server-rendered: - // "[" = branch 0, "[1" = branch 1, "[2" = branch 2, ..., "[!" = else (false) - /** @type {number | false} */ + /** + * @type {number | false} + * "[" = branch 0, "[1" = branch 1, "[2" = branch 2, ..., "[!" = else (false) + */ var hydrated_key; - if (data.length === 1) { - hydrated_key = 0; // "[" - } else if (data[1] === '!') { - hydrated_key = false; // "[!" + if (data === HYDRATION_START) { + hydrated_key = 0; + } else if (data === HYDRATION_START_ELSE) { + hydrated_key = false; } else { hydrated_key = parseInt(data.substring(1)); // "[1", "[2", etc. } diff --git a/packages/svelte/tests/snapshot/samples/async-const/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/async-const/_expected/client/index.svelte.js index 017d368eba..2cb402d43c 100644 --- a/packages/svelte/tests/snapshot/samples/async-const/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/async-const/_expected/client/index.svelte.js @@ -26,10 +26,8 @@ export default function Async_const($$anchor) { $.append($$anchor, p); }; - var d = $.derived(() => true); - $.if(node, ($$render) => { - if ($.get(d)) $$render(consequent, 0); + if (true) $$render(consequent, 0); }); } diff --git a/packages/svelte/tests/snapshot/samples/async-in-derived/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/async-in-derived/_expected/client/index.svelte.js index e0dbe18745..d691efb409 100644 --- a/packages/svelte/tests/snapshot/samples/async-in-derived/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/async-in-derived/_expected/client/index.svelte.js @@ -42,10 +42,8 @@ export default function Async_in_derived($$anchor, $$props) { ]); }; - var d = $.derived(() => true); - $.if(node, ($$render) => { - if ($.get(d)) $$render(consequent, 0); + if (true) $$render(consequent, 0); }); }