Dev Study
← Angular コース

68. インクリメンタルハイドレーション — 必要な所から順に起こす

通常のハイドレーションは、ページ全体をまとめて一度に起こします。つまり、画面のいちばん下にある重い部品のJSも、最初にまとめて読み込まれます。制御フローのレッスンで学んだ @defer は「重い部分を後から読み込む」道具でしたが、この考え方をハイドレーションに持ち込んだのがインクリメンタルハイドレーションです。ページの部品ごとに「見えたら起こす」「触られたら起こす」と、目覚めのタイミングを選べます。

使い方は2段階です。まず provideClientHydration(withIncrementalHydration()) を設定し、テンプレートでは @defer (hydrate on viewport) { ... } のように hydrate トリガーを書きます。このブロックは、SSRで作られたHTMLが最初から表示されたまま、画面に入ってくるまではJSの読み込みもハイドレーションも保留されます。トリガーには viewport のほかに idle(手が空いたら)、interaction(操作されたら)、hover や、ずっと起こさない never もあります。

@defer 単体との違いに注意してください。@defer だけだと、条件を満たすまでは中身の代わりにプレースホルダが表示されます。hydrate トリガー付きなら、完成した見た目は最初からそこにあり、動き出すのが後になるだけです。「見た目は最初から、動きは必要になってから」。初期表示の速さとJS量の削減を両立する、SSRの仕上げの一手です。

サンプルコード(フレームワーク環境が必要なため表示のみ)

// app.config.ts で withIncrementalHydration() を追加した上で:
//   provideClientHydration(withEventReplay(), withIncrementalHydration())
//
// テンプレート側 — 部品ごとに目覚めのタイミングを選ぶ
//
// <header>...</header>            <!-- ここは通常どおり即ハイドレート -->
//
// @defer (hydrate on viewport) {
//   <app-review-list />           <!-- 見た目はSSRで最初から表示。
//                                      画面に入ったら動き出す -->
// }
//
// @defer (hydrate on interaction) {
//   <app-comment-form />          <!-- 触られて初めてJSを読み込む -->
// }
//
// @defer (hydrate never) {
//   <app-footer />                <!-- 表示だけで一生動かさない -->
// }
サンプルコードで身につける(5本) →

学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。

公式ドキュメントで詳しく ↗