详解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 相关文章推荐
jquery的extend和fn.extend的使用说明
Jan 09 Javascript
js实现图片拖动改变顺序附图
May 13 Javascript
JavaScript中的比较操作符&gt;、=、
Dec 31 Javascript
jQuery 移动端artEditor富文本编辑器
Jan 11 Javascript
jQuery模拟实现的select点击选择效果【附demo源码下载】
Nov 09 Javascript
利用vscode编写vue的简单配置详解
Jun 17 Javascript
JS库之wow.js使用方法
Sep 14 Javascript
js实现图片粘贴上传到服务器并展示的实例
Nov 08 Javascript
Javascript中的作用域及块级作用域
Dec 08 Javascript
JavaScript剩余操作符Rest Operator详解
Jul 20 Javascript
vuex实现像调用模板方法一样调用Mutations方法
Nov 06 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
Aug 05 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模拟HTTP认证
2006/10/09 PHP
常用表单验证类,有了这个,一般的验证就都齐了。
2006/12/06 PHP
PHP常用函数小技巧
2008/09/11 PHP
谈PHP生成静态页面分析 模板+缓存+写文件
2009/08/17 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
php实现的网络相册图片防盗链完美破解方法
2015/07/01 PHP
最佳JS代码编写的14条技巧
2011/01/09 Javascript
JavaScript 基础篇(一)
2012/03/30 Javascript
根据当前时间在jsp页面上显示上午或下午
2014/08/18 Javascript
JavaScript操作cookie类实例
2015/03/31 Javascript
js如何判断输入字符串长度
2015/12/16 Javascript
jQuery之动画效果大全
2016/11/09 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
2017/08/03 Javascript
JavaScript实现修改伪类样式
2017/11/27 Javascript
vue中关闭eslint的方法分析
2018/08/04 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
解决Idea、WebStorm下使用Vue cli脚手架项目无法使用Webpack别名的问题
2019/10/11 Javascript
用python实现对比两张图片的不同
2018/02/05 Python
python实现隐马尔科夫模型HMM
2018/03/25 Python
Python使用修饰器进行异常日志记录操作示例
2019/03/19 Python
解决Django加载静态资源失败的问题
2019/07/28 Python
使用python实现数组、链表、队列、栈的方法
2019/12/20 Python
解决python运行效率不高的问题
2020/07/20 Python
利用python 下载bilibili视频
2020/11/13 Python
python 制作网站小说下载器
2021/02/20 Python
Omio波兰:全欧洲低价大巴、火车和航班搜索和比价
2018/02/16 全球购物
Expedia挪威官网:酒店、机票和租车
2018/03/03 全球购物
亚洲最大的运动鞋寄售店:KicksCrew
2020/11/26 全球购物
财务人员个人求职信范文
2013/12/04 职场文书
银行职员个人的工作自我评价
2014/02/15 职场文书
应聘会计求职信
2014/06/11 职场文书
同学聚会通知书
2015/04/20 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书
MySQL Shell的介绍以及安装
2021/04/24 MySQL
python 实现图与图之间的间距调整subplots_adjust
2021/05/21 Python
ICOM R71E和R72E图文对比解说
2022/04/07 无线电