Webpack5构建性能优化:构建耗时从150s到60s再到10s
作者:京东科技 牛志伟
近期对Webpack5构建性能进行了优化,构建耗时从150s到60s再到10s,下面详细讲解下优化过程。
优化前现状
1.历史项目基于Vue3 + Webpack5技术栈,其中webpack配置项由开发者自己维护(没有使用@vue/cli-service),并且做了环境分离。
2.项目体量大约5000个modules左右,每次本地构建build时耗时约150s左右。
优化细节
环境分离
之前已经设计了环境分离,但是一些优化细节没有处理好:
•基础配置文件:webpack.base.js,主要配置了基础的loader和plugin等
•本地开发配置文件:webpack.dev.js,主要配置了devServer和样式、图片资源loader等,并merge基础配置
•生产环境配置文件:webpack.prod.js,主要配置了样式、图片资源loader以及资源压缩和样式抽离等,并merge基础配置
优化点:
•热加载相关配置,从base移到dev配置中,生产环境中不需要热更新
new webpack.HotModuleReplacementPlugin()
•dev配置中devtool类型选择,inline-source-map修改为eval-cheap-module-source-map,map文件使用内联方式构建速度更快。
devtool: 'eval-cheap-module-source-map'
•filename调整:js/[name].[fullhash].js去掉hash,本地开发环境启用热更新,不需要hash(生产环境需要hash刷新缓存)
output: {
filename: 'js/[name].js',
path: path.resolve(__dirname, '../dist'),
publicPath: '/',
}
持久化缓存
base配置中开启持久化缓存(Webpack5新特性),首次构建耗时增加15%左右,但是二次构建耗时减少90%左右
cache: {
type: 'filesystem'
}
Loader相关优化
•尽量减少loader,比如使用Asset modules(Webpack5新特性)替换url-loader、file-loader、raw-loader
// 字体和小于8kb的图片
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
type: 'asset',
parser: {
dataUrlCondition: {
maxSize: 8 * 1024,
},
}
}
// 图片资源
{
test: /\.(png|svg|jpg|gif|cur)$/,
type: 'asset/resource',
exclude: [path.resolve(__dirname, '../../../assets/svg')],
}
•thread-loader耗时任务开启多线程
{
test: /\.vue$/,
use: ['thread-loader', 'vue-loader'],
},
{
test: /\.(t|j)s$/,
exclude: /node_modules/,
use: ['thread-loader', 'babel-loader'],
},
{
test: /\.(sa|sc|c)ss$/,
use: ['thread-loader', 'style-loader', 'css-loader', 'sass-loader'
},
•esbuild-loader替换babel-loader(由于改动较大,没有尝试)
Plugin相关优化
•使用speed-measure-webpack-plugin分析各个plugin、loader编译时间
•尽量减少plugin,比如HotModuleReplacementPlugin只在dev开启
•升级老旧plugin,比如terser-webpack-plugin版本从2升级到5,构建性能直接提升50%左右,具体原因有了解的同学可以打在评论区。
优化后效果
•不启用缓存情况下耗时从150s减少到60s以内
•优化后speed-measure-webpack-plugin编译速度分析
•启用持久化缓存情况下,二次构建减少到10s以内
Webpack5总结
以下是从基础、进阶、优化、插件使用以及打包原理几个方面做的Webpack5总结,有遗漏之处欢迎评论留言讨论
Webpack5构建性能优化:构建耗时从150s到60s再到10s的更多相关文章
- (十七)TableView的本地性能优化
面试中常常会问TableView的性能优化. TableView只会加载能看到的Cell,每当有一个Cell进入视野范围内,就会调用. 存在着内存隐患,如果用户拖动的很快,所以内存会飙升的很快,因此要 ...
- 【前端构建】WebPack实例与前端性能优化
计划把微信的文章也搬一份上来. 这篇主要介绍一下我在玩Webpack过程中的心得.通过实例介绍WebPack的安装,插件使用及加载策略.感受构建工具给前端优化工作带来的便利. 壹 | Fisrt 曾几 ...
- 优化Webpack构建性能的几点建议
Webpack 作为目前最流行的前端构建工具之一,在 vue/react 等 Framework 的生态圈中都占据重要地位.在开发现代 Web 应用的过程中,Webpack 和我们的开发过程和发布过程 ...
- kylin构建cube优化
前言 下面通过对kylin构建cube流程的分析来介绍cube优化思路. 创建hive中间表 kylin会在cube构建的第一步先构建一张hive的中间表,该表关联了所有的事实表和维度表,也就是一张宽 ...
- webpack3构建全面提速优化vue-cli
前言 伴随着vue的全球化,各种vue的组件框架越来越完善,从早期的element-ui到vux,iview等越来越多高质量的项目,使用vue进行前端构建已然是一件工程化,模块化,敏捷化的事情 在这其 ...
- eclipse如何优化构建的速度
eclipse如何优化构建的速度(Building) - AlanLee(Java) - 博客园 http://www.cnblogs.com/AlanLee/p/5383166.html
- Android性能优化之利用LeakCanary检测内存泄漏及解决办法
前言: 最近公司C轮融资成功了,移动团队准备扩大一下,需要招聘Android开发工程师,陆陆续续面试了几位Android应聘者,面试过程中聊到性能优化中如何避免内存泄漏问题时,很少有人全面的回答上来. ...
- Unity性能优化(4)-官方教程Optimizing graphics rendering in Unity games翻译
本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
- H5 缓存机制浅析 移动端 Web 加载性能优化
腾讯Bugly特约作者:贺辉超 1 H5 缓存机制介绍 H5,即 HTML5,是新一代的 HTML 标准,加入很多新的特性.离线存储(也可称为缓存机制)是其中一个非常重要的特性.H5 引入的离线存储, ...
- Java的性能优化
http://www.toutiao.com/i6368345864624144897/?tt_from=mobile_qq&utm_campaign=client_share&app ...
随机推荐
- 为什么对1e9 + 7取模
在刷题的时候,很多题目答案都要求结果对1e9 + 7取模 刚开始我非常不理解,为什么要取模,取模难道结果不会变吗? 答案是结果会变,但因为原本需要得出的答案可能超出int64的范围,比如他叫你计算50 ...
- vs调试导入功能时莫名自动结束调试
新装了vs2022,默认下图所示的地方打勾,导致调试文件导入功能时触发了自动结束调试,真是坑爹~~
- Pytorch基础复习
项目推进中期,重新到头来学Pytorch.five落泪了.(╬▔皿▔)凸 笑死,憋不住了,边更边学. 整篇博客整体采用总分总形式.首先将介绍内容(加黑部分)之间关系进行概括,后拆解,最后以图总结. 全 ...
- zabbix 告警说明及触发cpu告警
1. https://www.cnblogs.com/caonw/p/12766454.html 1.内存检测:Template OS Linux:vm.memory.size[available]. ...
- 关于proTable设置列固定,始终没有固定的效果的原因
使用proTable设置操作列固定 const columns: ProColumns<IssueItem>[] = [ { title: '操作', valueType: 'option ...
- [vue2 + jointjs + svg-pan-zoom] 节点自动布局渲染 + 拖拽缩放
启动vue项目,执行以下命令安装dagre.graphlib.jointjs.svg-pan-zoom. npm install dagre graphlib jointjs svg-pan-zoom ...
- Typora编辑区域空白过大问题
参考博客:https://blog.csdn.net/m0_55485287/article/details/115207178 在哪个文件编辑? 1.找到使用的主题,打开主题文件夹 2.找到对应的c ...
- Java方法的定义
前言 经过前面两篇关于面向对象.类和对象的文章,壹哥相信你现在对面向对象已经有了基本的了解.我们知道,在一个类中,包括属性和行为两大核心要素.我们之前已经给大家讲解了如何定义属性,但很多同学对方法还不 ...
- 迁移学习(NRC)《Exploiting the Intrinsic Neighborhood Structure for Source-free Domain Adaptation》
论文信息 论文标题:Exploiting the Intrinsic Neighborhood Structure for Source-free Domain Adaptation论文作者:Shiq ...
- 重新编译Unity Mono遇到的坑,大坑,巨坑!!!
因为项目需要,要整一个DLL热更功能,本身也想对DLL进行加密,所以需要修改Mono的代码,并重新编译.参考了网上的教程后,决定在linux下做重编的工作. 然而在实际执行的时候,一开始就碰到了巨大的 ...