详解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 相关文章推荐
js获取判断上传文件后缀名的示例代码
Feb 19 Javascript
Document.location.href和.replace的区别示例介绍
Mar 04 Javascript
Node.js的特点和应用场景介绍
Nov 04 Javascript
js实现带缓冲效果的仿QQ面板折叠菜单代码
Sep 06 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
Mar 14 Javascript
基于LayUI实现前端分页功能的方法
Jul 22 Javascript
node中modules.exports与exports导出的区别
Jun 08 Javascript
vue导出html、word和pdf的实现代码
Jul 31 Javascript
jquery 动态遍历select 赋值的实例
Sep 12 jQuery
一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)
Apr 19 Javascript
微信小程序如何使用云开发
May 17 Javascript
js通过循环多张图片实现动画效果
Dec 19 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
SONY SRF-40W电路分析
2021/03/02 无线电
php 常用算法和时间复杂度
2013/07/01 PHP
php去除换行(回车换行)的三种方法
2014/03/26 PHP
PHP微信刮刮卡 附微信接口
2016/07/22 PHP
php 的反射详解及示例代码
2016/08/25 PHP
PHP获取input输入框中的值去数据库比较显示出来
2016/11/16 PHP
浅谈PHP表单提交(POST&amp;GET&amp;URL编/解码)
2017/04/03 PHP
关于PHP中interface的用处详解
2020/07/26 PHP
javascript实现 在光标处插入指定内容
2007/05/25 Javascript
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
js汉字转拼音实现代码
2013/02/06 Javascript
jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
2013/05/28 Javascript
js中关于一个分号的崩溃示例
2013/11/11 Javascript
jqplot通过ajax动态画折线图的方法及思路
2013/12/08 Javascript
javaScript如何跳出多重循环break、continue
2016/09/01 Javascript
ES6入门教程之Iterator与for...of循环详解
2017/05/17 Javascript
原生JS实现的轮播图功能详解
2018/08/06 Javascript
微信公众号网页分享功能开发的示例代码
2020/05/27 Javascript
使用原生JS实现滚轮翻页效果的示例代码
2020/05/31 Javascript
ESLint 是如何检查 .vue 文件的
2020/11/30 Vue.js
Python SQLite3数据库操作类分享
2014/06/10 Python
Python二分法搜索算法实例分析
2015/05/11 Python
Python3实现简单可学习的手写体识别(实例讲解)
2017/10/21 Python
Python实现的从右到左字符串替换方法示例
2018/07/06 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
详解django自定义中间件处理
2018/11/21 Python
Python零基础入门学习之输入与输出
2019/04/03 Python
PyQt5 如何让界面和逻辑分离的方法
2020/03/24 Python
matplotlib quiver箭图绘制案例
2020/04/17 Python
如何使用Python自动生成报表并以邮件发送
2020/10/15 Python
购买澳大利亚最好的服装和内衣在线:BONDS
2016/10/14 全球购物
大学毕业生的自我鉴定
2013/11/30 职场文书
领导班子党的群众路线对照检查材料
2014/09/25 职场文书
JDBC连接的六步实例代码(与mysql连接)
2021/05/12 MySQL
Windows环境下实现批量执行Sql文件
2021/10/05 SQL Server
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android