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 相关文章推荐
如何取得中文输入的真实长度?
Jun 24 Javascript
幻灯片带网页设计中的20个奇妙应用示例小结
May 27 Javascript
JavaScript常用函数工具集:lao-utils
Mar 01 Javascript
js提交form表单,并传递参数的实现方法
May 25 Javascript
Node.js获取前端ajax提交的request信息
Feb 20 Javascript
jquery实现侧边栏左右伸缩效果的示例
Dec 19 jQuery
使用vue实现grid-layout功能实例代码
Jan 05 Javascript
解决vue处理axios post请求传参的问题
Mar 05 Javascript
Java设计中的Builder模式的介绍
Mar 22 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
Jul 07 Javascript
vue 根据选择条件显示指定参数的例子
Nov 09 Javascript
如何使用three.js 制作一个三维的推箱子游戏
Jul 29 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 file_get_contents 函数超时的几种解决方法
2009/07/30 PHP
基于PHP 面向对象之成员方法详解
2013/05/04 PHP
基于php设计模式中单例模式的应用分析
2013/05/15 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
2014/11/18 PHP
php实现微信公众号无限群发
2015/10/11 PHP
基于PHP实现假装商品限时抢购繁忙的效果
2015/10/16 PHP
formValidator3.3的ajaxValidator一些异常分析
2011/07/12 Javascript
javascript html5移动端轻松实现文件上传
2020/03/27 Javascript
js实现非常棒的弹出div
2016/10/06 Javascript
js中的触发事件对象event.srcElement与event.target详解
2017/03/15 Javascript
基于JS实现前端压缩上传图片的实例代码
2019/05/14 Javascript
vue项目创建步骤及路由router
2020/01/14 Javascript
JavaScript中的this/call/apply/bind的使用及区别
2020/03/06 Javascript
解决vue单页面 回退页面 keeplive 缓存问题
2020/07/22 Javascript
python读取Android permission文件
2013/11/01 Python
Python的高级Git库 Gittle
2014/09/22 Python
Python实现的ini文件操作类分享
2014/11/20 Python
在Python的Django框架中编写错误提示页面
2015/07/22 Python
分享Python字符串关键点
2015/12/13 Python
Python编程中time模块的一些关键用法解析
2016/01/19 Python
Python的requests网络编程包使用教程
2016/07/11 Python
python编程之requests在网络请求中添加cookies参数方法详解
2017/10/25 Python
Python下载网络小说实例代码
2018/02/03 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
2018/05/07 Python
基于Pandas读取csv文件Error的总结
2018/06/15 Python
influx+grafana自定义python采集数据和一些坑的总结
2018/09/17 Python
python并发编程 Process对象的其他属性方法join方法详解
2019/08/20 Python
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
你所知道的集合类都有哪些?主要方法?
2012/12/31 面试题
商务英语专业毕业生求职信
2014/07/06 职场文书
地理信息科学专业推荐信
2014/09/08 职场文书
2014年医院工作总结
2014/11/20 职场文书
为自己工作观后感
2015/06/11 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书
nginx location优先级的深入讲解
2021/03/31 Servers
Python词云的正确实现方法实例
2021/05/08 Python