Angular開發實踐(二):HRM運行機制

来源:http://www.cnblogs.com/laixiangran/archive/2017/11/06/7795149.html
-Advertisement-
Play Games

引言 在 "angular start" 項目中啟用了 功能,關於如何在 啟用 ,請查看 "HRM配置" 那 是個什麼東西呢? 是`webpack angular cli`使用了它,它會在應用程式運行過程中替換、添加或刪除模塊,而無需重新載入整個頁面。主要是通過以下幾種方式,來顯著加快開發速度: 保 ...


引言

angular-start項目中啟用了模塊熱替換(HMR - Hot Module Replacement)功能,關於如何在angular-cli啟用HRM,請查看HRM配置

HMR是個什麼東西呢?

HMRwebpack提供的一個功能,angular-cli使用了它,它會在應用程式運行過程中替換、添加或刪除模塊,而無需重新載入整個頁面。主要是通過以下幾種方式,來顯著加快開發速度:

  • 保留在完全重新載入頁面時丟失的應用程式狀態
  • 只更新變更內容,以節省寶貴的開發時間
  • 調整樣式更加快速 - 幾乎相當於在瀏覽器調試器中更改樣式

這一切是如何運行的?

我們先看看具體的效果:

1、啟動angular-start項目,在控制台你可以看到HRM已經啟用的消息:

image

2、然後通過瀏覽器控制台可以看到,第一次載入請求了所有的資源:

image

3、此時,修改一處代碼保存,瀏覽器並未刷新就自動顯示修改之後的效果,再看瀏覽器控制台只請求了新修改的js:

image

下麵讓我們從一些不同的角度觀察,以瞭解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狀態。

apply方法將所有被更新模塊標記為無效。對於每個無效模塊,都需要在模塊中有一個更新處理函數,或者在它的父級模塊們中有更新處理函數。否則,無效標記冒泡,並也使父級無效。每個冒泡繼續直到到達應用程式入口起點,或者到達帶有更新處理函數的模塊(以最先到達為準)。如果它從入口起點開始冒泡,則此過程失敗。

之後,所有無效模塊都被(通過dispose處理函數)處理和解除載入。然後更新當前hash,並且調用所有accept處理函數。runtime切換回閑置狀態,一切照常繼續。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡介(Introduction) <! 出這邊文章的目的,及如何更好地閱讀這篇文章 之前學習 "Java8實戰" 時,遇到一個很好的策略模式示例。便想著藉著這個示例結合反饋式的方法來,學習策略設計模式,也以便後面反覆琢磨學習。 首先我們通過練習,逐步寫出符合相應需求的代碼,再根據需求進行改進、比較、 ...
  • 1、使用position中的absolute要與relative配套使用,如果不使用relative時預設absolute會用整個視窗作為參照物;如果relative放在absolute的父級標簽上,則absolute會以父級塊標簽作為參照物調整位置,absolute要使用top、left、righ ...
  • function Stack() { this.dataStore = []; //存儲棧元素 } Stack.prototype = { constructor: Stack, push: function(element) { this.dataStore.push(element) }, po... ...
  • 共同點:split與join函數通常都是對字元或字元串的操作; 兩者的區別:(1)split()用於分割字元串,返回一個數組,例如 var string=“hello world?name=xiaobai”; var splitString = string.split("?"); console. ...
  • 用另一種視角去理解JavaScript的原型鏈,明白__proto__跟prototype的本質。 ...
  • 一、首先安裝插件 1、安裝Package Control,這是為了安裝其他插件做基礎,它可以方便我們下載其他插件 (1)、按Ctrl+`調出console(註:避免熱鍵衝突) (2)、粘貼以下代碼到命令行並回車: import urllib.request,os; pf = 'Package Con ...
  • JQuery對Ajax操作進行了封裝, \$.ajax() 方法屬於最底層的方法,第2層是 load() 、 \$.get() 、 \$.post() 方法,第3層是 \$.getScript() 和 \$.getJSON() 方法。 \$.get() 方法和 \$.post() 方法是jQuery ...
  • //創建XMLHttp對象 function CreateXmlHttp() { //非IE瀏覽器創建XmlHttpRequest對象 if (window.XMLHttpRequest) { return new XMLHttpRequest(); } else { return null; } ... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...