概要
ハイドレーションとは、サーバーで生成した静的 HTML に対して、ブラウザ上の React がイベントリスナーを付加し、インタラクティブなアプリとして動作させるプロセスです。
Next.js App Router では、"use client" を宣言したコンポーネントだけがハイドレーション対象になります。Server Components はサーバー専用でハイドレーションされません。
ハイドレーションエラーの原因
サーバーとクライアントの描画結果が一致しないとエラーになります。
// NG: サーバーとクライアントで異なる値になる
function BadComponent() {
return <div>{Math.random()}</div>; // 毎回変わる
}
// OK: useEffect でクライアントのみ実行
function GoodComponent() {
const [value, setValue] = useState<number | null>(null);
useEffect(() => {
setValue(Math.random());
}, []);
return <div>{value ?? "..."}</div>;
}
ブラウザ拡張による誤検知
GA オプトアウト拡張などが <html> タグに属性を付け加えることでエラーが出る場合があります。
その場合は suppressHydrationWarning を追加します。
<html lang="ja" suppressHydrationWarning>
Server Components との関係
App Router では Server Components → Client Components という方向でのみ "use client" 境界を置けます。
Client Component は SSR でサーバー側でも一度レンダリングされ、ブラウザでハイドレーションされます。