From 359413f5122bf866175e516141515c5387ad7743 Mon Sep 17 00:00:00 2001 From: Mathias Picker <48158184+MathiasWP@users.noreply.github.com> Date: Tue, 25 Aug 2026 11:47:17 +0200 Subject: [PATCH] perf: treat `` as a static element again (#18711) Emits less code and skips two live DOM traversals per instance. `is_static_element` treats `` with a `loading` attribute as non-static. That was added in #14237 so `RegularElement` could emit `$.handle_lazy_img(node_id)`, which needed a reference to the element. #15272 deleted `handle_lazy_img` (replaced by `importNode`) and removed the call site, but left this check behind. --------- Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --- .changeset/tidy-owls-repeat.md | 5 +++++ .../phases/3-transform/client/visitors/shared/fragment.js | 5 ----- .../skip-static-subtree/_expected/client/index.svelte.js | 5 +---- 3 files changed, 6 insertions(+), 9 deletions(-) create mode 100644 .changeset/tidy-owls-repeat.md diff --git a/.changeset/tidy-owls-repeat.md b/.changeset/tidy-owls-repeat.md new file mode 100644 index 0000000000..2ef02e2051 --- /dev/null +++ b/.changeset/tidy-owls-repeat.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +perf: treat `` as a static element again diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/fragment.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/fragment.js index 38346e64b2..72104481ec 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/fragment.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/fragment.js @@ -171,11 +171,6 @@ export function is_static_element(node) { return false; } - // We need to apply src and loading after appending the img to the DOM for lazy loading to work - if (node.name === 'img' && attribute.name === 'loading') { - return false; - } - if (attribute.value !== true && !is_text_attribute(attribute)) { return false; } diff --git a/packages/svelte/tests/snapshot/samples/skip-static-subtree/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/skip-static-subtree/_expected/client/index.svelte.js index 78147659ff..85f7601bd7 100644 --- a/packages/svelte/tests/snapshot/samples/skip-static-subtree/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/skip-static-subtree/_expected/client/index.svelte.js @@ -40,10 +40,7 @@ export default function Skip_static_subtree($$anchor, $$props) { option.value = option.__value = 'a'; $.reset(select); - - var img = $.sibling(select, 2); - - $.next(2); + $.next(4); $.template_effect(() => $.set_text(text, $$props.title)); $.append($$anchor, fragment); } \ No newline at end of file