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 ...
随机推荐
- mysql 8.0.30 忘记密码登录mysql:
mysql 8.0.30 忘记密码登录mysql: cmd(使用管理员运行)-切换到mysql的bin目录下:一.输入命令:net stop mysql 停止服务: 二.输入命令:mysqld --c ...
- kafka-集群搭建及启动脚本
集群搭建: [root@localhost kafka_2.11-0.10.2.1]# cat config/server.properties | grep -v ^$ | grep -v ^# b ...
- vite不能用@做为路径的解决方法
vite创建vue3后,发现原来用@做为路径的不能用了,报错信息是 Internal server error: Failed to resolve import "@ 在网上查了一下资料, ...
- Android笔记--Application
Application生命周期 在APP运行过程中有且仅有一个Application对象贯穿整个生命周期 Application全局变量 实例化: 声明全局变量:
- 对于MyBatis的模糊查询的实现+文本框、单选框以及复选框的数据回显的实现
MyBatis的模糊查询sql语句与之前使用的不太一样 主要是利用下面这种语句实现的(查了好久的,认真记一下吧!) select * from huodong where theme like con ...
- Masa Framework源码解读-02缓存模块(分布式缓存进阶之多级缓存)
序言 今天这篇文章来看看Masa Framework的缓存设计,上一篇文章中说到的MasaFactory的应用也会在这章节出现.文章中如有错误之处还请指点,咱们话不多说,直入主题. Masa Fr ...
- 加密脚本分析—evil.py
加密脚本分析-evil.py 1.题目 源文件 一共两个文件 enc_flag.txt evil.py(原文件无注释) 1 # coding: utf-8 2 3 import base64 4 im ...
- Apinto Dashboad V2.0 发布:可视化控制台让配置更轻松!
大家好, Eolink 旗下开源网关 Apinto 本次带来了 Apinto Dashboad V2.0 的版本发布. Dashboad 需要与 Apinto 主版本一起使用,目前 Dashboad ...
- Salesforce LWC学习(二十) CLI篇:新版本不支持Audience解决方案
本篇参考:https://github.com/forcedotcom/cli/issues/470 https://developer.salesforce.com/docs/atlas.en-us ...
- Yaml入门与使用
一.入门 1.概念: yml是YAML("YAML Ain't a Markup Language)语言文件,以数据为中心,而不是一标记语言为重点,比json,xml更适合做配置文件. 为 ...