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 相关文章推荐
jQuery中slideUp()方法用法分析
Dec 24 Javascript
javascript实现保留两位小数的多种方法
Dec 18 Javascript
javascript弹出带文字信息的提示框效果
Jul 19 Javascript
浅谈javascript中的三种弹窗
Oct 21 Javascript
在JSP中如何实现MD5加密的方法
Nov 02 Javascript
详解微信小程序开发之——wx.showToast(OBJECT)的使用
Jan 18 Javascript
vuex中使用对象展开运算符的示例
Sep 25 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
Dec 19 Javascript
详解微信小程序canvas圆角矩形的绘制的方法
Aug 22 Javascript
iView-admin 动态路由问题的解决方法
Oct 03 Javascript
uni app仿微信顶部导航条功能
Sep 17 Javascript
vue递归获取父元素的元素实例
Aug 07 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
mysql时区问题
2008/03/26 PHP
php实现给二维数组中所有一维数组添加值的方法
2017/02/04 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
2017/04/15 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
2018/12/07 PHP
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
node.js使用require()函数加载模块
2014/11/26 Javascript
JS+CSS相对定位实现的下拉菜单
2015/10/06 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
通过Tabs方法基于easyUI+bootstrap制作工作站
2016/03/28 Javascript
实例浅析js的this
2016/12/11 Javascript
Js经典案例的实例代码
2018/05/10 Javascript
Rollup处理并打包JS文件项目实例代码
2018/05/31 Javascript
爬虫利器Puppeteer实战
2019/01/09 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
2019/04/19 Javascript
原生js实现点击轮播切换图片
2020/02/11 Javascript
python采用getopt解析命令行输入参数实例
2014/09/30 Python
python相似模块用例
2016/03/04 Python
Python实现中文数字转换为阿拉伯数字的方法示例
2017/05/26 Python
Python request设置HTTPS代理代码解析
2018/02/12 Python
Python selenium自动化测试模型图解
2020/04/15 Python
Python enumerate() 函数如何实现索引功能
2020/06/29 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
2020/07/14 Python
python图片合成的示例
2020/11/09 Python
Python实现京东抢秒杀功能
2021/01/25 Python
波兰最大的儿童服装连锁店之一:5.10.15.
2018/02/11 全球购物
日本酒店、民宿、温泉旅馆、当地旅行团中文预订:e路东瀛
2019/12/09 全球购物
Oasis服装官网:时尚女装在线
2020/07/09 全球购物
作弊检讨书1000字
2014/02/01 职场文书
学校师德师风自我剖析材料
2014/09/29 职场文书
六查六看自查报告
2014/10/14 职场文书
幼师辞职信范文大全
2015/05/12 职场文书
干部考核工作总结2015
2015/07/24 职场文书
升学宴家长致辞
2015/07/27 职场文书
多属性、多分类MySQL模式设计
2021/04/05 MySQL
深入探讨opencv图像矫正算法实战
2021/05/21 Python