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中for循环的效率问题及相关优化
Mar 13 Javascript
jquery移除了live()、die(),新版事件绑定on()、off()的方法
Oct 26 Javascript
js实现右键菜单功能
Nov 28 Javascript
JS实现仿PS的调色板效果完整实例
Dec 21 Javascript
javascript 判断当前浏览器版本并判断ie版本
Feb 17 Javascript
捕获未处理的Promise错误方法
Oct 13 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
Oct 31 Javascript
详解vue 兼容IE报错解决方案
Dec 29 Javascript
微信小程序下拉加载和上拉刷新两种实现方法详解
Sep 05 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
Sep 07 Javascript
vue 实现移动端键盘搜索事件监听
Nov 06 Javascript
JS实现简单控制视频播放倍速的实例代码
Apr 18 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
php字符串截取问题
2006/11/28 PHP
php邮件发送,php发送邮件的类
2011/03/24 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
2014/08/25 PHP
php实现的简单日志写入函数
2015/03/31 PHP
php实现爬取和分析知乎用户数据
2016/01/26 PHP
不要小看注释掉的JS 引起的安全问题
2008/12/27 Javascript
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
网站404页面3秒后跳到首页的实例代码
2013/08/16 Javascript
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
JS实现黑客帝国文字下落效果
2015/09/01 Javascript
如何解决ligerUI布局时Center中的Tab高度大小
2015/11/24 Javascript
深入浅析Node.js 事件循环
2015/12/20 Javascript
简单谈谈json跨域
2016/03/13 Javascript
js添加千分位的实现代码(超简单)
2016/08/01 Javascript
js实现无缝循环滚动
2020/06/23 Javascript
D3.js中强制异步文件读取同步的几种方法
2017/02/06 Javascript
Angular搜索场景中使用rxjs的操作符处理思路
2018/05/30 Javascript
angular中两种表单的区别(响应式和模板驱动表单)
2018/12/06 Javascript
JavaScript实现图片放大预览效果
2020/11/02 Javascript
在Python的Django框架中编写错误提示页面
2015/07/22 Python
Python中__init__.py文件的作用详解
2016/09/18 Python
python中必要的名词解释
2019/11/20 Python
python多线程使用方法实例详解
2019/12/30 Python
如何基于python实现年会抽奖工具
2020/10/20 Python
全球最大的服务市场:Fiverr
2017/01/03 全球购物
英国游戏机和游戏购物网站:365games.co.uk
2018/06/18 全球购物
计算机应用专业学生的自我评价分享
2013/11/03 职场文书
校庆标语集锦
2014/06/25 职场文书
2014年幼儿园德育工作总结
2014/12/17 职场文书
大班下学期幼儿评语
2014/12/30 职场文书
老公保证书
2015/01/17 职场文书
社会主义核心价值观主题教育活动总结
2015/05/07 职场文书
单身证明格式样本
2015/06/15 职场文书
七年级作文(600字3篇)
2019/09/24 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python
Win11 Build 25179预览版发布(附更新内容+ISO官方镜像下载)
2022/08/14 数码科技