From f1d9afe32f84ffd138ab2a67906b30305cd3e4e7 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 24 Mar 2024 18:03:56 -0400 Subject: [PATCH] changeset (#10906) --- .changeset/many-rockets-give.md | 5 +++++ .../3-transform/client/visitors/template.js | 19 ++++++++++++------- .../src/internal/client/dom/blocks/if.js | 10 ++++++++-- 3 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 .changeset/many-rockets-give.md diff --git a/.changeset/many-rockets-give.md b/.changeset/many-rockets-give.md new file mode 100644 index 0000000000..b26d8ef64f --- /dev/null +++ b/.changeset/many-rockets-give.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +feat: more efficient if block compiler output diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js index 7c783c6f9e..873fa44a70 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js @@ -2573,15 +2573,20 @@ export const template_visitors = { const args = [ context.state.node, b.thunk(/** @type {import('estree').Expression} */ (context.visit(node.test))), - b.arrow([b.id('$$anchor')], consequent), - node.alternate - ? b.arrow( - [b.id('$$anchor')], - /** @type {import('estree').BlockStatement} */ (context.visit(node.alternate)) - ) - : b.literal(null) + b.arrow([b.id('$$anchor')], consequent) ]; + if (node.alternate || node.elseif) { + args.push( + node.alternate + ? b.arrow( + [b.id('$$anchor')], + /** @type {import('estree').BlockStatement} */ (context.visit(node.alternate)) + ) + : b.literal(null) + ); + } + if (node.elseif) { // We treat this... // diff --git a/packages/svelte/src/internal/client/dom/blocks/if.js b/packages/svelte/src/internal/client/dom/blocks/if.js index 84b294ccbb..dde4de4dbc 100644 --- a/packages/svelte/src/internal/client/dom/blocks/if.js +++ b/packages/svelte/src/internal/client/dom/blocks/if.js @@ -12,11 +12,17 @@ import { * @param {Comment} anchor * @param {() => boolean} get_condition * @param {(anchor: Node) => import('#client').Dom} consequent_fn - * @param {null | ((anchor: Node) => import('#client').Dom)} alternate_fn + * @param {null | ((anchor: Node) => import('#client').Dom)} [alternate_fn] * @param {boolean} [elseif] True if this is an `{:else if ...}` block rather than an `{#if ...}`, as that affects which transitions are considered 'local' * @returns {void} */ -export function if_block(anchor, get_condition, consequent_fn, alternate_fn, elseif = false) { +export function if_block( + anchor, + get_condition, + consequent_fn, + alternate_fn = null, + elseif = false +) { hydrate_block_anchor(anchor); /** @type {import('#client').Effect | null} */