2.0: <A> click before hydration settles renders root <Loading> fallback mid-hydration and leaves the page unresponsive
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 50/100
- Tipo de issue
- Bug
- Clareza
- Razoavelmente clara
- Status de atividade
- Ativa
- Stack de tecnologia
- playwright, typescript, vite
- Domínio
- frontend, testing-qa
Direção de pesquisa
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.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
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.
- Linguagem predominante
- TypeScript
- Estrelas
- 1.3k
- Forks
- 180
- Merge médio
- 1d 2h
- PRs com merge (30d)
- 26
Preparar o ambiente
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de solidjs/solid-router
-
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 76/100
solidjs/solid-router#633 ·
Mantenedores costumam responder em até 1 dia
-
Query enumeration recomputes on pathname/hash-only navigation with unchanged search (Solid 2)Aberta
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 74/100
solidjs/solid-router#624 ·
Mantenedores costumam responder em até 1 dia
-
<A> costs ~6us of server CPU per instance during SSR (20x a plain <a>), mostly mergeProps/splitPropsAberta
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 55/100
solidjs/solid-router#583 ·
Mantenedores costumam responder em até 1 dia
-
enhancement
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 35/100
solidjs/solid-router#569 · 3 comentários ·
Mantenedores costumam responder em até 1 dia
-
enhancement
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 38/100
solidjs/solid-router#518 · 2 comentários ·
Mantenedores costumam responder em até 1 dia
Todas as issues de solidjs/solid-router
Issues semelhantes
-
Mend: dependency security vulnerability untriaged
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
opensearch-project/security-dashboards-plugin#2545 ·
Mantenedores costumam responder em até 1 dia
-
Add: Dream TR SDAbertacheck:passed streams:add
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
Mantenedores costumam responder em até 1 dia
-
doctor integrity sample scans soft-deleted pages on Postgres (batch path has no deleted_at filter)Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 72/100
SocialGouv/egapro#4672 · 1 comentário ·
Mantenedores costumam responder em até 2 dias
-
area:agents area:tui bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 74/100
anthropics/claude-code#98358 ·
Mantenedores costumam responder em até 1 dia