浅谈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 相关文章推荐
JQuery入门——事件切换之hover()方法应用介绍
Feb 05 Javascript
JavaScript从数组中删除指定值元素的方法
Mar 18 Javascript
JavaScript正则表达式的分组匹配详解
Feb 13 Javascript
原生javascript实现解析XML文档与字符串
Mar 01 Javascript
浅析Javascript ES6新增值比较函数Object.is
Aug 24 Javascript
BootStrap栅格系统、表单样式与按钮样式源码解析
Jan 20 Javascript
基于JavaScript实现移动端无限加载分页
Mar 27 Javascript
layui问题之模拟select点击事件的实例讲解
Aug 15 Javascript
jQuery实现基本淡入淡出效果的方法详解
Sep 05 jQuery
express + jwt + postMan验证实现持久化登录
Jun 05 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
Apr 10 Javascript
js面向对象封装级联下拉菜单列表的实现步骤
Feb 08 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
德生PL660的电路分析和打磨
2021/03/02 无线电
DOMXML函数笔记
2006/10/09 PHP
PHP中phar包的使用教程
2017/06/14 PHP
JavaScript 数组运用实现代码
2010/04/13 Javascript
基于jquery实现的服务器验证控件的启用和禁用代码
2010/04/27 Javascript
JavaScript中为元素加上name属性的方法
2011/05/09 Javascript
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
2013/05/27 Javascript
二叉树先序遍历的非递归算法具体实现
2014/01/09 Javascript
jquery让返回的内容显示在特定div里(代码少而精悍)
2014/06/23 Javascript
JavaScript实现计算字符串中出现次数最多的字符和出现的次数
2015/03/12 Javascript
JavaScript中的small()方法使用详解
2015/06/08 Javascript
JS函数arguments数组获得实际传参数个数的实现方法
2016/05/28 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
2016/09/08 Javascript
基于jQuery实现中英文切换导航条效果
2016/09/18 Javascript
详解Javascript中DOM的范围
2017/02/13 Javascript
Angular浏览器插件Batarang介绍及使用
2018/02/07 Javascript
使用Angular CLI从蓝本生成代码详解
2018/03/24 Javascript
vue数组对象排序的实现代码
2018/06/20 Javascript
Vue刷新修改页面中数据的方法
2018/09/16 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
2019/06/19 Javascript
vue项目初始化到登录login页面的示例
2019/10/31 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
Python学习pygal绘制线图代码分享
2017/12/09 Python
Ubuntu+python将nii图像保存成png格式
2019/07/18 Python
python 读取数据库并绘图的实例
2019/12/03 Python
Pyqt5自适应布局实例
2019/12/13 Python
基于OpenCV的网络实时视频流传输的实现
2020/11/15 Python
VC++笔试题
2014/10/13 面试题
音乐学院硕士生的自我评价分享
2013/11/01 职场文书
幼儿园运动会入场词
2014/02/10 职场文书
小学生作文评语
2014/04/18 职场文书
职场新人刚入职工作总结该怎么写?
2019/05/15 职场文书
sql通过日期判断年龄函数的示例代码
2021/07/16 SQL Server
Java实现学生管理系统(IO版)
2022/02/24 Java/Android