From ce5d53e0b3ea0fa5c83bad5dcc5e6c39c2451b62 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 27 Jun 2024 13:59:16 -0400 Subject: [PATCH] use hydration marker as effect boundary where possible --- packages/svelte/src/internal/client/dom/blocks/html.js | 7 +++++-- packages/svelte/src/internal/client/dom/blocks/if.js | 1 - packages/svelte/src/internal/client/dom/template.js | 9 ++++++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/svelte/src/internal/client/dom/blocks/html.js b/packages/svelte/src/internal/client/dom/blocks/html.js index 9c6c8b8e9a..0e4f77f65e 100644 --- a/packages/svelte/src/internal/client/dom/blocks/html.js +++ b/packages/svelte/src/internal/client/dom/blocks/html.js @@ -2,7 +2,7 @@ import { derived } from '../../reactivity/deriveds.js'; import { block, branch, destroy_effect, render_effect } from '../../reactivity/effects.js'; import { get } from '../../runtime.js'; import { is_array } from '../../utils.js'; -import { hydrate_nodes, hydrating } from '../hydration.js'; +import { hydrate_nodes, hydrate_start, hydrating } from '../hydration.js'; import { create_fragment_from_html, remove } from '../reconciler.js'; import { assign_nodes } from '../template.js'; @@ -31,7 +31,10 @@ export function html(anchor, get_value, svg, mathml) { effect = branch(() => { if (hydrating) { - assign_nodes(hydrate_nodes[0], hydrate_nodes[hydrate_nodes.length - 1]); + assign_nodes( + hydrate_start.previousSibling ?? hydrate_start, + hydrate_nodes[hydrate_nodes.length - 1] + ); return; } diff --git a/packages/svelte/src/internal/client/dom/blocks/if.js b/packages/svelte/src/internal/client/dom/blocks/if.js index 7c1897d187..9ad208fe2f 100644 --- a/packages/svelte/src/internal/client/dom/blocks/if.js +++ b/packages/svelte/src/internal/client/dom/blocks/if.js @@ -3,7 +3,6 @@ import { hydrate_nodes, hydrating, set_hydrating } from '../hydration.js'; import { remove } from '../reconciler.js'; import { block, branch, pause_effect, resume_effect } from '../../reactivity/effects.js'; import { HYDRATION_END_ELSE } from '../../../../constants.js'; -import { assign_nodes } from '../template.js'; /** * @param {Comment} anchor diff --git a/packages/svelte/src/internal/client/dom/template.js b/packages/svelte/src/internal/client/dom/template.js index 7d95e0a16c..36110d25eb 100644 --- a/packages/svelte/src/internal/client/dom/template.js +++ b/packages/svelte/src/internal/client/dom/template.js @@ -45,7 +45,7 @@ export function template(content, flags) { return () => { if (hydrating) { assign_nodes( - has_start ? hydrate_start : unset ? undefined : null, + hydrate_start.previousSibling ?? hydrate_start, hydrate_nodes[hydrate_nodes.length - 1] ); @@ -117,7 +117,10 @@ export function ns_template(content, flags, ns = 'svg') { return () => { if (hydrating) { - assign_nodes(has_start ? hydrate_start : null, hydrate_nodes[hydrate_nodes.length - 1]); + assign_nodes( + hydrate_start.previousSibling ?? hydrate_start, + hydrate_nodes[hydrate_nodes.length - 1] + ); return hydrate_start; } @@ -248,7 +251,7 @@ export function comment(flags = 0) { // we're not delegating to `template` here for performance reasons if (hydrating) { assign_nodes( - (flags & TEMPLATE_UNSET_START) !== 0 ? undefined : null, + hydrate_start.previousSibling ?? hydrate_start, hydrate_nodes[hydrate_nodes.length - 1] );