diff --git a/.changeset/lovely-houses-own.md b/.changeset/lovely-houses-own.md new file mode 100644 index 0000000000..d8de72b4a9 --- /dev/null +++ b/.changeset/lovely-houses-own.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: reliably remove undefined attributes during hydration diff --git a/.changeset/stale-fans-rest.md b/.changeset/stale-fans-rest.md new file mode 100644 index 0000000000..5e7f36b338 --- /dev/null +++ b/.changeset/stale-fans-rest.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +feat: shorter compiler output for attribute updates 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 1365cb25fb..6515fc9a16 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 @@ -519,13 +519,11 @@ function serialize_element_attribute_update_assignment(element, node_id, attribu b.thunk(singular) ) ), - grouped: b.stmt(b.call(is_svg ? '$.svg_class_name' : '$.class_name', node_id, singular)), - skip_condition: true + grouped: b.stmt(b.call(is_svg ? '$.svg_class_name' : '$.class_name', node_id, singular)) }; } return { - grouped: b.stmt(b.call(is_svg ? '$.svg_class_name' : '$.class_name', node_id, value)), - skip_condition: true + grouped: b.stmt(b.call(is_svg ? '$.svg_class_name' : '$.class_name', node_id, value)) }; } else if (!DOMProperties.includes(name)) { if (singular) { @@ -564,15 +562,12 @@ function serialize_element_attribute_update_assignment(element, node_id, attribu }; if (attribute.metadata.dynamic) { - const id = state.scope.generate(`${node_id.name}_${name}`); - serialize_update_assignment( - state, - id, - name === 'class' ? b.literal('') : undefined, - grouped_value, - assign(b.id(id), value), - contains_call_expression - ); + const { grouped, singular } = assign(grouped_value, value); + if (contains_call_expression && singular) { + state.init.push(singular); + } else { + state.update.push({ singular, grouped }); + } return true; } else { state.init.push(assign(grouped_value).grouped); diff --git a/packages/svelte/tests/hydration/samples/element-attribute-removed/_expected.html b/packages/svelte/tests/hydration/samples/element-attribute-removed/_expected.html index 59cd21e928..bbd534112d 100644 --- a/packages/svelte/tests/hydration/samples/element-attribute-removed/_expected.html +++ b/packages/svelte/tests/hydration/samples/element-attribute-removed/_expected.html @@ -1 +1 @@ -
+
diff --git a/packages/svelte/tests/hydration/samples/element-attribute-removed/main.svelte b/packages/svelte/tests/hydration/samples/element-attribute-removed/main.svelte index 959352e727..d5e18e5cb4 100644 --- a/packages/svelte/tests/hydration/samples/element-attribute-removed/main.svelte +++ b/packages/svelte/tests/hydration/samples/element-attribute-removed/main.svelte @@ -2,4 +2,11 @@ export let id; +
+ +{#if true} + +
+
+{/if} diff --git a/packages/svelte/tests/snapshot/samples/dynamic-attributes-casing/_expected/client/main.svelte.js b/packages/svelte/tests/snapshot/samples/dynamic-attributes-casing/_expected/client/main.svelte.js index 65aa3edd53..762abaceb6 100644 --- a/packages/svelte/tests/snapshot/samples/dynamic-attributes-casing/_expected/client/main.svelte.js +++ b/packages/svelte/tests/snapshot/samples/dynamic-attributes-casing/_expected/client/main.svelte.js @@ -13,9 +13,7 @@ export default function Main($$anchor, $$props) { let y = () => 'test'; var fragment = $.open_frag($$anchor, frag, false); var div = $.first_child(fragment); - var div_foobar; var svg = $.sibling($.sibling(div, true)); - var svg_viewBox; var custom_element = $.sibling($.sibling(svg, true)); var custom_element_fooBar; var div_1 = $.sibling($.sibling(custom_element, true)); @@ -31,13 +29,8 @@ export default function Main($$anchor, $$props) { $.set_custom_element_data_effect(custom_element_1, "fooBar", y); $.render_effect(() => { - if (div_foobar !== (div_foobar = x)) { - $.attr(div, "foobar", div_foobar); - } - - if (svg_viewBox !== (svg_viewBox = x)) { - $.attr(svg, "viewBox", svg_viewBox); - } + $.attr(div, "foobar", x); + $.attr(svg, "viewBox", x); if (custom_element_fooBar !== (custom_element_fooBar = x)) { $.set_custom_element_data(custom_element, "fooBar", custom_element_fooBar);