国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

Angular HMR(熱模塊替換)功能實現方法

2024-05-06 15:20:12
字體:
來源:轉載
供稿:網友

最近一個同事在使用Angular的時候,希望能像VUE那樣,修改代碼后瀏覽器不刷新,頁面對應修改的組件自動更新的功能。這個功能的名字時HMR (hot module replace)。

稍微研究了一下,發現在angular/cli創建的項目中,實現這個不算太難,步驟如下:

1、首先創建一個src/environments/environment.hmr.ts文件,內容如下

export const environment = { production: false, hmr: true};

當然,對應的environment.prod.ts和environment.ts需要增加一個hmr:false.

如果environment.ts里面的hmr設置為ture,那么ng serve --hmr也有同樣效果。不過我對熱替換功能還不是那么相信,重新刷新瀏覽器能保證狀態更加干凈一些,所以讓environment.ts中的hmr為false.

2、在.angular-cli.json文件的環境中增加hmr的環境,大致如下:

"environments": { ... "hmr": "environments/environment.hmr.ts",}

3、在package.json的scripts中增加一個新的命令。(當然也可以不增加,直接運行ng serve --hmr -e=hmr和運行npm run hmr效果一樣)

"scripts": { ... "hmr": "ng serve --hmr -e=hmr"}

4、安裝hmr模塊,命令如下:

npm install --save-dev @angularclass/hmr

5、創建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(); });};

這事熱替換的關鍵,hmrBootstrap會替換原始的bootstrap(下面會看到), 替換后,當有新的模塊更新時,hmr會首先移除掉舊有的模塊,然后接收新的模塊。這些都是發生在瀏覽器里面。所以頁面不會刷新。

6、更新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();}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 鹤峰县| 九江县| 波密县| 仲巴县| 英超| 广丰县| 尚义县| 同江市| 连江县| 临泉县| 中阳县| 兴山县| 靖宇县| 财经| 鄂尔多斯市| 诸暨市| 天台县| 交口县| 遵化市| 福建省| 巴里| 伊川县| 互助| 长兴县| 广昌县| 普格县| 洪雅县| 利川市| 桐乡市| 化隆| 文昌市| 汤阴县| 格尔木市| 游戏| 卫辉市| 镇远县| 华阴市| 徐水县| 伊吾县| 柏乡县| 营口市|