详解Angular5/Angular6项目如何添加热更新(HMR)功能


Posted in Javascript onOctober 10, 2018

本文介绍了详解Angular5/Angular6项目如何添加热更新(HMR)功能,分享给大家,具体如下:

A:什么是HMR?

Q:HMR(热替换)用于在运行的应用程序中更新代码而不需要重建它。这将导致更快的更新和更少的全页重新加载。

angular6-hmr

提供angular6以上HMR(热更新)功能

步骤

1、进入angular项目父级目录内

git clone https://github.com/staven630/angular6-hmr

angular6-hmr目录与angular项目(例如:my-app)是同级关系

2、执行gulp hmr --dir angular目录名

如:

npm i
gulp hmr --dir my-app

3、进入angular项目目录,安装@angularclass/hmr

npm install --save-dev @angularclass/hmr --registry https://registry.npm.taobao.org

4、这样angular项目的HMR就配置完成了,执行

npm run hmr

注:保持项目名(package.json中的name)与项目目录名一致

以下为手动配置步骤

Angular6添加HMR

environments目录

environments.ts和environment.prod.ts增加hmr: false

export const environment = {
 hmr: false
};

复制environment新增environment.hmr.ts修改hmr:true

export const environment = {
 hmr: true
};

.angular.json文件

build的configurations中添加

"hmr": {
 "fileReplacements": [
  {
   "replace": "src/environments/environment.ts",
   "with": "src/environments/environment.hmr.ts"
  }
 ]
}

serve的configurations中添加

"hmr": {
 "hmr": true,
 "browserTarget": "my-app:build:hmr"
}

tsconfig.app.json的compilerOptions的types中添加

"types": ["node"]

package.json的scripts中添加

"hmr": "ng serve --configuration hmr --open"

安装依赖

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(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

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));
}

Angular5添加HMR

environments目录

environments.ts和environment.prod.ts增加hmr: false

export const environment = {
 hmr: false
};

复制environment新增environment.hmr.ts修改hmr:true

export const environment = {
 hmr: true
};

.angular-cli.json的environments中添加

"hmr": "environments/environment.hmr.ts"

在package.json的scripts中增加

"hmr": "ng serve --hmr -e=hmr --open"

安装依赖

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(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

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));
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript获取和设置CheckBox状态的简单方法
Jul 05 Javascript
JavaScript 作用域链解析
Nov 13 Javascript
Java Mybatis框架入门基础教程
Sep 21 Javascript
js实现人民币大写金额形式转换
Apr 27 Javascript
ES6新特性六:promise对象实例详解
Apr 21 Javascript
前端页面文件拖拽上传模块js代码示例
May 19 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
Sep 25 Javascript
Vue 换肤的示例实践
Jan 23 Javascript
vue cli构建的项目中请求代理与项目打包问题
Feb 26 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
Nov 01 Javascript
微信小程序实现滚动Tab选项卡
Nov 16 Javascript
Js实现粘贴上传图片的原理及示例
Dec 09 Javascript
Node.js npm命令运行node.js脚本的方法
Oct 10 #Javascript
vue环形进度条组件实例应用
Oct 10 #Javascript
Node.js中读取TXT文件内容fs.readFile()用法
Oct 10 #Javascript
详解Node.js读写中文内容文件操作
Oct 10 #Javascript
angular6的响应式表单的实现
Oct 10 #Javascript
JS原生带缩略图的图片切换效果
Oct 10 #Javascript
js实现前面自动补全位数的方法
Oct 10 #Javascript
You might like
对比分析php中Cookie与Session的异同
2016/02/19 PHP
JavaScript delete 属性的使用
2009/10/08 Javascript
jquery选择器原理介绍($()使用方法)
2014/03/25 Javascript
用js设置下拉框为只读的小技巧
2014/04/10 Javascript
使用js dom和jquery分别实现简单增删改
2014/09/11 Javascript
浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
2014/11/12 Javascript
利用JavaScript的AngularJS库制作电子名片的方法
2015/06/18 Javascript
javaScript实现可缩放的显示区效果代码
2015/10/26 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
浅谈addEventListener和attachEvent的区别
2016/07/14 Javascript
Vuex之理解state的用法实例
2017/04/19 Javascript
vue router路由嵌套不显示问题的解决方法
2017/06/17 Javascript
基于easyui checkbox 的一些操作处理方法
2017/07/10 Javascript
使用vue制作FullPage页面滚动效果
2017/08/21 Javascript
Vue.js实现列表清单的操作方法
2017/11/15 Javascript
jQuery实现动态显示select下拉列表数据的方法
2018/02/05 jQuery
详解vue中的computed的this指向问题
2018/12/05 Javascript
JavaScript中callee和caller的区别与用法实例分析
2019/06/28 Javascript
实例讲解JavaScript 计时事件
2020/07/04 Javascript
使用Vant完成Dialog弹框案例
2020/11/11 Javascript
[01:05:30]VP vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python中的对象拷贝示例 python引用传递
2014/01/23 Python
Python下的subprocess模块的入门指引
2015/04/16 Python
python操作redis的方法
2015/07/07 Python
python 为什么说eval要慎用
2019/03/26 Python
解决Pycharm后台indexing导致不能run的问题
2019/06/27 Python
通过python调用adb命令对App进行性能测试方式
2020/04/23 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
Pandas替换及部分替换(replace)实现流程详解
2020/10/12 Python
使用Pytorch搭建模型的步骤
2020/11/16 Python
使用PyCharm官方中文语言包汉化PyCharm
2020/11/18 Python
解除劳动合同协议书范本2014
2014/09/25 职场文书
2014年食堂工作总结
2014/11/20 职场文书
优秀护士事迹材料
2014/12/25 职场文书
朝花夕拾读书笔记
2015/06/29 职场文书
FP-growth算法发现频繁项集——发现频繁项集
2021/06/24 Python