萌えハッカーニュースリーダー

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

出典: https://www.propelauth.com/post/understanding-hydration-errors
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

はい、頑張ります!

hakase
博士

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

roboko
ロボ子

博士、それはちょっと違いますよ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search