angular 开发编译速度慢,影响开发体验

https://github.com/GBeckLi/note-everything/tree/master/angular

问题描述:

angular 开发编译速度慢

解决方法:

通过HMR的方式实现angular模块级别的热更新,每次只会重新编译和更新修改文件所在的模块,从而降低编译时间。

angular启动HMR的步骤:

1. 修改environment文件

修改environments/environment.ts文件如下

export const environment = {
production: false,
hmr: true,
};
修改environments/environment.prod.ts文件如下

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

2. 安装第三方模块

npm install --save-dev @angularclass/hmr
npm install --save-dev @types/node

第一个是用于实现热更新的第三方插件,第二个是待会需要修改main.ts,其中需要用到module关键字,需要安装@types/node防止启动报错;

3. 修改 tsconfig.json 文件

安装完@types/node之后需要确保tsconfig.json中,需要确保其中compilerOptions.typeRoots的值中包含node_modules/@types,或者compilerOptions.types的值包含node;

"compilerOptions": {
...
"typeRoots": [
...
"node_modules/@types"
...
]
}
或者
"compilerOptions": {
...
"types": [
...
node
...
]
}

4. 创建src/hmr.ts文件

import { NgModuleRef, ApplicationRef } from '@angular/core';
import { createNewHosts } from '@angularclass/hmr';

export const hmrBootstrap = (module: any, bootstrap: () => Promise>) => {
  let ngModule: NgModuleRef;
  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();
  });
};

5. 修改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';

const bootstrap = () => platformBrowserDynamic().bootstrapModule(AppModule);

if (environment.production) {
  enableProdMode();
} else {
  if (environment.hmr) {
    // tslint:disable-next-line:no-string-literal
    if (module['hot']) {
      hmrBootstrap(module, bootstrap);
    } else {
      console.log('Amm..HMR is not enabled for webpack');
    }
  } else {
    bootstrap();
  }
}

6. 运行命令: ng serve --hmr



在做的过程中主要遇到2个问题:

一开始按照网上的解决方案是没有安装@types/node这个插件的步骤的,后来根据报错信息安装了插件才解决。
运行的时候必须加--hmr参数,这里暂时没有搞清楚为什么要加,因为根据代码的修改来看都是由environments文件决定是否需要启动hmr。
按照以上步骤修改完成之后,就可以重新运行ng serve --hmr体验热更新了.

你可能感兴趣的:(angular 开发编译速度慢,影响开发体验)