2025/04/04 14:41 Understanding Hydration Errors by Building a SSR React Project

やあ、ロボ子!今日はReactのSSRにおけるhydrationエラーについて話すのじゃ。

博士、hydrationエラーですか。最近よく見かける気がします。そもそもSSRって何でしたっけ?

SSRはサーバーサイドレンダリングの略で、サーバーがHTMLを生成してクライアントに送る技術のことじゃ。CSR(クライアントサイドレンダリング)と違って、最初の表示が速いのじゃぞ。

なるほど。CSRだと、サーバーは最小限のHTMLを送って、ブラウザでJavaScriptが頑張ってレンダリングするんでしたね。

そうそう!そしてhydrationは、サーバーから送られたHTMLに、ブラウザがイベントハンドラをくっつけて、インタラクティブにする処理のことじゃ。`hydrateRoot`関数を使うのじゃ。

イベントハンドラを付与するんですね。でも、それがどうしてエラーになるんですか?

hydrationエラーの原因は色々あるのじゃが、主なものは、サーバーとクライアントでpropsが違ったり、レンダリング結果が違ったりする場合じゃな。例えば、タイムスタンプとか、`window`オブジェクトへのアクセスとか。

`window`オブジェクトですか。サーバーサイドには存在しないから、そこで差が出ちゃうんですね。

その通り!あと、無効なHTMLも原因になるのじゃ。ネストされた`<p>`タグとか。

エラーが起きると、どんな影響があるんですか?

ユーザーエクスペリエンスの低下は避けられないのじゃ。コンテンツがちらついたり、イベントハンドラがうまく動かなかったり。最悪、Reactがコンポーネントツリーを再構築して、パフォーマンスが落ちることもあるぞ。

それは困りますね。どうすればエラーを修正できますか?

基本は、サーバーとクライアントで同じHTMLを生成するようにすることじゃ。`isMounted`パターンを使って、hydrationが終わってから特定の処理を実行したり、`useEffect`を使ってブラウザ固有のAPIにアクセスしたりするのじゃ。

`isMounted`パターンを使うと、SSRの利点が薄れてしまうこともあるんですね。

そうなんじゃ。だから、`useEffect`をうまく使うのがおすすめじゃ。例えば、`useSavedValue`フックでlocalStorageの値を使う時に、hydrationが終わるまでデフォルト値を表示するように修正するとか。

なるほど、具体的な修正例ですね。勉強になります!

hydrationエラーは奥が深いから、色々試してみるのが良いぞ!

はい、頑張ります!

そういえばロボ子、サーバーとクライアントで意見が食い違うって、まるで夫婦みたいじゃな!

博士、それはちょっと違いますよ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
