From 8e280992f0bf7f90cb656f054ab04a665739c1ae Mon Sep 17 00:00:00 2001 From: floriskn <48930050+floriskn@users.noreply.github.com> Date: Mon, 16 Jun 2025 11:52:48 +0200 Subject: [PATCH 1/4] fix: ensure undefined attributes are removed during hydration Attributes that are `undefined` on the client should be removed during hydration, even if their value hasn't changed compared to `prev_value`. --- .../svelte/src/internal/client/dom/elements/attributes.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/svelte/src/internal/client/dom/elements/attributes.js b/packages/svelte/src/internal/client/dom/elements/attributes.js index fcce0b444f49..e61f9b5679ec 100644 --- a/packages/svelte/src/internal/client/dom/elements/attributes.js +++ b/packages/svelte/src/internal/client/dom/elements/attributes.js @@ -345,7 +345,11 @@ export function set_attributes(element, prev, next, css_hash, skip_warning = fal } var prev_value = current[key]; - if (value === prev_value) continue; + + // Skip if value is unchanged, unless it's `undefined` and the element still has the attribute + if (value === prev_value && !(value === undefined && element.hasAttribute(key))) { + continue; + } current[key] = value; From b58169da8b359433b71e3210bee39add32bc7526 Mon Sep 17 00:00:00 2001 From: floriskn <48930050+floriskn@users.noreply.github.com> Date: Mon, 16 Jun 2025 11:59:09 +0200 Subject: [PATCH 2/4] Create plenty-wasps-sleep.md --- .changeset/plenty-wasps-sleep.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .changeset/plenty-wasps-sleep.md diff --git a/.changeset/plenty-wasps-sleep.md b/.changeset/plenty-wasps-sleep.md new file mode 100644 index 000000000000..446bf4653bb2 --- /dev/null +++ b/.changeset/plenty-wasps-sleep.md @@ -0,0 +1,10 @@ +--- +'svelte': patch +--- + +fix: ensure undefined attributes are removed during hydration + +Attributes set server-side but undefined on the client should be removed during hydration. +This ensures expected cleanup behavior and resolves a mismatch between SSR and client-side rendering. + +Fixes sveltejs/kit#13890 From 3fc29e1e3ea8865bb7898b0671c6e4d469b52d54 Mon Sep 17 00:00:00 2001 From: floriskn <48930050+floriskn@users.noreply.github.com> Date: Mon, 16 Jun 2025 16:27:42 +0200 Subject: [PATCH 3/4] added test --- .../samples/removes-undefined-attributes/_config.js | 11 +++++++++++ .../removes-undefined-attributes/_expected.html | 1 + .../samples/removes-undefined-attributes/main.svelte | 9 +++++++++ 3 files changed, 21 insertions(+) create mode 100644 packages/svelte/tests/hydration/samples/removes-undefined-attributes/_config.js create mode 100644 packages/svelte/tests/hydration/samples/removes-undefined-attributes/_expected.html create mode 100644 packages/svelte/tests/hydration/samples/removes-undefined-attributes/main.svelte diff --git a/packages/svelte/tests/hydration/samples/removes-undefined-attributes/_config.js b/packages/svelte/tests/hydration/samples/removes-undefined-attributes/_config.js new file mode 100644 index 000000000000..bc74f23aac60 --- /dev/null +++ b/packages/svelte/tests/hydration/samples/removes-undefined-attributes/_config.js @@ -0,0 +1,11 @@ +import { test } from '../../test'; + +export default test({ + server_props: { + browser: false + }, + + props: { + browser: true + } +}); diff --git a/packages/svelte/tests/hydration/samples/removes-undefined-attributes/_expected.html b/packages/svelte/tests/hydration/samples/removes-undefined-attributes/_expected.html new file mode 100644 index 000000000000..cc789c8f5142 --- /dev/null +++ b/packages/svelte/tests/hydration/samples/removes-undefined-attributes/_expected.html @@ -0,0 +1 @@ +
diff --git a/packages/svelte/tests/hydration/samples/removes-undefined-attributes/main.svelte b/packages/svelte/tests/hydration/samples/removes-undefined-attributes/main.svelte new file mode 100644 index 000000000000..1a587eeeebc0 --- /dev/null +++ b/packages/svelte/tests/hydration/samples/removes-undefined-attributes/main.svelte @@ -0,0 +1,9 @@ + + +
From 574def131957c4358e85917771405bfaef5b6ab9 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 17 Jun 2025 12:46:40 -0400 Subject: [PATCH 4/4] Update .changeset/plenty-wasps-sleep.md --- .changeset/plenty-wasps-sleep.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.changeset/plenty-wasps-sleep.md b/.changeset/plenty-wasps-sleep.md index 446bf4653bb2..aba96bc419b0 100644 --- a/.changeset/plenty-wasps-sleep.md +++ b/.changeset/plenty-wasps-sleep.md @@ -2,9 +2,4 @@ 'svelte': patch --- -fix: ensure undefined attributes are removed during hydration - -Attributes set server-side but undefined on the client should be removed during hydration. -This ensures expected cleanup behavior and resolves a mismatch between SSR and client-side rendering. - -Fixes sveltejs/kit#13890 +fix: remove undefined attributes on hydration