angular 6 HMR

在Angular 6中使用模組熱替換(HMR)

江志卿 2018/10/03 10:00:00
1597

在Angular 6中使用模組熱替換(HMR)


簡介

本文將介紹在angular 6如何藉由簡單地設定實現模組熱替換

作者

江志卿


模組熱替換(Hot Module Replacement)是webpack中一項強大的功能,會在應用程式運行過程中替換,添加或刪除模組,而無需重新加載整個頁面,加快開發速度 但是在默認情況下不在Angular中啟用,故您必須藉由一些設定來啟用 。為了啟用HMR,我們將對程式碼進行一些修改並添加新的dev依賴項。

第一步 :安裝@angularclass/hmr

npm install --save-dev @ angularclass / hmr

第二步 : 建立HMR的環境設定檔environment.hmr.ts

  在工作區根目錄下的src/environment目錄創建一個名為 environment.hmr.ts 的新環境文件添加以下程式碼:
export const environment = { 
  production:false,
  hmr:true 
};
請注意,我們為我們的環境添加了額外的HMR屬性並將其設置為true。

第三步:修改angular.json

之後,我們需要修改angular的組態配置並為build和serve屬性添加hmr環境。在angular工作區的根目錄打開 angular.json 在構建屬性下,為HMR添加新配置,其內容如下:
“build”:{ 
    “configurations”:{ 
      ... 
      “hmr”:{ 
        “fileReplacements”:[ 
          { 
            “replace”:“src / environments / environment.ts”,
            “with”:“src / environments / environment.hmr .ts“ 
          } 
        ] 
      } 
    } 
  },
然後在serve屬性下,添加另一個HMR配置,其中包含以下內容:
“serve”:{ 
    “configurations”:{ 
      ... 
      “hmr”:{ 
        “hmr”:true,
        “browserTarget”:“:build:hmr” 
      } 
    } 
  }

第四步 : 修改tsconfig.app.json

  接下來,修改您的tsconfig.app配置( src/tsconfig.app.json) ,將node添加到typings陣列中。
{ 
  ... 
  “compilerOptions”:{ 
    ... 
    “types”:[“node”] 
  },
}

第五步 :更新現有環境

我們需要修改現有的環境文件,並將HMR屬性設置為false。並且,在我們的 environment.ts environment.prod.ts中,   添加hmr屬性並將其設置為false。
// environment.prod.ts 
export const environment = { 
  production:true,
  hmr:false 
}; // environment.ts 
export const environment = { 
  production:false,
  hmr:false 
};

第六步 : 建立hmr.ts

我們需要配置我們的angular application,使其使用熱模組替換。我們在根目錄下建立hmr.ts,程式碼如下:
import { NgModuleRef, ApplicationRef } from '@angular/core';
import { createNewHosts } from '@angularclass/hmr';

export const hmrBootstrap = (module: any, bootstrap: () => Promise<NgModuleRef>) => {
  let ngModule: NgModuleRef;
  module.hot.accept();
  bootstrap().then(mod => (ngModule = mod));
  module.hot.dispose(() => {
    const appRef: ApplicationRef = ngModule.injector.get(ApplicationRef);
    const elements = appRef.components.map(c => c.location.nativeElement);
    const makeVisible = createNewHosts(elements);
    ngModule.destroy();
    makeVisible();
  });
};

第七步: 修改main.ts,將hmr.ts匯入

import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

import { AppModule } from './app/app.module';
import { environment } from './environments/environment';
import { hmrBootstrap } from './hmr';

if (environment.production) enableProdMode();
const bootstrap = () => platformBrowserDynamic().bootstrapModule(AppModule);

if (environment.hmr) {
  if (module['hot']) {
    hmrBootstrap(module, bootstrap);
  } else {
    console.error('HMR is not enabled for webpack-dev-server!');
    console.log('Are you using the --hmr flag for ng serve?');
  }
} else {
  bootstrap().catch(err => console.log(err));
}

大功告成!

您可以使用
ng serve --configuration hmr
來啟用hmr運行應用程式,但我比較偏愛在package.json中編寫腳本:
“scripts”:{ 
  ... 
  “hmr”:“ng serve --configuration hmr” 
}
最後,透過簡短的指令運行:
npm run hmr
江志卿