详解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 Uploadify多文件上传带进度条且传递自己的参数
Aug 28 Javascript
JavaScript学习笔记之定时器
Jan 22 Javascript
jquery判断密码强度的验证代码
Apr 22 Javascript
javascript 广告移动特效的实现代码
Jun 25 Javascript
JS获得多个同name 的input输入框的值的实现方法
Jan 09 Javascript
在 Node.js 中使用原生 ES 模块方法解析
Sep 19 Javascript
详解react服务端渲染(同构)的方法
Sep 21 Javascript
vue.js实现标签页切换效果
Jun 07 Javascript
详解从Vue-router到html5的pushState
Jul 21 Javascript
小程序开发基础之view视图容器
Aug 21 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
Dec 09 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
Oct 08 jQuery
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
第三节 定义一个类 [3]
2006/10/09 PHP
为查询结果建立向后/向前按钮
2006/10/09 PHP
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
PHP 函数学习简单小结
2010/07/08 PHP
PHP操作数组相关函数
2011/02/03 PHP
浅谈PHP中其他类型转化为Bool类型
2016/03/28 PHP
php in_array() 检查数组中是否存在某个值详解
2016/11/23 PHP
使用PHP json_decode可能遇到的坑与解决方法
2017/08/03 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
2019/09/29 PHP
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
jQuery异步验证用户名是否存在示例代码
2014/05/21 Javascript
jquery遍历json对象集合详解
2016/05/18 Javascript
微信通过页面(H5)直接打开本地app的解决方法
2017/09/09 Javascript
angularjs实现时间轴效果的示例代码
2017/11/29 Javascript
Javascript防止图片拉伸的自适应处理方法
2017/12/26 Javascript
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
Python time模块详解(常用函数实例讲解,非常好)
2014/04/24 Python
Python中列表、字典、元组数据结构的简单学习笔记
2016/03/20 Python
Python实现矩阵相乘的三种方法小结
2018/07/26 Python
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
Python实例方法、类方法、静态方法的区别与作用详解
2019/03/25 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
2019/07/11 Python
Python Tornado之跨域请求与Options请求方式
2020/03/28 Python
linux 下selenium chrome使用详解
2020/04/02 Python
Python logging日志模块 配置文件方式
2020/07/12 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
详解css3中的伪类before和after常见用法
2020/11/17 HTML / CSS
详解通过HTML5 Canvas实现图片的平移及旋转变化的方法
2016/03/22 HTML / CSS
团日活动策划书
2014/02/01 职场文书
诉讼代理人授权委托书
2014/04/08 职场文书
推荐信格式要求
2014/05/09 职场文书
村委会贫困证明范本
2014/09/17 职场文书
2014年乡镇纪委工作总结
2014/12/19 职场文书
如何用vue实现网页截图你知道吗
2021/11/17 Vue.js
Python echarts实现数据可视化实例详解
2022/03/03 Python