Dev Study
← Angular コース

67. ハイドレーション — サーバのHTMLをそのまま引き継ぐ

SSRで届いたHTMLは、見えはしますが、まだ動きません。ボタンのクリックにも反応しない「静止画」の状態です。その後ブラウザ側でAngularが起動し、届いているHTMLにイベントリスナーや状態を紐付けて、動くアプリに変えます。この引き継ぎの工程をハイドレーション(hydration)と呼びます。乾いたHTMLに水を注いで生き返らせる、というイメージの名前です。

ハイドレーションが無いと、ブラウザ側のAngularは届いたHTMLをいったん捨てて、同じ画面をゼロから作り直します。一瞬のちらつきが出るうえ、せっかくサーバで作ったDOMが無駄になります。provideClientHydration() を設定しておくと、Angularは既存のDOMをそのまま再利用し、紐付けだけを行います。ng add @angular/ssr で導入した場合は、この設定も最初から入っています。

前提として大事なのは、サーバとブラウザで同じHTMLが生成されることです。たとえば <table> の直下に勝手なタグを置くようなHTML構造の崩れがあると、ブラウザが構造を直してしまい、サーバのHTMLと一致せず照合に失敗します。また、Angularの外で直接DOMを書き換えるライブラリとも相性が悪いです。どうしても合わない部分には、その要素だけハイドレーションを外す ngSkipHydration という逃げ道も用意されています。

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

// app.config.ts — ハイドレーションを有効にする
import { ApplicationConfig } from '@angular/core';
import {
  provideClientHydration,
  withEventReplay,
} from '@angular/platform-browser';

export const appConfig: ApplicationConfig = {
  providers: [
    // サーバ製のHTMLを捨てずに再利用して紐付けだけ行う。
    // withEventReplay: 紐付け完了前のクリックも取りこぼさず後で再生
    provideClientHydration(withEventReplay()),
  ],
};

// どうしても照合が合わない部品だけ個別に外せる:
//   <app-legacy-widget ngSkipHydration />
サンプルコードで身につける(5本) →

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

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