2.0: <A> click before hydration settles renders root <Loading> fallback mid-hydration and leaves the page unresponsive
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 50/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Activo
- Stack tecnológico
- playwright, typescript, vite
- Área
- frontend, testing-qa
Línea de trabajo
Start with the App.tsx root Loading boundary and the deferred data patterns in routes/index.tsx and routes/insureds.tsx. Reproduce an immediate Playwright click before the root onSettled flag, then trace the router navigation and hydration behavior. Done means the early click no longer produces hydration-key-miss warnings, duplicate DOM, or an unresponsive page.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Describe the bug
With SSR and a root <Loading> boundary, a click on an <A> link that lands before hydration has settled is taken by the router, which starts a client-side navigation. The next route's data is not ready yet, so the root <Loading> fallback is rendered while the page is still hydrating. Hydration then fails to claim the server's DOM, and the page stops responding: the server-rendered content stays on screen, but no further clicks do anything.
Console output when it happens:
Hydration key miss for "170110": no server-rendered element carries this key (template: <main>Loading…). A detached element was created instead; its subtree will not appear in the document or become interactive.
Hydration completed with 8 unclaimed server-rendered node(s): <main ...>
In the DOM, the page is drawn twice: the unclaimed server-rendered <main> and a second client-rendered copy.
Your Example Website or App
No public repro, sorry: it is a private app. The relevant shape is small, though:
// App.tsx
export default function App() {
return (
<Router>
{(props) => (
<Loading fallback={<main>Loading…</main>}>
{props.children}
</Loading>
)}
</Router>
);
}
// routes/index.tsx: data read with deferStream
const landing = createMemo(() => getLanding(), { deferStream: true }); // getLanding = query(..., "landing")
// ...renders <A href="/insureds">Insureds</A>
// routes/insureds.tsx: its own query + deferStream, same pattern
Steps to Reproduce the Bug or Issue
- Server-render a page like the above (SSR, streaming, dev server).
- As soon as the server's content is visible, before hydration has settled, click an
<A>link to another route whose data is not cached. - The target route's data is fetched, the root
<Loading>fallback renders mid-hydration, and the hydration-key-miss warnings above appear. - The page no longer responds to clicks.
Driving this with Playwright (sign in, then click the link immediately when the heading is visible, with no wait), about 1 in 4 runs fail. If the test first waits for a flag set in onSettled at the root, it passes 40 out of 40.
Expected behavior
A click that arrives before hydration settles should not break hydration. For example, the router could ignore or queue it until hydration settles, or fall back to a normal full-page navigation.
Screenshots or Videos
No response
Platform
- OS: Linux (Arch, kernel 7.2)
- Browser: Chromium, via Playwright 1.63 (headless)
- Version:
@solidjs/router2.0.0-next.26,solid-js/@solidjs/web2.0.0-rc.9,@solidjs/vite-plugin3.0.0-next.44, Vite 8.3, Node 26
Additional context
- I could not check the latest (
@solidjs/router2.0.0-next.30 +solid-js2.0.0-rc.10): after upgrading, the app failed to load a route module (Failed to fetch dynamically imported module .../src/routes/index.tsx?pick=default&pick=$css), unrelated to this bug, so I could not run the repro there. - Possibly related, but a different trigger: solidjs/solid#3610 (hydrate starting before the records script).
- Workaround we use in tests: set an attribute on
<html>fromonSettledin a component inside the root<Loading>, and wait for it before interacting after each full page load.
- Lenguaje dominante
- TypeScript
- Estrellas
- 1.3k
- Forks
- 180
- Merge medio
- 1 d 4 h
- PR fusionados (30 d)
- 27
Preparar el entorno
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de solidjs/solid-router
-
Query enumeration recomputes on pathname/hash-only navigation with unchanged search (Solid 2)Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 74/100
solidjs/solid-router#624 ·
Los mantenedores suelen responder en 1 día
-
<A> costs ~6us of server CPU per instance during SSR (20x a plain <a>), mostly mergeProps/splitPropsAbierto
Dificultad 4/5 3-5 días Aptitud para principiantes 55/100
solidjs/solid-router#583 ·
Los mantenedores suelen responder en 1 día
-
enhancement
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
solidjs/solid-router#569 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
enhancement
Dificultad 3/5 1-2 días Aptitud para principiantes 38/100
solidjs/solid-router#518 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
enhancement
Dificultad 3/5 1-2 días Aptitud para principiantes 64/100
solidjs/solid-router#502 · 4 comentarios ·
Los mantenedores suelen responder en 1 día
Todos los issues de solidjs/solid-router
Issues similares
-
triage
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
mermaid-js/mermaid-live-editor#2053 ·
Los mantenedores suelen responder en 1 día
-
factory
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
jessepollak/home#1455 ·
Los mantenedores suelen responder en 1 día
-
community first-timers-only good first issue hacktoberfest help wanted low hanging fruit up-for-grabs
Dificultad 1/5 Menos de una hora Aptitud para principiantes 95/100
lingdojo/kana-dojo#31227 · 1 comentario · 5 reacciones ·
Los mantenedores suelen responder en 1 día
-
mobile: device viewer shows dark status bar icons on its dark backdrop in light mode (Android)Abierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 92/100
appandflow/stim#1838 ·
Los mantenedores suelen responder en 1 día