浅谈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 相关文章推荐
可输入的下拉框
Jun 19 Javascript
Track Image Loading效果代码分析
Aug 13 Javascript
JS 拼图游戏 面向对象,注释完整。
Jun 18 Javascript
关于jquery css的使用介绍
Apr 18 Javascript
中文输入法不触发onkeyup事件的解决办法
Jul 09 Javascript
原生JS和JQuery动态添加、删除表格行的方法
May 28 Javascript
JavaScript+CSS实现仿Mootools竖排弹性动画菜单效果
Oct 14 Javascript
JavaScript导航脚本判断当前导航
Jul 12 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
Oct 01 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
Dec 08 Javascript
原生js实现简单的链式操作
Jul 04 Javascript
vue综合组件间的通信详解
Nov 06 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
使用CodeIgniter的类库做图片上传
2014/06/12 PHP
php在apache环境下实现gzip配置方法
2015/04/02 PHP
PHP处理会话函数大总结
2015/08/05 PHP
php 调用ffmpeg获取视频信息的简单实现
2017/04/03 PHP
PHP面向对象之工作单元(实例讲解)
2017/06/26 PHP
通过jquery的$.getJSON做一个跨域ajax请求试验
2011/05/03 Javascript
javascript针对DOM的应用分析(四)
2012/04/15 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
2013/04/28 Javascript
JS模拟按钮点击功能的方法
2015/12/22 Javascript
微信小程序 教程之wxapp视图容器 swiper
2016/10/19 Javascript
JS弹出窗口的运用与技巧大全
2016/11/01 Javascript
深究AngularJS如何获取input的焦点(自定义指令)
2017/06/12 Javascript
jQuery实现的滑块滑动导航效果示例
2018/06/04 jQuery
ExtJs使用自定义插件动态保存表头配置(隐藏或显示)
2018/09/25 Javascript
微信小程序实现轨迹回放的示例代码
2019/12/13 Javascript
微信公众号服务器验证Token步骤图解
2019/12/30 Javascript
浅谈vant组件Picker 选择器选单选问题
2020/11/04 Javascript
为什么推荐使用JSX开发Vue3
2020/12/28 Vue.js
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
深入理解 Python 中的多线程 新手必看
2016/11/20 Python
python去掉行尾的换行符方法
2017/01/04 Python
python监控linux内存并写入mongodb(推荐)
2017/09/11 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
python清除字符串前后空格函数的方法
2018/10/21 Python
对Python信号处理模块signal详解
2019/01/09 Python
python获取指定日期范围内的每一天,每个月,每季度的方法
2019/08/08 Python
Python列表删除元素del、pop()和remove()的区别小结
2019/09/11 Python
python lambda表达式(匿名函数)写法解析
2019/09/16 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
2020/04/22 Python
印刷工程专业应届生求职信
2013/09/29 职场文书
初中生评语大全
2014/04/24 职场文书
汽车运用工程专业求职信
2014/06/18 职场文书
2015大学生自我评价范文
2015/03/03 职场文书
警示教育观后感
2015/06/17 职场文书
2016年党员承诺书范文
2016/03/24 职场文书
Python天气语音播报小助手
2021/09/25 Python