検索

Angular開発実践(2):HRMの動作仕組み

Apr 02, 2018 pm 02:46 PM
angular開発する動作機構

この記事では、Angular 開発の実践 (2): HRM の動作メカニズムを紹介します。興味のある方はぜひご覧ください。

はじめに

angular-start プロジェクトでは、 モジュールのホット リプレースメント (HMR - Hot Module Replacement) を実行します。 angular-cliHRM を有効にする方法については、HRM 設定を確認してください模块热替换(HMR - Hot Module Replacement)功能,关于如何在angular-cli启用HRM,请查看HRM配置

HMR是个什么东西呢?

HMRwebpack提供的一个功能,angular-cli使用了它,它会在应用程序运行过程中替换、添加或删除模块,而无需重新加载整个页面。主要是通过以下几种方式,来显著加快开发速度:

  • 保留在完全重新加载页面时丢失的应用程序状态

  • 只更新变更内容,以节省宝贵的开发时间

  • 调整样式更加快速 - 几乎相当于在浏览器调试器中更改样式

这一切是如何运行的?

我们先看看具体的效果:

1、启动angular-start项目,在控制台你可以看到HRM已经启用的消息:

Angular開発実践(2):HRMの動作仕組み

2、然后通过浏览器控制台可以看到,第一次加载请求了所有的资源:

Angular開発実践(2):HRMの動作仕組み

3、此时,修改一处代码保存,浏览器并未刷新就自动显示修改之后的效果,再看浏览器控制台只请求了新修改的js:

Angular開発実践(2):HRMの動作仕組み

下面让我们从一些不同的角度观察,以了解HMR的工作原理……

在应用程序中

通过以下步骤,可以做到在应用程序中置换(swap in and out)模块:

  • 应用程序代码要求 HMR runtime 检查更新

  • HMR runtime(异步)下载更新,然后通知应用程序代码

  • 应用程序代码要求 HMR runtime 应用更新

  • HMR runtime(异步)应用更新

在编译器中

除了普通资源,编译器(compiler)需要发出update,以允许更新之前的版本到新的版本。update由两部分组成:

  • 更新后的manifest (JSON)

  • 一个或多个更新后的chunk (JavaScript)

manifest包括新的编译hash和所有的待更新chunk目录。每个更新chunk都含有对应于此chunk的全部更新模块(或一个flag用于表明此模块要被移除)的代码。

编译器确保模块IDchunk ID在这些构建之间保持一致。通常将这些ID存储在内存中(例如,使用webpack-dev-server时),但是也可能将它们存储在一个JSON文件中。

在模块中

HMR是可选功能,只会影响包含HMR代码的模块。举个例子,通过style-loaderstyle样式追加补丁。为了运行追加补丁,style-loader实现了HMR接口;当它通过HMR接收到更新,它会使用新的样式替换旧的样式。

类似的,当在一个模块中实现了HMR接口,你可以描述出当模块被更新后发生了什么。然而在多数情况下,不需要强制在每个模块中写入HMR代码。如果一个模块没HMR处理函数,更新就会冒泡。这意味着一个简单的处理函数能够对整个模块树(complete module tree)进行更新。如果在这个模块树中,一个单独的模块被更新,那么整组依赖模块都会被重新加载。

有关 module.hot 接口的详细信息,请查看HMR API页面。

在HMR Runtime中

对于模块系统的runtime,附加的代码被发送到parentschildren跟踪模块。在管理方面,runtime支持两个方法checkapply

check发送HTTP请求来更新manifest。如果请求失败,说明没有可用更新。如果请求成功,待更新chunk会和当前加载过的chunk进行比较。对每个加载过的chunk,会下载相对应的待更新chunk。当所有待更新chunk完成下载,就会准备切换到ready

HMR とは何ですか? どこにありますか? 🎜🎜HMR は、webpack によって提供される関数であり、angular-cli によって使用され、モジュールを再ロードせずに置換、追加、または削除します。ページ全体。主に次の方法を使用して開発を大幅にスピードアップします: 🎜
  • 🎜ページが完全にリロードされたときに失われるアプリケーションの状態を保持します🎜
  • 🎜のみ貴重な開発時間を節約するために変更を更新します🎜
  • 🎜スタイルをより速く調整します - ブラウザデバッガーでスタイルを変更するのとほぼ同等です🎜
🎜これはどのように機能しますか? 🎜🎜まず具体的な効果を見てみましょう: 🎜🎜1. angular-start プロジェクトを開始すると、HRM が実行されたというメッセージが表示されます。有効: 🎜🎜Angular開発実践(2):HRMの動作仕組み🎜🎜2. 次に、最初のロードですべてのリソースが要求されていることをブラウザーのコンソールで確認できます: 🎜🎜Angular開発実践(2):HRMの動作仕組み🎜🎜3. この時点で、コードを変更して保存します。ブラウザは、更新せずに、変更された効果を自動的に表示します。ブラウザ コントロールでは、台湾は新しく変更された js のみをリクエストしました: 🎜🎜Angular開発実践(2):HRMの動作仕組み🎜🎜HMR がどのように機能するかを理解するために、いくつかの異なる角度から見てみましょう...🎜🎜アプリ内で🎜🎜次の手順を実行できます。アプリケーション内のモジュールをスワップインおよびスワップアウト (swap in and out) します: 🎜
  • 🎜 アプリケーション コードを確認するには、HMR ランタイムが必要です。更新用🎜
  • 🎜HMR ランタイム (非同期) は更新をダウンロードし、アプリケーション コードに通知します 🎜
  • 🎜アプリケーション コードには更新を適用するために HMR ランタイムが必要です 🎜
  • 🎜HMRランタイム (非同期) は更新を適用します 🎜
