浅谈Webpack多页应用HMR卡住问题


Posted in Javascript onApril 24, 2019

起因

在公司搭建了套webpack多页面应用脚手架,开始用着很爽,解决了既想使用Vue的模块化开发,又想做多页打包上线管理的初衷,但是随着业务项目的增加,我发现npm run dev的时候,每次热加载,webpack的反应都很慢。

基本会卡在

94% assets optimization95% emitting

这个步骤很久

准备具体定位一下问题的原因。由于项目基于vue-cli改写的多页应用脚手架,手动重写了HtmlWebpackPlugin插件,所以基本猜测和这个有关,后来证明也真的是这个引起的。

我们可以在package.json中启动dev的时候添加--profile命令,去看启动的详情。

浅谈Webpack多页应用HMR卡住问题

我们可以看到,asset optimization过程耗时2s左右,有时候会更长,所以基本确定就是这个地方卡住了HMR。

那么问题来了,怎么优化这里?

优化思路-1

第一想法是,在dev的时候,加入参数或手动更改config,只针对当前开发的项目进行模块的加载。

更改webpack配置是比较直接的方案,比如把当前启动的目录配置好(buildingPage), new HtmlWEbpackPlugin的时候进行判断即可。

浅谈Webpack多页应用HMR卡住问题

第二个方案,当然也可以手写webpack-dev-server。

dev-server这个在老版本是在build目录下面的,比较方便改动重写,然而新的版本,是在node_modules中的已经加载的模块,

浅谈Webpack多页应用HMR卡住问题

重写的话需要自己把这个东东搞一套,加入参数进行判断处理,本人还没有时间进行尝试,如果有人有时间的可以试试能否改善HMR效率。

实践证明第一个方案确实会提高HMR速度,但由于项目是多人共同开发和维护,每个开发者更改自己的config配置,极容易造成提交svn\git冲突,或忘记修改config等状况,所以除了个人维护的项目,并不建议这么做。

优化思路-2

其实这个问题的具体原因就是改为多入口之后,在HtmlWebpackPlugin中会对每一个入口文件都执行一遍emit中所有代码逻辑,正是这个原因影响了速度。

在看一些参考资料之后,我发现已经有现有的造轮子可以使用了,就是 [html-webpack-plugin-for-multihtml] (https://github.com/daifee/html-webpack-plugin-for-multihtml)

该插件通过在webpack done钩子函数中设置相关变量,来保证原html-webpack-plugin插件中emit仅触发一次全部流程。来达到提速的效果。升级以后,修改文案,HMR的速度从原来的秒级改为毫秒级。

浅谈Webpack多页应用HMR卡住问题

可以看出 asset optimization已经优化到毫秒级。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中的prototype使用说明
Apr 13 Javascript
基于JS实现的倒计时程序实例
Jul 24 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
Oct 10 Javascript
Vue概念及常见命令介绍(1)
Dec 08 Javascript
jquery Ajax 全局调用封装实例详解
Jan 16 Javascript
Vue.js实现的计算器功能完整示例
Jul 11 Javascript
layDate日期控件使用方法详解
Nov 15 Javascript
JS字典Dictionary类定义与用法示例
Feb 01 Javascript
新手简单了解vue
May 29 Javascript
简述pm2常用命令集合及配置文件说明
May 30 Javascript
vue el-table实现自定义表头
Dec 11 Javascript
微信小程序整个页面的自动适应布局的实现
Jul 12 Javascript
微信小程序实现跳转的几种方式总结(推荐)
Apr 24 #Javascript
vue模仿网易云音乐的单页面应用
Apr 24 #Javascript
微信小程序分享功能onShareAppMessage(options)用法分析
Apr 24 #Javascript
详解关于webpack多入口热加载很慢的原因
Apr 24 #Javascript
微信小程序实现的一键连接wifi功能示例
Apr 24 #Javascript
vue router 通过路由来实现切换头部标题功能
Apr 24 #Javascript
js实现全选反选不选功能代码详解
Apr 24 #Javascript
You might like
PHP中的正则表达式函数介绍
2012/02/27 PHP
关于PHP递归算法和应用方法介绍
2013/04/15 PHP
php操作mongoDB实例分析
2014/12/29 PHP
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
2016/07/09 PHP
ThinkPHP中类的构造函数_construct()与_initialize()的区别详解
2017/03/13 PHP
PHP基于GD2函数库实现验证码功能示例
2019/01/27 PHP
jquery 选择器部分整理
2009/10/28 Javascript
js Date自定义函数 延迟脚本执行
2010/03/10 Javascript
JavaScript学习笔记之定时器
2015/01/22 Javascript
使用jQuery UI库开发Web界面的简单入门指引
2016/04/22 Javascript
JS未跨域操作iframe里的DOM
2016/06/01 Javascript
AngularJS入门教程之与服务器(Ajax)交互操作示例【附完整demo源码下载】
2016/11/02 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
jquery表单提交带错误信息提示效果
2017/03/09 Javascript
jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】
2017/03/15 Javascript
bootstrap日期控件问题(双日期、清空等问题解决)
2017/04/19 Javascript
简单实现js上传文件功能
2017/08/21 Javascript
vue实现简单的MVVM框架
2018/08/05 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
[50:58]2018DOTA2亚洲邀请赛3月29日 小组赛A组OpTic VS Newbee
2018/03/30 DOTA
[48:24]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第一场 12.09
2020/12/12 DOTA
python利用beautifulSoup实现爬虫
2014/09/29 Python
Python聊天室实例程序分享
2016/01/05 Python
django文档学习之applications使用详解
2018/01/29 Python
django项目中使用手机号登录的实例代码
2019/08/15 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
2020/05/20 Python
纯CSS3实现移动端展开和收起效果的示例代码
2020/04/26 HTML / CSS
探索欧洲最好的品牌:Bombinate
2019/06/14 全球购物
Bata印度官网:源自欧洲舒适鞋履品牌
2020/01/30 全球购物
Android面试宝典
2013/08/06 面试题
Linux开机引导的步骤是什么
2015/10/19 面试题
法制演讲稿
2014/09/10 职场文书
护士求职自荐信
2015/03/25 职场文书
酒店工程部主管岗位职责
2015/04/16 职场文书