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的函数
Jan 31 Javascript
使用prototype.js进行异步操作
Feb 07 Javascript
js实现简单模态窗口,背景灰显
Nov 14 Javascript
jQuery each()方法的使用方法
Mar 18 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
Feb 17 Javascript
日常收集整理的JavaScript常用函数方法
Dec 10 Javascript
浅析JavaScript中var that=this
Feb 17 Javascript
详解使用Visual Studio Code对Node.js进行断点调试
Sep 14 Javascript
Mac中安装nvm的教程分享
Dec 11 Javascript
老生常谈JavaScript获取CSS样式的方法(兼容各浏览器)
Sep 19 Javascript
浅谈vue异步数据影响页面渲染
Oct 29 Javascript
js实现简单的点名器随机色实例代码
Sep 20 Javascript
解决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
Zerg建筑一览
2020/03/14 星际争霸
require(),include(),require_once()和include_once()区别
2008/03/27 PHP
PHP实现获取域名的方法小结
2014/11/05 PHP
FastCGI 进程意外退出造成500错误
2015/07/26 PHP
php验证码生成代码
2015/11/11 PHP
php使用正则表达式获取字符串中的URL
2016/12/29 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
让您的菜单不离网站
2006/10/03 Javascript
jquery mobile事件多次绑定示例代码
2013/09/13 Javascript
javascript在子页面中函数无法调试问题解决方法
2014/01/17 Javascript
原生 JS Ajax,GET和POST 请求实例代码
2016/06/08 Javascript
Bootstrap面板使用方法
2017/01/16 Javascript
vue slot 在子组件中显示父组件传递的模板
2018/03/02 Javascript
ES6中Set和Map用法实例详解
2020/03/02 Javascript
有趣的JavaScript隐式类型转换操作实例分析
2020/05/02 Javascript
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
JavaScript实现鼠标移入随机变换颜色
2020/11/24 Javascript
vue使用exif获取图片旋转,压缩的示例代码
2020/12/11 Vue.js
python插入排序算法的实现代码
2013/11/21 Python
Python利用IPython提高开发效率
2016/08/10 Python
Python列表list排列组合操作示例
2018/12/18 Python
django 消息框架 message使用详解
2019/07/22 Python
Python extract及contains方法代码实例
2020/09/11 Python
Pycharm 如何一键加引号的方法步骤
2021/02/05 Python
美国汽车性能部件和赛车零件网站:Vivid Racing
2018/03/27 全球购物
电子商务专业个人的自我评价分享
2013/10/29 职场文书
一个大学生十年的职业规划
2014/01/17 职场文书
租房安全协议书
2014/08/20 职场文书
个人总结与自我评价
2014/09/18 职场文书
旷课检讨书范文
2015/01/27 职场文书
2015年新农村建设工作总结
2015/05/22 职场文书
信用卡催款律师函
2015/05/27 职场文书
常住证明范本
2015/06/23 职场文书
校园运动会广播稿
2015/08/19 职场文书
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
Python socket如何解析HTTP请求内容
2022/02/12 Python