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解决图片缩放及其优化的代码
May 23 Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
May 24 Javascript
jQuery及JS实现循环中暂停的方法
Feb 02 Javascript
深入剖析JavaScript编程中的对象概念
Oct 21 Javascript
jQuery Easyui学习之datagrid 动态添加、移除editor
Jan 27 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
Dec 13 Javascript
JavaScript中创建对象的7种模式详解
Feb 21 Javascript
简单谈谈React中的路由系统
Jul 25 Javascript
JavaScript中使用Async实现异步控制
Aug 15 Javascript
jQuery zTree树插件的使用教程
Aug 16 jQuery
适合前端Vue开发童鞋的跨平台Weex的使用详解
Oct 16 Javascript
vue2.x 通过后端接口代理,获取qq音乐api的数据示例
Oct 30 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函数间的参数传递(值传递/引用传递)
2013/09/23 PHP
PHP加密解密实例分析
2015/12/25 PHP
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
Javascript 模式实例 观察者模式
2009/10/24 Javascript
javascript instanceof 与typeof使用说明
2010/01/11 Javascript
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
jquery实现奇偶行赋值不同css值
2012/02/17 Javascript
jQuery实现动画效果的实例代码
2013/05/07 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
JavaScript数组的一些奇葩行为
2016/01/25 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
AngularJS 表达式详解及实例代码
2016/09/14 Javascript
通过js动态创建标签,并设置属性方法
2018/02/24 Javascript
详解vue中async-await的使用误区
2018/12/05 Javascript
简单了解Vue + ElementUI后台管理模板
2020/04/07 Javascript
解决Vue中的生命周期beforeDestory不触发的问题
2020/07/21 Javascript
Python实现建立SSH连接的方法
2015/06/03 Python
Tensorflow 合并通道及加载子模型的方法
2018/07/26 Python
Django框架模板用法入门教程
2019/11/04 Python
安装并免费使用Pycharm专业版(学生/教师)
2020/09/24 Python
Trip.com香港网站:Ctrip携程旗下,全球最大的网上旅游社之一
2016/08/01 全球购物
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
英国领先的维生素和营养补充剂直接供应商:Healthspan
2019/04/22 全球购物
全球最大的生存食品、水和装备专用在线市场:BePrepared.com
2020/01/02 全球购物
美术专业个人自我评价
2014/01/18 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
学术诚信承诺书
2014/05/26 职场文书
消防安全宣传标语
2014/06/07 职场文书
暑假安全教育广播稿
2014/09/10 职场文书
2014年国庆节演讲稿
2014/09/19 职场文书
预备党员思想汇报1000字
2014/10/07 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
钳工实训报告总结
2014/11/04 职场文书
2015年评职称工作总结范文
2015/04/20 职场文书
建党伟业的观后感
2015/06/01 职场文书
面试必问:圣杯布局和双飞翼布局的区别
2021/05/13 HTML / CSS