详解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动态创建上传表单通过iframe模拟Ajax实现无刷新
Feb 20 Javascript
JavaScript通过select动态更换图片的方法
Mar 23 Javascript
JavaScript判断是否为数字的4种方法及效率比较
Apr 01 Javascript
理解javascript中的原型和原型链
Jul 30 Javascript
javascript实现的左右无缝滚动效果
Sep 19 Javascript
hovertree插件实现二级树形菜单(简单实用)
Dec 28 Javascript
基于javascript中的typeof和类型判断(详解)
Oct 27 Javascript
解决vue页面刷新或者后退参数丢失的问题
Mar 13 Javascript
JS获取子节点、父节点和兄弟节点的方法实例总结
Jul 06 Javascript
vue.js动画中的js钩子函数的实现
Jul 06 Javascript
详解easyui基于 layui.laydate日期扩展组件
Jul 18 Javascript
Node.js 使用request模块下载文件的实例
Sep 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 判断常量,变量和函数是否存在
2009/04/26 PHP
Nginx环境下PHP flush失效的解决方法
2016/10/19 PHP
详解PHP 二维数组排序保持键名不变
2019/03/06 PHP
PHP+Oracle本地开发环境搭建方法详解
2019/04/01 PHP
Jquery截取中文字符串的实现代码
2010/12/22 Javascript
JS小功能(offsetLeft实现图片滚动效果)实例代码
2013/11/28 Javascript
jQuery中html()方法用法实例
2014/12/25 Javascript
javascript实现画不相交的圆
2015/04/07 Javascript
针对初学者的jQuery入门指南
2015/08/15 Javascript
jQuery实现的仿select功能代码
2015/08/19 Javascript
JS与jQuery遍历Table所有单元格内容的方法
2015/12/07 Javascript
jQuery实现二维码扫描功能
2017/01/09 Javascript
创建echart多个联动的示例代码
2018/11/23 Javascript
利用Dectorator分模块存储Vuex状态的实现
2019/02/05 Javascript
JS异步执行结果获取的3种解决方式
2019/02/19 Javascript
Vue自定义属性实例分析
2019/02/23 Javascript
JavaScript高阶教程之“==”隐藏下的类型转换
2019/04/11 Javascript
vue路由对不同界面进行传参及跳转的总结
2019/04/20 Javascript
react实现antd线上主题动态切换功能
2019/08/12 Javascript
vue滑动吸顶及锚点定位的示例代码
2020/05/10 Javascript
vue+axios全局添加请求头和参数操作
2020/07/24 Javascript
[00:32]2018DOTA2亚洲邀请赛Newbee出场
2018/04/03 DOTA
用Python的SimPy库简化复杂的编程模型的介绍
2015/04/13 Python
python游戏开发之视频转彩色字符动画
2019/04/26 Python
OpenCV-Python 摄像头实时检测人脸代码实例
2019/04/30 Python
Python 3.6 -win64环境安装PIL模块的教程
2019/06/20 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
2019/06/26 Python
Win10+GPU版Pytorch1.1安装的安装步骤
2019/09/27 Python
使用turtle绘制五角星、分形树
2019/10/06 Python
贝玲妃美国官方网站:Benefit美国
2016/08/28 全球购物
财务会计专业应届毕业生求职信
2013/10/18 职场文书
骨干教师培训制度
2014/01/13 职场文书
先进事迹演讲稿
2014/09/01 职场文书
法人委托书范本格式
2014/09/15 职场文书
2014标准社保办理委托书
2014/10/06 职场文书
个人工作保证书
2015/02/28 职场文书