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中的array数组使用技巧
Jan 31 Javascript
jQuery.event兼容各浏览器的event详细解析
Dec 18 Javascript
Javascript访问器属性实例分析
Dec 30 Javascript
JavaScript基础知识及常用方法总结
Jan 10 Javascript
jQuery ajax提交Form表单实例(附demo源码)
Apr 06 Javascript
Node.js应用设置安全的沙箱环境
Apr 23 Javascript
详解关于vue2.0工程发布上线操作步骤
Sep 27 Javascript
Vue 报错TypeError: this.$set is not a function 的解决方法
Dec 17 Javascript
JavaScript进阶(二)词法作用域与作用域链实例分析
May 09 Javascript
vue实现虚拟列表功能的代码
Jul 28 Javascript
使用javascript解析二维码的三种方式
Nov 11 Javascript
Vue.js中v-bind指令的用法介绍
Mar 13 Vue.js
解决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+XML 制作简单的留言本 图文教程
2009/11/02 PHP
PHP如何通过AJAX方式实现登录功能
2015/11/23 PHP
apache php mysql开发环境安装教程
2016/07/28 PHP
laravel实现批量更新多条记录的方法示例
2017/10/22 PHP
CentOS7编译安装php7.1的教程详解
2019/04/18 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
2013/10/23 Javascript
JavaScript关闭当前页面(窗口)不带任何提示
2014/03/26 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
JavaScript 节流函数 Throttle 详解
2016/07/04 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
2017/02/16 Javascript
微信小程序 template模板详解及实例
2017/02/21 Javascript
Bootstrap Table从零开始
2017/06/30 Javascript
微信小程序使用Socket的实例
2017/09/19 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
js如何获取图片url的Blob值并预览示例代码
2019/03/07 Javascript
详解javascript函数写法大全
2019/03/25 Javascript
基于better-scroll 实现歌词联动功能的代码
2020/05/07 Javascript
js 获取扫码枪输入数据的方法
2020/06/10 Javascript
Python迭代器和生成器介绍
2015/03/06 Python
Python中用Decorator来简化元编程的教程
2015/04/13 Python
python ddt实现数据驱动
2018/03/14 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
2018/04/20 Python
Python、 Pycharm、Django安装详细教程(图文)
2019/04/12 Python
详解PANDAS 数据合并与重塑(join/merge篇)
2019/07/09 Python
python文字转语音的实例代码分析
2019/11/12 Python
CSS3移动端vw+rem不依赖JS实现响应式布局的方法
2019/01/23 HTML / CSS
澳大利亚潮流尖端的快时尚品牌:Cotton On
2016/09/26 全球购物
Diamondback自行车:拥有你的冒险
2019/04/22 全球购物
英国儿童鞋和靴子:Start-Rite
2019/05/06 全球购物
杭州SQL浙江浙大网新恩普软件有限公司
2013/07/27 面试题
英语翻译系毕业生求职信
2013/09/29 职场文书
计算机专业学生的自我评价
2013/12/15 职场文书
后备干部推荐材料
2014/12/24 职场文书
2015年银行大堂经理工作总结
2015/04/24 职场文书