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