fix, tidy up

pull/12335/head
Rich Harris 2 years ago
parent 9a8001638b
commit eb9824e3d4

@ -11,13 +11,11 @@ import {
import {
hydrate_next,
hydrate_node,
hydrate_nodes,
hydrating,
set_hydrate_node,
set_hydrating
} from '../hydration.js';
import { clear_text_content, empty } from '../operations.js';
import { remove } from '../reconciler.js';
import {
block,
branch,

@ -1,13 +1,6 @@
/** @import { TemplateNode } from '#client' */
import { EFFECT_TRANSPARENT } from '../../constants.js';
import {
hydrate_next,
hydrate_node,
hydrate_nodes,
hydrating,
set_hydrating
} from '../hydration.js';
import { remove } from '../reconciler.js';
import { hydrate_next, hydrate_node, hydrating, set_hydrating } from '../hydration.js';
import { block, branch, pause_effect, resume_effect } from '../../reactivity/effects.js';
import { HYDRATION_START_ELSE } from '../../../../constants.js';
@ -53,7 +46,7 @@ export function if_block(
if (condition === is_else) {
// Hydration mismatch: remove everything inside the anchor and start fresh.
// This could happen with `{#if browser}...{/if}`, for example
remove(hydrate_nodes);
// remove(hydrate_nodes);
set_hydrating(false);
mismatch = true;
}

@ -1,4 +1,5 @@
import { hydrate_nodes, hydrating, set_hydrate_nodes } from '../hydration.js';
/** @import { TemplateNode } from '#client' */
import { hydrate_node, hydrating, set_hydrate_node } from '../hydration.js';
import { empty } from '../operations.js';
import { block } from '../../reactivity/effects.js';
import { HYDRATION_START } from '../../../../constants.js';
@ -14,34 +15,34 @@ export function reset_head_anchor() {
}
/**
* @param {(anchor: Node) => import('#client').Dom | void} render_fn
* @param {(anchor: Node) => void} render_fn
* @returns {void}
*/
export function head(render_fn) {
// The head function may be called after the first hydration pass and ssr comment nodes may still be present,
// therefore we need to skip that when we detect that we're not in hydration mode.
let previous_hydrate_nodes = null;
let previous_hydrate_node = null;
let was_hydrating = hydrating;
/** @type {Comment | Text} */
var anchor;
if (hydrating) {
previous_hydrate_nodes = hydrate_nodes;
previous_hydrate_node = hydrate_node;
// There might be multiple head blocks in our app, so we need to account for each one needing independent hydration.
if (head_anchor === undefined) {
head_anchor = /** @type {import('#client').TemplateNode} */ (document.head.firstChild);
head_anchor = /** @type {TemplateNode} */ (document.head.firstChild);
}
while (
head_anchor.nodeType !== 8 ||
/** @type {Comment} */ (head_anchor).data !== HYDRATION_START
) {
head_anchor = /** @type {import('#client').TemplateNode} */ (head_anchor.nextSibling);
head_anchor = /** @type {TemplateNode} */ (head_anchor.nextSibling);
}
head_anchor = /** @type {import('#client').TemplateNode} */ (head_anchor.nextSibling);
head_anchor = /** @type {TemplateNode} */ (head_anchor.nextSibling);
} else {
anchor = document.head.appendChild(empty());
}
@ -50,7 +51,7 @@ export function head(render_fn) {
block(() => render_fn(anchor), HEAD_EFFECT);
} finally {
if (was_hydrating) {
set_hydrate_nodes(/** @type {import('#client').TemplateNode[]} */ (previous_hydrate_nodes));
set_hydrate_node(/** @type {TemplateNode} */ (previous_hydrate_node));
}
}
}

@ -1,5 +1,4 @@
/** @import { TemplateNode } from '#client' */
import { HYDRATION_START } from '../../../constants.js';
/**
* Use this variable to guard everything related to hydration code so it can be treeshaken out
@ -20,39 +19,6 @@ export function set_hydrate_node(node) {
return (hydrate_node = node);
}
/**
* Array of nodes to traverse for hydration. This will be null if we're not hydrating, but for
* the sake of simplicity we're not going to use `null` checks everywhere and instead rely on
* the `hydrating` flag to tell whether or not we're in hydration mode at which point this is set.
* @type {import('#client').TemplateNode[]}
*/
export let hydrate_nodes = /** @type {any} */ (null);
/** @type {import('#client').TemplateNode} */
export let hydrate_start;
/** @param {import('#client').TemplateNode[]} nodes */
export function set_hydrate_nodes(nodes) {
throw new Error('TODO');
}
/**
* When assigning nodes to an effect during hydration, we typically want the hydration boundary comment node
* immediately before `hydrate_start`. In some cases, this comment doesn't exist because we optimized it away.
* TODO it might be worth storing this value separately rather than retrieving it with `previousSibling`
*/
export function get_start() {
return hydrate_node;
}
/**
*
* @param {TemplateNode} node
*/
export function hydrate_anchor(node) {
return node;
}
export function hydrate_next() {
hydrate_node = /** @type {TemplateNode} */ (hydrate_node.nextSibling);
return hydrate_node;

@ -1,11 +1,5 @@
/** @import { Effect, TemplateNode } from '#client' */
import {
hydrate_anchor,
hydrate_next,
hydrate_node,
hydrating,
set_hydrate_node
} from './hydration.js';
import { hydrate_node, hydrating, set_hydrate_node } from './hydration.js';
import { DEV } from 'esm-env';
import { init_array_prototype_warnings } from '../dev/equality.js';
import { current_effect } from '../runtime.js';
@ -152,7 +146,7 @@ export function sibling(node, is_text = false) {
}
set_hydrate_node(next_sibling);
return hydrate_anchor(/** @type {TemplateNode} */ (next_sibling));
return /** @type {TemplateNode} */ (next_sibling);
}
/**

@ -1,24 +1,6 @@
import { is_array } from '../utils.js';
/** @param {string} html */
export function create_fragment_from_html(html) {
var elem = document.createElement('template');
elem.innerHTML = html;
return elem.content;
}
/**
* @param {import('#client').Dom} current
*/
export function remove(current) {
if (is_array(current)) {
for (var i = 0; i < current.length; i++) {
var node = current[i];
if (node.isConnected) {
node.remove();
}
}
} else if (current.isConnected) {
current.remove();
}
}

@ -107,7 +107,7 @@ export function ns_template(content, flags, ns = 'svg') {
return () => {
if (hydrating) {
assign_nodes(get_start(), null);
assign_nodes(hydrate_node, null);
return hydrate_node;
}
@ -223,8 +223,7 @@ export function text(anchored) {
// console.log('text', { hydrate_node });
if (node.nodeType !== 3) {
// if an {expression} is empty during SSR, `hydrate_nodes` will be empty.
// we need to insert an empty text node
// if an {expression} is empty during SSR, we need to insert an empty text node
node.before((node = empty()));
set_hydrate_node(node);
}
@ -240,8 +239,7 @@ export function text(anchored) {
export function comment() {
// we're not delegating to `template` here for performance reasons
if (hydrating) {
assign_nodes(get_start(), null);
assign_nodes(hydrate_node, null);
return hydrate_node;
}

@ -3,14 +3,7 @@ import { clear_text_content, empty, init_operations } from './dom/operations.js'
import { HYDRATION_ERROR, HYDRATION_START, PassiveDelegatedEvents } from '../../constants.js';
import { flush_sync, push, pop, current_component_context } from './runtime.js';
import { effect_root, branch } from './reactivity/effects.js';
import {
hydrate_next,
hydrate_nodes,
hydrating,
set_hydrate_node,
set_hydrate_nodes,
set_hydrating
} from './dom/hydration.js';
import { hydrate_next, hydrating, set_hydrate_node, set_hydrating } from './dom/hydration.js';
import { array_from } from './utils.js';
import { handle_event_propagation } from './dom/elements/events.js';
import { reset_head_anchor } from './dom/blocks/svelte-head.js';
@ -133,7 +126,6 @@ export function hydrate(component, options) {
}
const target = options.target;
const previous_hydrate_nodes = hydrate_nodes;
const was_hydrating = hydrating;
try {

Loading…
Cancel
Save