🎜コンパイラー内🎜🎜 通常のリソースに加えて、コンパイラー (compiler) は update を発行する必要があります。以前のバージョンを新しいバージョンに更新できるようにします。 update は 2 つの部分で構成されます: 🎜
  • 🎜更新された manifest (JSON)🎜
  • 🎜1 つ以上の更新された チャンク (JavaScript)🎜
🎜マニフェスト (新しくコンパイルされた ハッシュ とすべての を含む) >chunk ディレクトリを更新します。各更新 chunk には、この chunk (または、このモジュールが削除されることを示す flag) コードに対応するすべての更新モジュールが含まれます。 🎜🎜コンパイラは、モジュール IDchunk ID がこれらのビルド間で一貫していることを確認します。通常、これらの ID はメモリに保存されます (たとえば、webpack-dev-server を使用する場合) が、JSON に保存することも可能です。ファイル内のコード>。 🎜🎜モジュール内🎜🎜HMR はオプション機能であり、HMR コードを含むモジュールにのみ影響します。たとえば、style-loader を通じて style スタイルにパッチを追加します。追加のパッチを実行するために、style-loaderHMR 経由で更新を受け取ると、古いスタイルを置き換えます。新しいスタイルで。 🎜🎜同様に、モジュールに HMR インターフェースを実装する場合、モジュールが更新されたときに何が起こるかを記述することができます。ただし、ほとんどの場合、すべてのモジュールで HMR コードを強制的に記述する必要はありません。モジュールに HMR ハンドラーがない場合、更新がバブルアップします。これは、単純なハンドラー関数でモジュール ツリー全体 (完全なモジュール ツリー) を更新できることを意味します。このモジュール ツリー内の 1 つのモジュールが更新されると、依存モジュールのセット全体が再ロードされます。 🎜🎜 module.hot インターフェイスの詳細については、HMR API ページを確認してください。 🎜🎜HMR ランタイム内🎜🎜 モジュール システムの ランタイム の場合、追加のコードが parents および children 追跡モジュールに送信されます。管理の観点から、runtime は 2 つのメソッド checkapply をサポートしています。 🎜🎜check は、マニフェスト を更新するために HTTP リクエストを送信します。リクエストが失敗した場合、利用可能なアップデートはありません。リクエストが成功すると、更新される chunk が現在ロードされている chunk と比較されます。ロードされた各 chunk に対して、更新される対応する chunk がダウンロードされます。更新されるすべての chunk がダウンロードされると、ready 状態に切り替える準備が整います。 🎜

apply メソッドは、更新されたすべてのモジュールを無効としてマークします。無効なモジュールごとに、モジュールまたはその親モジュールに更新ハンドラーが必要です。そうしないと、無効なタグがバブルアップして親も無効になります。各バブリングは、アプリケーションのエントリ ポイント、または更新ハンドラーを備えたモジュールのどちらか先に到達するまで継続します。エントリ ポイントからバブリングが始まると、プロセスは失敗します。 apply方法将所有被更新模块标记为无效。对于每个无效模块,都需要在模块中有一个更新处理函数,或者在它的父级模块们中有更新处理函数。否则,无效标记冒泡,并也使父级无效。每个冒泡继续直到到达应用程序入口起点,或者到达带有更新处理函数的模块(以最先到达为准)。如果它从入口起点开始冒泡,则此过程失败。

之后,所有无效模块都被(通过dispose处理函数)处理和解除加载。然后更新当前hash,并且调用所有accept处理函数。runtime

その後、すべての無効なモジュールが (dispose ハンドラー関数を介して) 処理され、アンロードされます。次に、現在の hash を更新し、すべての accept ハンドラー関数を呼び出します。 runtime はアイドル状態に戻り、すべてが通常どおり続行されます。

参考記事


http://www.css88.com/doc/webp...



関連する推奨事項:

Angular開発の実践(1): 環境の準備そして枠組み構築

🎜

以上がAngular開発実践(2):HRMの動作仕組みの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
C/CからJavaScriptへ:すべてがどのように機能するかC/CからJavaScriptへ:すべてがどのように機能するかApr 14, 2025 am 12:05 AM

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)Apr 11, 2025 am 08:22 AM

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScript:Web言語の汎用性の調査JavaScript:Web言語の汎用性の調査Apr 11, 2025 am 12:01 AM

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの進化:現在の傾向と将来の見通しJavaScriptの進化:現在の傾向と将来の見通しApr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

javascriptの分解:それが何をするのか、なぜそれが重要なのかjavascriptの分解:それが何をするのか、なぜそれが重要なのかApr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境