讓@angular/cli項目支持Hot Module Replacement(HMR)
來自專欄大漠窮秋的專欄15 人贊了文章
【請直接跳到最後一段,有驚喜~】
什麼是HMR?
噢,你自己看看[這裡的官方文檔](Hot Module Replacement)就好了,不解釋。
@angluar/cli 默認沒有很好地支持HMR,我們需要手動做一些事情。
請跟我一步一步來玩。
第一步:修改環境配置文件
為了後續操作能順利進行,首先需要修改默認生成的兩份環境配置文件:src/environments/environment.ts 和 src/environments/environment.prod.ts
在這兩份配置文件裡面都增加一個配置項hmr:false,變成這樣:
export const environment = { production: true, hmr: false, ... };
第二步:新建一份hmr配置文件
創建一份全新的環境配置文件:src/environments/environment.hmr.ts
environment.hmr.ts 裡面的內容如下:
export const environment = { production: false, hmr: true };
修改.angular-cli.json,加一行配置,變成這樣:
"environmentSource": "environments/environment.ts", "environments": { ... "hmr": "environments/environment.hmr.ts", }
修改package.json,加一行腳本:
"scripts": { ... "hmr": "ng serve --hmr -e=hmr" }
第三步:安裝第三方支持模塊同時寫一些代碼
npm install --save-dev @angularclass/hmr
創建一份文件:src/hmr.ts ,裡面的完整內容如下:
import { NgModuleRef, ApplicationRef } from @angular/core; import { createNewHosts } from @angularclass/hmr; export const hmrBootstrap = (module: any, bootstrap: () => Promise<NgModuleRef<any>>) => { let ngModule: NgModuleRef<any>; module.hot.accept(); bootstrap().then(currentModule => ngModule = currentModule); module.hot.dispose(() => { const appRef: ApplicationRef = ngModule.injector.get(ApplicationRef); const elements = appRef.components.map(c => c.location.nativeElement); const removeOldHosts = createNewHosts(elements); ngModule.destroy(); removeOldHosts(); }); };
代碼很簡單,相信你能看懂,不解釋了。
寫一行代碼很簡單,解釋一行代碼可能需要一千行注釋,故:一碼勝千言。
修改默認生成的src/main.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(Ammm.. HMR is not enabled for webpack); } } else { bootstrap(); }
第四步:啟動項目
npm run hmr
然後你會看到這樣的警告,無視就好了:
注意點
- HMR的好處是:開發的時候不需要每次都整體刷新瀏覽器,只替換被修改過的模塊
- 不要把HMR在生產環境裡面,因為你不能每次改了代碼都去刷所有客戶的瀏覽器
- HMR啟動的方式不是ng serve,而是npm run hmr,請特別注意一下。
cli v6.x已經內置了HMR支持
特別注意:最新的@angular/cli 6.x 版本已經內置了 HMR 支持,只要執行以下命令即可(上面的所有步驟都不需要了,所以趕緊升級到V6.0吧!):
ng serve --hmr
OpenWMS這個項目的前端已經升級到V6.0.0,有需要參考一下吧:
用戶登錄 - 碼雲 Gitee.com本文由 @業餘小編 意譯改寫,英文版原文在這裡:
https://medium.com/wizardnet972/hot-module-replacement-with-angular-cli-5fc7a3ae4a9c推薦閱讀:
※使用 Angular.js, Node.js 和 MongoDB開發簡單案例
※AngularJS實現跨域請求
TAG:Angular |