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 相关文章推荐
JS下高效拼装字符串的几种方法比较与测试代码
Apr 15 Javascript
使用javascript将时间转换成今天,昨天,前天等格式
Jun 25 Javascript
Vue.js第一天学习笔记(数据的双向绑定、常用指令)
Dec 01 Javascript
Vue方法与事件处理器详解
Dec 01 Javascript
jQuery中 bind的用法简单介绍
Feb 13 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
Aug 03 Javascript
vue watch深度监听对象实现数据联动效果
Aug 16 Javascript
vue.js使用v-model实现表单元素(input) 双向数据绑定功能示例
Mar 08 Javascript
Vue使用zTree插件封装树组件操作示例
Apr 25 Javascript
Electron-vue开发的客户端支付收款工具的实现
May 24 Javascript
javascript+css实现进度条效果
Mar 25 Javascript
vue实现自定义多选按钮
Jul 16 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 递归效率分析
2009/11/24 PHP
PHP面向对象程序设计组合模式与装饰模式详解
2016/12/02 PHP
php获取excel文件数据
2017/04/21 PHP
Javascript操纵Cookie实现购物车程序
2006/11/23 Javascript
javascript对talbe进行动态添加、删除、验证实现代码
2012/03/29 Javascript
JavaScript高级程序设计(第3版)学习笔记7 js函数(上)
2012/10/11 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
2013/01/23 Javascript
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
jquery ajax 局部无刷新更新数据的实现案例
2014/02/08 Javascript
jquery if条件语句的写法
2016/05/19 Javascript
实用又漂亮的BootstrapValidator表单验证插件
2016/05/30 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
最原始的jQuery注册验证方式
2016/10/11 Javascript
浅谈DOM的操作以及性能优化问题-重绘重排
2017/01/08 Javascript
jQuery实现的表格前端排序功能示例
2017/09/18 jQuery
Dropify.js图片宽高自适应的方法
2017/11/27 Javascript
Angular7创建项目、组件、服务以及服务的使用
2019/02/19 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
ant design vue嵌套表格及表格内部编辑的用法说明
2020/10/28 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
Python实现通过文件路径获取文件hash值的方法
2017/04/29 Python
python 实现一个贴吧图片爬虫的示例
2017/10/12 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
python读取Excel实例详解
2018/08/17 Python
python爬取内容存入Excel实例
2019/02/20 Python
python 猴子补丁(monkey patch)
2019/06/26 Python
解决Python中回文数和质数的问题
2019/11/24 Python
python常用运维脚本实例小结
2020/02/14 Python
UGG英国官方网站:UGG UK
2018/02/08 全球购物
时尚设计师手表:The Watch Cabin
2018/10/06 全球购物
C#基础面试题
2016/10/17 面试题
求职信需要的五点内容
2014/02/01 职场文书
汽车服务工程专业自荐信
2014/09/02 职场文书
买卖合同协议书范本
2014/10/18 职场文书
幼儿教师个人总结
2015/02/05 职场文书
智慧人生:永远不需要向任何人解释你自己
2019/08/20 职场文书