详解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.load的方法可以一直load下去
Mar 28 Javascript
JS在TextArea光标位置插入文字并实现移动光标到文字末尾
Jun 21 Javascript
Javascript 运动中Offset的bug解决方案
Dec 24 Javascript
使用iojs的jsdom库实现同步系统时间
Apr 20 Javascript
工作中比较实用的JavaScript验证和数据处理的干货(经典)
Aug 03 Javascript
微信小程序 参数传递详解
Oct 24 Javascript
jquery validation验证表单插件
Jan 07 Javascript
vue中使用props传值的方法
May 08 Javascript
vue中选中多个选项并且改变选中的样式的实例代码
Sep 16 Javascript
如何构建一个Vue插件并生成npm包
Oct 26 Javascript
解决ant-design-vue中menu菜单无法默认展开的问题
Oct 31 Javascript
原生JavaScript实现换肤
Feb 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
完美解决phpexcel导出到xls文件出现乱码的问题
2016/10/29 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
Prototype Selector对象学习
2009/07/23 Javascript
测试你的JS的掌握程度的代码
2009/12/09 Javascript
IE6弹出“已终止操作”的解决办法
2010/11/27 Javascript
JS完整获取IE浏览器信息包括类型、版本、语言等等
2014/05/22 Javascript
jQuery学习笔记之toArray()
2014/06/09 Javascript
jQuery中noconflict函数的实现原理分解
2015/02/03 Javascript
如何实现JavaScript动态加载CSS和JS文件
2020/12/28 Javascript
jQuery解析json格式数据简单实例
2016/01/22 Javascript
JavaScript数组方法总结分析
2016/05/06 Javascript
jQuery Ajax 上传文件处理方式介绍(推荐)
2016/06/30 Javascript
基于Vue.js实现数字拼图游戏
2016/08/02 Javascript
jQuery+json实现动态创建复杂表格table的方法
2016/10/25 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
9102年webpack4搭建vue项目的方法步骤
2019/02/20 Javascript
如何为你的JavaScript代码日志着色详解
2019/04/08 Javascript
javascript随机变色实例代码
2019/10/15 Javascript
JS操作字符串转数字的常见方法示例
2019/10/29 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
[01:31]DOTA2上海特级锦标赛 SECRET战队完整宣传片
2016/03/16 DOTA
python写的一个文本编辑器
2014/01/23 Python
python编程实现归并排序
2017/04/14 Python
django开发教程之利用缓存文件进行页面缓存的方法
2017/11/10 Python
python绘制动态曲线教程
2020/02/24 Python
python 多线程共享全局变量的优劣
2020/09/24 Python
Html5之svg可缩放矢量图形_动力节点Java学院整理
2017/07/17 HTML / CSS
REISS美国官网:伦敦最受欢迎的时尚品牌
2019/08/16 全球购物
铭万公司.net面试题笔试题
2014/07/20 面试题
大学毕业生通用自我评价
2014/01/05 职场文书
七一党建活动方案
2014/01/28 职场文书
幼师求职信
2014/06/23 职场文书
组织生活会表态发言材料
2014/10/17 职场文书
工程质检员岗位职责
2015/04/08 职场文书
python3使用diagrams绘制架构图的步骤
2021/04/08 Python
MySQL提升大量数据查询效率的优化神器
2022/07/07 MySQL