浅谈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 相关文章推荐
[原创]提供复制本站内容时出现,该文章转自脚本之家等字样的js代码
Mar 27 Javascript
摘自百度的图片轮换效果代码
Nov 19 Javascript
javascript里绝对用的上的字符分割函数总结
Jul 31 Javascript
jquery实现的仿天猫侧导航tab切换效果
Aug 24 Javascript
浅析js中substring和substr的方法
Nov 09 Javascript
JS解决iframe之间通信和自适应高度的问题
Aug 24 Javascript
js指定步长实现单方向匀速运动
Jul 17 Javascript
bootstrap-Treeview实现级联勾选
Nov 23 Javascript
浅谈Vue下使用百度地图的简易方法
Mar 23 Javascript
解决layer.confirm快速点击会重复触发事件的问题
Sep 23 Javascript
javascript实现摄像头拍照预览
Sep 30 Javascript
原生JS运动实现轮播图
Jan 02 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自动注册登录验证机制实现代码
2011/12/20 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
2014/09/10 PHP
php内嵌函数用法实例
2015/03/20 PHP
discuz论坛更换域名,详细文件修改步骤
2020/12/09 PHP
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
jqGrid随窗口大小变化自适应大小的示例代码
2013/12/28 Javascript
js和jquery实现监听键盘事件示例代码
2020/06/24 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
2016/07/18 Javascript
js捕捉键盘事件和按键键值的方法
2016/10/10 Javascript
JS实现十字坐标跟随鼠标效果
2017/12/25 Javascript
JS实现字符串中去除指定子字符串方法分析
2018/05/17 Javascript
Vue中用props给data赋初始值遇到的问题解决
2018/11/27 Javascript
Vue源码解析之数组变异的实现
2018/12/04 Javascript
a标签调用js的方法总结
2019/09/05 Javascript
Angular如何由模板生成DOM树的方法
2019/12/23 Javascript
jQuery 选择器用法基础入门示例
2020/01/04 jQuery
vue项目创建步骤及路由router
2020/01/14 Javascript
JavaScript forEach中return失效问题解决方案
2020/06/01 Javascript
在vue中使用echarts(折线图的demo,markline用法)
2020/07/20 Javascript
js+h5 canvas实现图片验证码
2020/10/11 Javascript
JavaScript实现无限轮播效果
2020/11/19 Javascript
python解决字典中的值是列表问题的方法
2013/03/04 Python
matplotlib subplots 设置总图的标题方法
2018/05/25 Python
Python 确定多项式拟合/回归的阶数实例
2018/12/29 Python
利用Python实现微信找房机器人实例教程
2019/03/10 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
Python使用Excel将数据写入多个sheet
2020/05/16 Python
Expedia挪威官网:酒店、机票和租车
2018/03/03 全球购物
Ellesse英国官网:意大利高级运动品牌
2019/07/23 全球购物
俄罗斯最大的在线珠宝大卖场:Nebo
2019/12/08 全球购物
高级工程师岗位职责
2013/12/15 职场文书
宠物店的创业计划书范文
2014/01/11 职场文书
业务员工作态度散漫检讨书
2014/11/02 职场文书
初三英语教学计划
2015/01/23 职场文书
建党伟业观后感
2015/06/01 职场文书