【えいちえむあーる】

HMR(ホットモジュールリプレースメント) とは?

最終更新:
💡 ページをリロードせずに変更点だけを即座に反映する開発者の魔法

フロントエンド開発中に、変更したモジュールをページ全体のリロードなしに差し替える仕組み。ViteやwebpackがHMRの仕組みとAPIを提供し、差し替えられる変更なら画面の状態を保ったまま反映できる。

📌 このページのポイント
HMR — 変更モジュールだけをブラウザに即反映 フルリロード:状態リセット ✗ HMR:状態保持 ◎ editor ファイル保存 Vite サーバー モジュールグラフ解析 差分モジュール特定 WebSocket で送信 ブラウザ モジュールA(旧) ↓ 差し替え モジュールA(新) 状態・スクロール保持 変更通知 差分のみ HMRのフロー ① ファイル保存 ② 差分特定 ③ WS送信 ④ 差し替え ⑤ 即時反映! 状態(フォーム入力・スクロール位置)をリセットせずに変更を適用
HMR:変更されたモジュールだけをブラウザへ即時反映
ひよこ ひよこ
HMRってよく見るけど、ホットリロードと何が違うの?
ペンギン先生 ペンギン先生
ホットリロードは、アプリを再起動せずにコードの変更を反映する仕組み全般を指して使われることが多い言葉で、HMRはWebの開発ツールでよく使われるその実現方法の一つだよ。変更されたモジュールを差し替えるから、ページ全体を読み込み直さずに済んで、入力中のフォームなどの状態を保てるんだ。
ひよこ ひよこ
ページリロードなしってどういう仕組みで動いてるの?
ペンギン先生 ペンギン先生
開発サーバーがファイルの変更を見張っていて、変更されたモジュールと、その影響がどこまで届くかを判断して、ブラウザ側のHMRランタイムに更新を伝えるんだ。Viteはこの連絡にWebSocketを使っているよ。ブラウザ側では、更新を受け入れる「HMR境界」のモジュールが新しいコードに差し替えられるんだ。
ひよこ ひよこ
Reactで開発するとき感じる「ファイル保存したら即更新される」ってHMRのおかげ?
ペンギン先生 ペンギン先生
そうだよ。ReactにはFast Refreshという仕組みがあって、Reactコンポーネントだけを書き出しているファイルなら、そのモジュールだけを更新して描き直すから、関数コンポーネントのstateを保てるんだ。ただしクラスコンポーネントのstateは保たれないし、コンポーネント以外も書き出しているファイルを変えると、それを読み込んでいるモジュールも実行し直されるよ。
ひよこ ひよこ
HMRが効かないケースってあるの?
ペンギン先生 ペンギン先生
あるよ。変更を受け入れるモジュールが見つからないまま、依存関係をさかのぼってアプリの入口(エントリーポイント)まで届くと、差し替えをあきらめてページ全体をリロードするんだ。Reactの外から読み込まれているファイルを変えたときもフルリロードになる。それに、ブラウザで動くモジュール以外、たとえばサーバー側のコードはHMRの対象外だよ。
もっと詳しく知りたい人へ

保存したのに画面の状態がリセットされるのはなぜ?

変更がHMRで受け入れられずフルリロードになったか、フレームワークがその変更では状態を捨てて作り直す決まりになっているためだよ。webpackでは、どのモジュールも更新を受け入れなかった場合、受け入れられなかったファイル名を示してページ全体をリロードする。ReactのFast Refreshでは、クラスコンポーネントや、ファイルに「// @refresh reset」がある場合などは状態がリセットされる。Reactコンポーネントと定数などを別ファイルに分けると、状態を保ったまま更新されやすくなるよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「HMR」って出てきたら「コードの変更を、できるだけページを再読み込みせずに反映する開発中の仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Hot Module Replacement」 = ホットモジュールリプレースメント
💬 「ホット(Hot)」は「稼働中のまま」、「モジュールリプレースメント(Module Replacement)」は「モジュールの差し替え」という意味だよ

参考資料

← 用語集にもどる