Skip to content

Commit 9c64066

Browse files
committed
fix: ensure tree-shaken if blocks correctly hydrate
1 parent ad87572 commit 9c64066

File tree

5 files changed

+21
-11
lines changed

5 files changed

+21
-11
lines changed

.changeset/fast-eyes-hear.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: ensure tree-shaken if blocks correctly hydrate

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
hydrate_node,
1818
hydrating,
1919
next,
20-
remove_nodes,
20+
traverse_nodes,
2121
set_hydrate_node
2222
} from '../hydration.js';
2323
import { queue_micro_task } from '../task.js';
@@ -92,7 +92,7 @@ export function boundary(node, props, boundary_fn) {
9292
} else if (hydrating) {
9393
set_hydrate_node(hydrate_open);
9494
next();
95-
set_hydrate_node(remove_nodes());
95+
set_hydrate_node(traverse_nodes(true));
9696
}
9797

9898
if (failed) {

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
hydrate_next,
1313
hydrate_node,
1414
hydrating,
15-
remove_nodes,
15+
traverse_nodes,
1616
set_hydrate_node,
1717
set_hydrating
1818
} from '../hydration.js';
@@ -160,7 +160,7 @@ export function each(node, flags, get_collection, get_key, render_fn, fallback_f
160160

161161
if (is_else !== (length === 0)) {
162162
// hydration mismatch — remove the server-rendered DOM and start over
163-
anchor = remove_nodes();
163+
anchor = traverse_nodes(true);
164164

165165
set_hydrate_node(anchor);
166166
set_hydrating(false);
@@ -199,7 +199,7 @@ export function each(node, flags, get_collection, get_key, render_fn, fallback_f
199199

200200
// remove excess nodes
201201
if (length > 0) {
202-
set_hydrate_node(remove_nodes());
202+
set_hydrate_node(traverse_nodes(true));
203203
}
204204
}
205205

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import {
44
hydrate_next,
55
hydrate_node,
66
hydrating,
7-
remove_nodes,
87
set_hydrate_node,
9-
set_hydrating
8+
set_hydrating,
9+
traverse_nodes
1010
} from '../hydration.js';
1111
import { block, branch, pause_effect, resume_effect } from '../../reactivity/effects.js';
1212
import { HYDRATION_START_ELSE } from '../../../../constants.js';
@@ -46,7 +46,7 @@ export function if_block(node, fn, elseif = false) {
4646
/** @type {boolean | null} */ new_condition,
4747
/** @type {null | ((anchor: Node) => void)} */ fn
4848
) => {
49-
if (condition === (condition = new_condition)) return;
49+
if (condition === (condition = new_condition) && !hydrating) return;
5050

5151
/** Whether or not there was a hydration mismatch. Needs to be a `let` or else it isn't treeshaken out */
5252
let mismatch = false;
@@ -57,11 +57,14 @@ export function if_block(node, fn, elseif = false) {
5757
if (condition === is_else) {
5858
// Hydration mismatch: remove everything inside the anchor and start fresh.
5959
// This could happen with `{#if browser}...{/if}`, for example
60-
anchor = remove_nodes();
60+
anchor = traverse_nodes(true);
6161

6262
set_hydrate_node(anchor);
6363
set_hydrating(false);
6464
mismatch = true;
65+
} else if (!fn) {
66+
anchor = traverse_nodes();
67+
set_hydrate_node(anchor);
6568
}
6669
}
6770

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ export function next(count = 1) {
8282
/**
8383
* Removes all nodes starting at `hydrate_node` up until the next hydration end comment
8484
*/
85-
export function remove_nodes() {
85+
export function traverse_nodes(remove = false) {
8686
var depth = 0;
8787
var node = hydrate_node;
8888

@@ -99,7 +99,9 @@ export function remove_nodes() {
9999
}
100100

101101
var next = /** @type {TemplateNode} */ (get_next_sibling(node));
102-
node.remove();
102+
if (remove) {
103+
node.remove();
104+
}
103105
node = next;
104106
}
105107
}

0 commit comments

Comments
 (0)