详解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 flash激活
Oct 19 Javascript
Js+Dhtml:WEB程序员简易开发工具包(预先体验版)
Nov 07 Javascript
用JS控制回车事件的代码
Feb 20 Javascript
javascript学习笔记(二十) 获得和设置元素的特性(属性)
Jun 20 Javascript
jquery统计用户选中的复选框的个数
Jun 06 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
Aug 18 Javascript
c#程序员对TypeScript的认识过程
Jun 19 Javascript
JavaScript数据存储 Cookie篇
Jul 02 Javascript
Node.js的环境安装配置(使用nvm方式)
Oct 11 Javascript
Javascript中字符串和数字的操作方法整理
Jan 22 Javascript
JS检测是否可以访问公网服务器功能代码
Jun 19 Javascript
vue-cli4使用全局less文件中的变量配置操作
Oct 21 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
做一个有下拉功能的留言版
2006/10/09 PHP
PHP 图片上传代码
2011/09/13 PHP
浅析php学习的路线图
2013/07/10 PHP
php读取文件内容的方法汇总
2015/01/24 PHP
Ubuntu12下编译安装PHP5.3开发环境
2015/03/27 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
2019/10/30 PHP
学习YUI.Ext 第二天
2007/03/10 Javascript
jquery 上下滚动广告
2009/06/17 Javascript
浅谈javascript 面向对象编程
2009/10/28 Javascript
封装的原生javascript弹出层代码
2010/09/24 Javascript
jQuery登陆判断简单实现代码
2013/04/21 Javascript
Javascript全局变量var与不var的区别深入解析
2013/12/09 Javascript
js保留小数点后几位的写法
2014/01/03 Javascript
JavaScript仿支付宝密码输入框
2015/12/29 Javascript
解决Vue在封装了Axios后手动刷新页面拦截器无效的问题
2018/11/08 Javascript
Vue项目引发的「过滤器」使用教程
2019/03/12 Javascript
Python urllib模块urlopen()与urlretrieve()详解
2013/11/01 Python
Python中类的继承代码实例
2014/10/28 Python
Python进程通信之匿名管道实例讲解
2015/04/11 Python
举例讲解Python中metaclass元类的创建与使用
2016/06/30 Python
利用python实现简单的循环购物车功能示例代码
2017/07/05 Python
Python tkinter label 更新方法
2018/10/11 Python
Python UnboundLocalError和NameError错误根源案例解析
2018/10/31 Python
Python一行代码实现快速排序的方法
2019/04/30 Python
Python使用贪婪算法解决问题
2019/10/22 Python
python内置模块collections知识点总结
2019/12/19 Python
Python递归调用实现数字累加的代码
2020/02/25 Python
Python之qq自动发消息的示例代码
2021/02/18 Python
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
丝绸和人造花卉、植物和树木:Nearly Natural
2018/11/28 全球购物
室内设计专业个人的自我评价
2013/12/18 职场文书
父母对孩子说的话
2014/04/12 职场文书
数控机床专业自荐信
2014/05/19 职场文书
计算机毕业生自荐信
2014/06/12 职场文书
面试分析分布式架构Redis热点key大Value解决方案
2022/03/13 Redis