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限定复选框的选择个数示例代码
Aug 25 Javascript
Js中使用hasOwnProperty方法检索ajax响应对象的例子
Dec 08 Javascript
详解Document.Cookie
Dec 25 Javascript
javascript事件冒泡简单示例
Jun 20 Javascript
javascript中sort排序实例详解
Jul 24 Javascript
AngularJs ng-route路由详解及实例代码
Sep 14 Javascript
JavaScript自定义分页样式
Jan 17 Javascript
vue 开发一个按钮组件的示例代码
Mar 27 Javascript
微信小程序实现留言板
Oct 31 Javascript
如何在vue里面优雅的解决跨域(路由冲突问题)
Jan 20 Javascript
JavaScript中继承原理与用法实例入门
May 09 Javascript
Jquery如何使用animation动画效果改变背景色的代码
Jul 20 jQuery
解决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可能遇到的问题“无法载入mysql扩展” 的解决方法
2007/04/16 PHP
PHP实现指定字段的多维数组排序函数分享
2015/03/09 PHP
PHP结合Jquery和ajax实现瀑布流特效
2016/01/07 PHP
symfony2.4的twig中date用法分析
2016/03/18 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
自己动手手写jQuery插件总结
2015/01/20 Javascript
JavaScript运算符小结
2015/06/03 Javascript
jQuery实现产品对比功能附源码下载
2016/08/09 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
2017/06/21 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
微信小程序实现选择地址省市区三级联动
2020/06/21 Javascript
原生js实现贪吃蛇游戏
2020/10/26 Javascript
vant 解决tab切换插件标题样式自定义的问题
2020/11/13 Javascript
[54:05]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第一场 1月9日
2021/03/11 DOTA
Python基本数据类型详细介绍
2014/03/11 Python
Python通过future处理并发问题
2017/10/17 Python
python编写分类决策树的代码
2017/12/21 Python
Python针对给定列表中元素进行翻转操作的方法分析
2018/04/27 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
2018/06/11 Python
完美解决Python 2.7不能正常使用pip install的问题
2018/06/12 Python
将tensorflow的ckpt模型存储为npy的实例
2018/07/09 Python
Python基于百度云文字识别API
2018/12/13 Python
python基础梳理(一)(推荐)
2019/04/06 Python
在python中求分布函数相关的包实例
2020/04/15 Python
CSS3实现的闪烁跳跃进度条示例(附源码)
2013/08/19 HTML / CSS
使用CSS3中的calc()属性来以算式表达尺寸数值
2016/06/06 HTML / CSS
Html5让容器充满屏幕高度或自适应剩余高度的布局实现
2020/05/14 HTML / CSS
孤独星球出版物:Lonely Planet Publications
2018/03/17 全球购物
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
世界闻名的衬衫制造商:Savile Row Company
2018/07/30 全球购物
.NET面试题:什么是值类型和引用类型
2016/01/12 面试题
庆祝国庆节演讲稿2014
2014/09/19 职场文书
给校长的建议书范文
2015/09/14 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP