Angular HMR(热模块替换)功能实现方法


Posted in Javascript onApril 04, 2018

最近一个同事在使用Angular的时候,希望能像VUE那样,修改代码后浏览器不刷新,页面对应修改的组件自动更新的功能。这个功能的名字时HMR (hot module replace)。

稍微研究了一下,发现在angular/cli创建的项目中,实现这个不算太难,步骤如下:

1、首先创建一个src/environments/environment.hmr.ts文件,内容如下

export const environment = {
 production: false,
 hmr: true
};

当然,对应的environment.prod.ts和environment.ts需要增加一个hmr:false.

如果environment.ts里面的hmr设置为ture,那么ng serve --hmr也有同样效果。不过我对热替换功能还不是那么相信,重新刷新浏览器能保证状态更加干净一些,所以让environment.ts中的hmr为false.

2、在.angular-cli.json文件的环境中增加hmr的环境,大致如下:

"environments": {
 ...
 "hmr": "environments/environment.hmr.ts",
}

3、在package.json的scripts中增加一个新的命令。(当然也可以不增加,直接运行ng serve --hmr -e=hmr和运行npm run hmr效果一样)

"scripts": {
 ...
 "hmr": "ng serve --hmr -e=hmr"
}

4、安装hmr模块,命令如下:

npm install --save-dev @angularclass/hmr

5、创建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(currentModule => ngModule = currentModule);
 module.hot.dispose(() => {
  const appRef: ApplicationRef = ngModule.injector.get(ApplicationRef);
  const elements = appRef.components.map(c => c.location.nativeElement);
  const removeOldHosts = createNewHosts(elements);
  ngModule.destroy();
  removeOldHosts();
 });
};

这事热替换的关键,hmrBootstrap会替换原始的bootstrap(下面会看到), 替换后,当有新的模块更新时,hmr会首先移除掉旧有的模块,然后接收新的模块。这些都是发生在浏览器里面。所以页面不会刷新。

6、更新src\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('Ammm.. HMR is not enabled for webpack');
 }
} else {
 bootstrap();
}

这里替换就得启动文件,如果设置为hmr,那么调用hmrBootStrap来启动网页,否则就用过去的

7、现在运行npm run hmr或者ng serve --hmr -e=hmr,就实现了热替换功能。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 学习 - 提高篇
Feb 02 Javascript
javascript 获取网页参数系统
Jul 19 Javascript
简易js代码实现计算器操作
Apr 15 Javascript
Js获取数组最大和最小值示例代码
Oct 29 Javascript
jquery处理json对象
Nov 03 Javascript
jQuery中insertAfter()方法用法实例
Jan 08 Javascript
jQuery循环动画与获取组件尺寸的方法
Feb 02 Javascript
javascript插件开发的一些感想和心得
Feb 28 Javascript
js实现简单的网页换肤效果
Jan 18 Javascript
js实现跟随鼠标移动的小球
Aug 26 Javascript
微信小程序登陆注册功能的实现代码
Dec 10 Javascript
jQuery实现移动端扭蛋机抽奖
Nov 08 jQuery
解决vue中使用swiper插件问题及swiper在vue中的用法
Apr 04 #Javascript
vue基于mint-ui实现城市选择三级联动
Jun 30 #Javascript
vue中mint-ui的使用方法
Apr 04 #Javascript
JS实现访问DOM对象指定节点的方法示例
Apr 04 #Javascript
JS实现DOM删除节点操作示例
Apr 04 #Javascript
JS实现的DOM插入节点操作示例
Apr 04 #Javascript
AngularJS 应用模块化的使用
Apr 04 #Javascript
You might like
数字转英文
2006/12/06 PHP
PHP中__FILE__、dirname与basename用法实例分析
2014/12/01 PHP
php接口技术实例详解
2016/12/07 PHP
PHP使用mysqli操作MySQL数据库的简单方法
2017/02/04 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
js 禁用只读文本框获得焦点时的退格键
2010/04/25 Javascript
心扬JS分页函数代码
2010/09/10 Javascript
JS数学函数Exp使用说明
2012/08/09 Javascript
javascript获取浏览器类型和版本的方法(js获取浏览器版本)
2014/03/13 Javascript
js实现简单的联动菜单效果
2015/08/19 Javascript
IE6兼容透明背景图片及解决方案
2015/08/19 Javascript
js实现tab切换效果实例
2015/09/16 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
JS正则获取HTML元素的方法
2017/03/31 Javascript
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
详解Angular6学习笔记之主从组件
2018/09/05 Javascript
Vue中CSS动画原理的实现
2019/02/13 Javascript
三分钟教你用Node做一个微信哄女友(基友)神器(面向小白)
2019/06/21 Javascript
浅谈webpack和webpack-cli模块源码分析
2020/01/19 Javascript
JS实现手风琴特效
2020/11/08 Javascript
[02:54]DOTA2亚洲邀请赛 VG战队出场宣传片
2015/02/07 DOTA
[02:37]2018DOTA2亚洲邀请赛赛前采访 VP.no[o]ne心中最强SOLO是谁
2018/04/04 DOTA
python自动化测试之从命令行运行测试用例with verbosity
2014/09/28 Python
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
Python实现网站注册验证码生成类
2017/06/08 Python
python 子类调用父类的构造函数实例
2020/03/12 Python
巧用CSS3 border实现图片遮罩效果代码
2012/04/09 HTML / CSS
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
创业计划书如何吸引他人眼球
2014/01/10 职场文书
俄语专业毕业生求职信
2014/07/12 职场文书
工厂标语大全
2014/10/06 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
python实现学生信息管理系统(面向对象)
2022/06/05 Python
Go语言怎么使用变长参数函数
2022/07/15 Golang