R
Interview Deckreact · next.js · senior/staff
0·0·122
Next.js

Hydration & Hydration Mismatch

Hydration: tornar o HTML estático (SSR) interativo. Mismatch: HTML server diferente do que client renderiza.

Hydration é o processo de 'attachar' os event listeners do React ao HTML pré-renderizado pelo servidor. Hydration Mismatch ocorre quando o HTML do servidor difere do que o client renderizaria — React precisa descartar e re-renderizar, perdendo a vantagem do SSR.

Problema
new Date(), Math.random(), window/document, valores que dependem do horário do client → HTML diferente entre server e client = mismatch.
Solução
useEffect para código client-only. suppressHydrationWarning em casos pontuais. Em RSC, cookies()/headers() para valores dinâmicos. dynamic({ ssr: false }) para componentes 100% client.
Tip
Sempre que ver 'Hydration failed' no console: identifique o que difere entre server e client. Datas, IDs aleatórios e localStorage são as causas mais comuns.
// ❌ Hydration mismatch
function Comp() {
  return <div>{new Date().toLocaleTimeString()}</div>;
  // server: 14:23:01
  // client: 14:23:02 (diferente)
}

// ✅ Solução: useEffect
function Comp() {
  const [time, setTime] = useState(null);
  useEffect(() => setTime(new Date().toLocaleTimeString()), []);
  return <div>{time}</div>; // server: vazio, client: hora
}

// ✅ Solução: dynamic import sem SSR
const ClientOnly = dynamic(() => import('./Comp'), { ssr: false });
Q.Como debugar hydration mismatch?
A.Console mostra qual elemento difere. Causas comuns: 1) new Date() inline. 2) typeof window check incorreto. 3) localStorage no render. 4) Componentes que dependem de viewport. 5) Math.random() para keys.
Q.useId resolve mismatch de IDs?
A.Sim. useId gera IDs estáveis entre server e client (sequência baseada na árvore React), evitando mismatch ao usar IDs em labels, ARIA, etc.
Q.Selective Hydration ajuda como?
A.Com Suspense + Streaming, partes podem ser hidratadas independentemente. Mismatch em uma parte não quebra a página inteira — apenas aquele boundary é re-renderizado client-side.
29/122← →