0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Metro BundlerによるHot Module Replacement (HMR) の詳細な仕組み解説 🔥🔄

Posted at

Hot Module Replacement (HMR) は、開発中にコードを変更した際に、アプリケーション全体を再起動することなく、変更されたモジュールだけを更新してリアルタイムで変更を反映する機能です。Metro Bundlerは、このHMRを実現するための重要な役割を担っています。

Hot Module Replacement (HMR) の仕組み:Metro Bundlerが果たす役割 🚀

HMRは、開発体験を劇的に向上させる素晴らしい機能です。特にReact Nativeのような宣言的なUIフレームワークでは、UIの変更をすぐに確認できるため、開発のイテレーション速度が向上します。

Metro BundlerがHMRを実現するために行っている主要なステップは以下の通りです。

  1. HMRサーバーの起動:

    • react-native start コマンドを実行すると、Metro Bundlerが起動し、同時にHMRサーバーも立ち上がります。このサーバーは、開発者のコード変更を監視し、変更があった場合にクライアント(シミュレーターや実機で動作しているアプリ)に通知する役割を担います。
    • 通常、Metroサーバーは開発用ポート (例: 8081) でリッスンしています。👂
  2. ファイル変更の監視:

    • Metro Bundlerは、プロジェクト内のJavaScriptファイルやその他のアセットの変更を継続的に監視しています。これは、ファイルシステムの監視機能(watchman など)を利用して非常に効率的に行われます。
    • 開発者がコードを保存すると、Metroはすぐにその変更を検知します。 vigilant
  3. 差分(Delta)の生成:

    • 変更を検知すると、Metro Bundlerは変更されたモジュールを特定し、そのモジュールと関連する依存関係のみを再バンドルします。この際、アプリケーション全体を再バンドルするのではなく、変更された部分の差分(delta) を効率的に生成します。
    • これがHMRの高速性の鍵です。全体を再バンドルする手間を省くことで、瞬時に更新が可能になります。💨
  4. HMR更新のプッシュ:

    • 生成された差分データは、WebSocketを通じてHMRサーバーからクライアントアプリケーションにプッシュされます。クライアントアプリは、Metro Bundlerとの間でWebSocket接続を確立しています。
    • このWebSocket接続は、シミュレーターや実機で実行されているアプリとMetro Bundler間のリアルタイム通信チャネルとして機能します。📡
  5. クライアント側でのモジュール更新:

    • クライアントアプリケーションは、プッシュされたHMR更新データを受信します。
    • JavaScriptのランタイム環境(HermesやJavaScriptCore)内で、変更されたモジュールが古いモジュールと「置き換え」られます。これは、モジュールローダーが新しいバージョンのコードをメモリにロードし、古い参照を更新することで行われます。
    • ここで重要なのが、アプリケーションの状態(state)が保持される という点です。例えば、フォームに入力中のテキストやスクロール位置などがリセットされずに、UIだけが変更後のコードで再レンダリングされます。これは、Reactの仮想DOMと組み合わせることで非常に効果的に機能します。✨
  6. UIの再レンダリング:

    • モジュールが更新された後、React Nativeは変更されたコンポーネントを検知し、仮想DOMの差分計算に基づいてUIを効率的に再レンダリングします。これにより、開発者はコードの変更が即座にUIに反映されるのを確認できます。🎨

HMRは非常に便利ですが、以下のような場合には完全なリロード(Fast Refreshやアプリの再起動)が必要になることがあります。

  • 新しいネイティブモジュールを追加・削除した場合(react-native link/unlink に相当する変更など)。
  • コンポーネントの状態管理に問題がある場合や、深い部分の依存関係が複雑な場合。
  • 特定のネイティブモジュールやライブラリがHMRに対応していない場合。
  • ルートコンポーネントや、副作用の大きいモジュールの変更。

HMRは、開発者が「コードを書く→保存する→すぐに結果を見る」というサイクルを非常に高速にするための、まさに魔法のような機能なんです! ✨

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?