浅谈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的.animate()函数在IE6下的问题
Dec 03 Javascript
JavaScript中实现单体模式分享
Jan 29 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
Sep 06 Javascript
JS实现3D图片旋转展示效果代码
Sep 22 Javascript
js实现动态加载脚本的方法实例汇总
Nov 02 Javascript
全屏滚动插件fullPage.js使用实例解析
Oct 21 Javascript
老生常谈Bootstrap媒体对象
Jul 06 Javascript
React Native基础入门之初步使用Flexbox布局
Jul 02 Javascript
js使用swiper实现层叠轮播效果实例代码
Dec 12 Javascript
微信小程序在text文本实现多种字体样式
Nov 08 Javascript
JavaScript实现好看的跟随彩色气泡效果
Feb 06 Javascript
微信小程序学习总结(四)事件与冒泡实例分析
Jun 04 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 Class 文章
2007/04/04 PHP
php开发文档 会员收费1期
2012/08/14 PHP
php添加文章时生成静态HTML文章的实现代码
2013/02/17 PHP
解析php二分法查找数组是否包含某一元素
2013/05/23 PHP
ThinkPHP CURD方法之order方法详解
2014/06/18 PHP
PHP文件上传之多文件上传的实现思路
2016/01/27 PHP
PHP单例模式定义与使用实例详解
2017/02/06 PHP
jQuery TextBox自动完成条
2009/07/22 Javascript
javascript控制frame,iframe的src属性代码
2009/12/31 Javascript
js 全兼容可高亮二级缓冲折叠菜单
2010/06/04 Javascript
中止javascript执行的方法
2014/02/14 Javascript
js实现索引图片切换效果
2015/11/21 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
浅谈jquery中next与siblings的区别
2016/10/27 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
2016/11/07 Javascript
Angular中封装fancyBox(图片预览)遇到问题小结
2017/09/01 Javascript
python爬取安居客二手房网站数据(实例讲解)
2017/10/19 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
2018/08/29 Javascript
JS常用排序方法实例代码解析
2020/03/03 Javascript
Python打印斐波拉契数列实例
2015/07/07 Python
python安装cx_Oracle模块常见问题与解决方法
2017/02/21 Python
用python3 返回鼠标位置的实现方法(带界面)
2019/07/05 Python
PHP统计代码行数的小代码
2019/09/19 Python
pytorch 修改预训练model实例
2020/01/18 Python
python3中sys.argv的实例用法
2020/04/24 Python
华为旗下电子商务平台:华为商城
2016/08/06 全球购物
澳大利亚相机之家:Camera House
2017/11/30 全球购物
ALDO英国官网:加拿大女鞋品牌
2018/02/19 全球购物
俄罗斯达美乐比萨外送服务:Domino’s Pizza
2020/12/18 全球购物
阿联酋最好的手机、电子产品和家用电器网上商店:Eros Digital Home
2020/08/09 全球购物
自我鉴定怎么写
2014/01/12 职场文书
信息总监管理职责范本
2014/03/08 职场文书
吨的认识教学反思
2014/04/27 职场文书
观看信仰心得体会
2014/09/04 职场文书
2014年体检中心工作总结
2014/12/23 职场文书
Nginx反向代理多个服务器的实现方法
2021/03/31 Servers