data-tsd-source inject-source plugin causes hydration mismatch in SSR (TanStack Start)
Nessuno ha ancora preso questa issue.
- Lingua principale
- TypeScript
- Stelle
- 499
- Fork
- 100
- Merge medio
- 1g 17h
- PR unite (30g)
- 4
Descrizione
Description
The inject-source plugin in @tanstack/devtools-vite causes React hydration mismatch warnings in TanStack Start (SSR) projects. The data-tsd-source attributes are injected with different line numbers on the server vs client transform passes, because other Vite plugins (e.g. tanstackStart(), viteReact()) shift line numbers differently between SSR and client bundles.
Reproduction
- Create a TanStack Start project with
@tanstack/devtools-vitev0.6.0 - Add
devtools()tovite.config.ts - Navigate to any SSR-rendered route
- Observe console warning:
A tree hydrated but some attributes of the server rendered HTML didn't match the client properties.
<div
+ data-tsd-source="/src/routes/simulations/$slug/editor.tsx:632:5"
- data-tsd-source="/src/routes/simulations/$slug/editor.tsx:636:5"
>
Line numbers are consistently off by a fixed offset (4 lines in my case) — the server and client transforms produce different source locations for the same JSX elements.
Root Cause
In plugin.ts, the inject-source Vite plugin's apply function only checks config.mode === 'development':
apply(config) {
return config.mode === 'development' && injectSourceConfig.enabled
},
The transform hook does not check the ssr boolean that Vite passes as the third argument. Since data-tsd-source is only useful on the client (for click-to-source in the devtools UI), injecting it during the SSR pass creates the mismatch.
Suggested Fix
Skip source injection during the SSR transform pass. The Vite transform hook receives { ssr: boolean } as the third argument:
transform(code, id, options) {
if (options?.ssr) return; // Only inject on client
// ... existing Babel transform
}
This would eliminate the hydration mismatch while preserving click-to-source functionality on the client.
Workaround
Disable source injection entirely:
devtools({ injectSource: { enabled: false } })
This removes the hydration warning but loses click-to-source in the devtools UI.
Environment
@tanstack/devtools-vite: 0.6.0@tanstack/react-start: latest- React 19
- Vite 7
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia in plugin.ts e ispeziona l’hook transform del plugin Vite inject-source, inclusa l’opzione ssr passata da Vite. Salta l’iniezione del codice sorgente per le trasformazioni SSR mantenendo l’iniezione lato client, quindi verifica che il hydration mismatch segnalato non si verifichi più e che click-to-source rimanga disponibile.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- react, typescript
- Ambito
- devtools
- Tipo di issue
- Bug
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Stato di attività
- Tranquilla
- Chiarezza
- Specificata chiaramente
- Idoneità per principianti
- 78/100