Skip to content

Commit a226094

Browse files
authored
chore: replace hydrate_nodes[0] with hydrate_start where possible (#11758)
* manipulate effect.dom rather than hydrate_nodes * use hydrate_start instead of hydrate_nodes where possible * tidy up
1 parent 196d7e4 commit a226094

File tree

6 files changed

+38
-23
lines changed

6 files changed

+38
-23
lines changed

packages/svelte/src/internal/client/dom/blocks/css-props.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { namespace_svg } from '../../../../constants.js';
2-
import { hydrate_anchor, hydrate_nodes, hydrating } from '../hydration.js';
2+
import { hydrate_anchor, hydrate_start, hydrating } from '../hydration.js';
33
import { empty } from '../operations.js';
44
import { render_effect } from '../../reactivity/effects.js';
55

@@ -19,7 +19,7 @@ export function css_props(anchor, is_html, props, component) {
1919

2020
if (hydrating) {
2121
// Hydration: css props element is surrounded by a ssr comment ...
22-
element = /** @type {HTMLElement | SVGElement} */ (hydrate_nodes[0]);
22+
element = /** @type {HTMLElement | SVGElement} */ (hydrate_start);
2323
// ... and the child(ren) of the css props element is also surround by a ssr comment
2424
component_anchor = /** @type {Comment} */ (
2525
hydrate_anchor(/** @type {Comment} */ (element.firstChild))

packages/svelte/src/internal/client/dom/blocks/each.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@ import {
88
HYDRATION_END_ELSE,
99
HYDRATION_START
1010
} from '../../../../constants.js';
11-
import { hydrate_anchor, hydrate_nodes, hydrating, set_hydrating } from '../hydration.js';
11+
import {
12+
hydrate_anchor,
13+
hydrate_nodes,
14+
hydrate_start,
15+
hydrating,
16+
set_hydrating
17+
} from '../hydration.js';
1218
import { clear_text_content, empty } from '../operations.js';
1319
import { remove } from '../reconciler.js';
1420
import { untrack } from '../../runtime.js';
@@ -148,7 +154,7 @@ export function each(anchor, flags, get_collection, get_key, render_fn, fallback
148154
// this is separate to the previous block because `hydrating` might change
149155
if (hydrating) {
150156
/** @type {Node} */
151-
var child_anchor = hydrate_nodes[0];
157+
var child_anchor = hydrate_start;
152158

153159
/** @type {import('#client').EachItem | import('#client').EachState} */
154160
var prev = state;

packages/svelte/src/internal/client/dom/blocks/svelte-element.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { namespace_svg } from '../../../../constants.js';
2-
import { hydrate_anchor, hydrate_nodes, hydrating, set_hydrate_nodes } from '../hydration.js';
2+
import { hydrate_anchor, hydrate_start, hydrating, set_hydrate_nodes } from '../hydration.js';
33
import { empty } from '../operations.js';
44
import {
55
block,
@@ -79,7 +79,7 @@ export function element(anchor, get_tag, is_svg, render_fn, get_namespace, locat
7979
if (next_tag && next_tag !== current_tag) {
8080
effect = branch(() => {
8181
element = hydrating
82-
? /** @type {Element} */ (hydrate_nodes[0])
82+
? /** @type {Element} */ (hydrate_start)
8383
: ns
8484
? document.createElementNS(ns, next_tag)
8585
: document.createElement(next_tag);

packages/svelte/src/internal/client/dom/hydration.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,13 @@ export function set_hydrating(value) {
2121
*/
2222
export let hydrate_nodes = /** @type {any} */ (null);
2323

24+
/** @type {import('#client').TemplateNode} */
25+
export let hydrate_start;
26+
2427
/** @param {import('#client').TemplateNode[]} nodes */
2528
export function set_hydrate_nodes(nodes) {
2629
hydrate_nodes = nodes;
30+
hydrate_start = nodes && nodes[0];
2731
}
2832

2933
/**
@@ -58,6 +62,7 @@ export function hydrate_anchor(node) {
5862
} else if (data[0] === HYDRATION_END) {
5963
if (depth === 0) {
6064
hydrate_nodes = /** @type {import('#client').TemplateNode[]} */ (nodes);
65+
hydrate_start = /** @type {import('#client').TemplateNode} */ (nodes[0]);
6166
return current;
6267
}
6368

packages/svelte/src/internal/client/dom/operations.js

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { hydrate_anchor, hydrate_nodes, hydrating } from './hydration.js';
1+
import { hydrate_anchor, hydrating } from './hydration.js';
22
import { DEV } from 'esm-env';
33
import { init_array_prototype_warnings } from '../dev/equality.js';
4+
import { current_effect } from '../runtime.js';
45

56
// We cache the Node and Element prototype methods, so that we can avoid doing
67
// expensive prototype chain lookups.
@@ -96,14 +97,19 @@ export function first_child(fragment, is_text) {
9697
}
9798

9899
// when we _are_ hydrating, `fragment` is an array of nodes
99-
const first_node = /** @type {import('#client').TemplateNode[]} */ (fragment)[0];
100+
var first_node = /** @type {import('#client').TemplateNode[]} */ (fragment)[0];
100101

101102
// if an {expression} is empty during SSR, there might be no
102103
// text node to hydrate — we must therefore create one
103104
if (is_text && first_node?.nodeType !== 3) {
104-
const text = empty();
105-
hydrate_nodes.unshift(text);
105+
var text = empty();
106+
var dom = /** @type {import('#client').TemplateNode[]} */ (
107+
/** @type {import('#client').Effect} */ (current_effect).dom
108+
);
109+
110+
dom.unshift(text);
106111
first_node?.before(text);
112+
107113
return text;
108114
}
109115

@@ -127,14 +133,13 @@ export function sibling(node, is_text = false) {
127133
// if a sibling {expression} is empty during SSR, there might be no
128134
// text node to hydrate — we must therefore create one
129135
if (is_text && next_sibling?.nodeType !== 3) {
130-
const text = empty();
131-
if (next_sibling) {
132-
const index = hydrate_nodes.indexOf(/** @type {Text | Comment | Element} */ (next_sibling));
133-
hydrate_nodes.splice(index, 0, text);
134-
next_sibling.before(text);
135-
} else {
136-
hydrate_nodes.push(text);
137-
}
136+
var text = empty();
137+
var dom = /** @type {import('#client').TemplateNode[]} */ (
138+
/** @type {import('#client').Effect} */ (current_effect).dom
139+
);
140+
141+
dom.unshift(text);
142+
next_sibling?.before(text);
138143

139144
return text;
140145
}

packages/svelte/src/internal/client/dom/template.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
import { hydrate_nodes, hydrating } from './hydration.js';
1+
import { hydrate_nodes, hydrate_start, hydrating } from './hydration.js';
22
import { empty } from './operations.js';
33
import { create_fragment_from_html } from './reconciler.js';
44
import { current_effect } from '../runtime.js';
55
import { TEMPLATE_FRAGMENT, TEMPLATE_USE_IMPORT_NODE } from '../../../constants.js';
66
import { effect } from '../reactivity/effects.js';
7-
import { is_array } from '../utils.js';
87

98
/**
109
* @template {import("#client").TemplateNode | import("#client").TemplateNode[]} T
@@ -36,7 +35,7 @@ export function template(content, flags) {
3635

3736
return () => {
3837
if (hydrating) {
39-
return push_template_node(is_fragment ? hydrate_nodes : hydrate_nodes[0]);
38+
return push_template_node(is_fragment ? hydrate_nodes : hydrate_start);
4039
}
4140

4241
if (!node) {
@@ -88,7 +87,7 @@ export function ns_template(content, flags, ns = 'svg') {
8887

8988
return () => {
9089
if (hydrating) {
91-
return push_template_node(is_fragment ? hydrate_nodes : hydrate_nodes[0]);
90+
return push_template_node(is_fragment ? hydrate_nodes : hydrate_start);
9291
}
9392

9493
if (!node) {
@@ -181,7 +180,7 @@ function run_scripts(node) {
181180
export function text(anchor) {
182181
if (!hydrating) return empty();
183182

184-
var node = hydrate_nodes[0];
183+
var node = hydrate_start;
185184

186185
if (!node) {
187186
// if an {expression} is empty during SSR, `hydrate_nodes` will be empty.

0 commit comments

Comments
 (0)