当前位置: 首页 > ds >正文

【前端优化】使用speed-measure-webpack-plugin分析前端运行、打包耗时,优化项目

记录下

项目安装speed-measure-webpack-plugin

打包分析:

修改vue.config.js文件
speed-measure-webpack-plugin进行构建速度分析,需要包裹整个 configureWebpack 配置

const originalConfig = {publicPath: '/',assetsDir: 'assets',parallel: true,devServer: {hot: true},lintOnSave: false,runtimeCompiler: true,chainWebpack: (config) => {config.resolve.alias.set('@', resolve('src')).set('@views', resolve('src/views')).set('@comp', resolve('src/components')).set('@root', resolve('/'))config.module.rule('images').test(/\.(png|jpe?g|gif|svg)(\?.*)?$/).type('asset').parser({dataUrlCondition: {maxSize: 8 * 1024 // 8KB以下转base64 //2560}})//   .set('generator', {//     filename: 'img/[name].[hash:8][ext]'//   })config.module.rule('images').use('image-webpack-loader').loader('image-webpack-loader').options({bypassOnDebug: true}).end()},configureWebpack: {cache: {type: 'filesystem', // 使用文件缓存buildDependencies: {config: [__filename] // 缓存依赖},allowCollectingMemory: true,maxMemoryGenerations: 1},optimization: {minimizer: minimizer,removeEmptyChunks: process.env.NODE_ENV === 'production',splitChunks: splitChunks},plugins: plugins,module: {noParse: /jquery/,rules: [{test: /\.js$/,include: path.resolve(__dirname, 'src'),exclude: /node_modules/,use: [{loader: 'thread-loader',options: {workers: cpuCount,workerParallelJobs: 20,workerNodeArgs: ['--max-old-space-size=1024'] // 限制子进程内存// poolTimeout: 2000 // 空闲时自动关闭}},{loader: 'babel-loader',options: {babelrc: true,cacheDirectory: true}}]}]}},css: {loaderOptions: {// You need to configure a global variable if you want to use it in a componentscss: {additionalData: '@import "~@/assets/css/variables.scss";'}}},// 设为false打包时不生成.map文件productionSourceMap: false
}
module.exports = {...originalConfig,configureWebpack: smp.wrap(originalConfig.configureWebpack)
}

npm run dev运行,获取分析:

SMP  ⏱
General output time took 7 mins, 42.001 secsSMP  ⏱  Plugins
DefinePlugin took 0 secs
TerserPlugin took 0 secsSMP  ⏱  Loaders
@vue/vue-loader-v15, and
mini-css-extract-plugin, and
css-loader, and
postcss-loader, and
sass-loader, and
@vue/vue-loader-v15 took 4 mins, 58.75 secsmodule count = 2340
css-loader, and
@vue/vue-loader-v15, and
postcss-loader, and
sass-loader, and
@vue/vue-loader-v15 took 4 mins, 53.93 secsmodule count = 1170
@vue/vue-loader-v15, and
thread-loader, and
babel-loader, and
thread-loader, and
babel-loader, and
@vue/vue-loader-v15 took 3 mins, 22.91 secsmodule count = 3430
mini-css-extract-plugin, and
css-loader, and
postcss-loader took 2 mins, 41.67 secsmodule count = 21
thread-loader, and
babel-loader, and
thread-loader, and
babel-loader took 2 mins, 33.61 secsmodule count = 404
mini-css-extract-plugin, and
css-loader, and
postcss-loader, and
sass-loader took 2 mins, 12.24 secsmodule count = 4
modules with no loaders took 2 mins, 2.27 secsmodule count = 2244
image-webpack-loader took 1 min, 36.096 secsmodule count = 327
@vue/vue-loader-v15 took 1 min, 31.51 secsmodule count = 5127
css-loader, and
postcss-loader took 1 min, 13.14 secsmodule count = 21
css-loader, and
postcss-loader, and
sass-loader took 50.62 secsmodule count = 4
@vue/vue-loader-v15, and
mini-css-extract-plugin, and
css-loader, and
postcss-loader, and
@vue/vue-loader-v15 took 49.91 secsmodule count = 6
css-loader, and
@vue/vue-loader-v15, and
postcss-loader, and
@vue/vue-loader-v15 took 15.11 secsmodule count = 3
html-webpack-plugin took 1.9 secsmodule count = 1
raw-loader took 0.819 secsmodule count = 1
script-loader took 0.032 secsmodule count = 1



修改配置

1.图片处理仅在生产环境使用

    if (process.env.NODE_ENV === 'production') {config.module.rule('images').test(/\.(png|jpe?g|gif|svg)(\?.*)?$/).type('asset').parser({dataUrlCondition: {maxSize: 8 * 1024 // 8KB以下转base64 //2560}})//   .set('generator', {//     filename: 'img/[name].[hash:8][ext]'//   })config.module.rule('images').use('image-webpack-loader').loader('image-webpack-loader').options({bypassOnDebug: true}).end()} else {config.module.rule('images').uses.delete('image-webpack-loader') // 移除图像压缩}
  1. scss设置
  css: {loaderOptions: {// You need to configure a global variable if you want to use it in a componentscss: {implementation: require('sass'),additionalData: '@import "~@/assets/css/variables.scss";'}}},
  1. 改用esbuild-loader,用了之后是要快一点,但这个速度感觉还是不对啊
// 删除原有的babel-loader配置config.module.rules.delete('js')// 添加esbuild-loaderconfig.module.rule('js').test(/\.(js|mjs|jsx)$/)// .exclude.add(/node_modules/)// .end().use('esbuild-loader').loader('esbuild-loader').options({target: 'es2015',loader: 'jsx'})
thread-loader, and 
babel-loader took 1 min, 23.34 secsmodule count = 374
-------
esbuild-loader took 52.51 secsmodule count = 395

再次优化后,打包速度提升:

 SMP  ⏱  
General output time took 4 mins, 5.18 secsSMP  ⏱  Plugins
DefinePlugin took 0.002 secsSMP  ⏱  Loaders
css-loader, and 
@vue/vue-loader-v15, and 
postcss-loader, and 
sass-loader, and 
@vue/vue-loader-v15 took 3 mins, 16.68 secsmodule count = 1170
@vue/vue-loader-v15 took 2 mins, 11.74 secsmodule count = 5127
@vue/vue-loader-v15, and 
esbuild-loader, and 
@vue/vue-loader-v15 took 1 min, 50.85 secsmodule count = 3430
modules with no loaders took 1 min, 27.56 secsmodule count = 2609
css-loader, and 
postcss-loader took 1 min, 11.28 secsmodule count = 21
css-loader, and 
postcss-loader, and 
sass-loader took 1 min, 8.42 secsmodule count = 4
esbuild-loader took 52.51 secsmodule count = 395
css-loader, and 
@vue/vue-loader-v15, and 
postcss-loader, and 
@vue/vue-loader-v15 took 8.85 secsmodule count = 3
@vue/vue-loader-v15, and 
vue-style-loader, and 
css-loader, and 
postcss-loader, and 
sass-loader, and 
@vue/vue-loader-v15 took 2.93 secsmodule count = 2340
vue-style-loader, and 
css-loader, and 
postcss-loader took 0.373 secsmodule count = 21
vue-style-loader, and 
css-loader, and 
postcss-loader, and 
sass-loader took 0.197 secsmodule count = 4
html-webpack-plugin took 0.141 secsmodule count = 1
@vue/vue-loader-v15, and 
vue-style-loader, and 
css-loader, and 
postcss-loader, and 
@vue/vue-loader-v15 took 0.016 secsmodule count = 6

但CSS相关加载器耗时还是非常长,没搜到怎么优化。。。。


webpack5新增了一个懒加载属性 lazyCompilation, 还可以使用 DllPlugin 进行分包,都能提升运行速度; 后面看看
http://www.xdnf.cn/news/10124.html

相关文章:

  • 20250530-C#知识:万物之父Object
  • 云原生应用架构设计原则与落地实践:从理念到方法论
  • 通信算法之280:无人机侦测模块知识框架思维导图
  • JS 事件循环详解
  • 告别重复 - Ansible 配置管理入门与核心价值
  • 在 Linux 上安装 Minikube:轻松搭建本地 Kubernetes 单节点集群
  • 项目管理工具Maven
  • java/mysql/ES下的日期类型分析
  • 【FlashRAG】本地部署与demo运行(二)
  • PHP7内核剖析 学习笔记 第九章 PHP基础语法的实现
  • [特殊字符] xbatis 一款好用 ORM 框架 1.8.8-M2 发布,节省 1/3 代码和时间的框架!!!
  • Drawio编辑器二次开发
  • 【pytorch学习】土堆pytorch学习笔记2
  • 【Linux】权限相关指令
  • Axure疑难杂症:中继器新增数据时如何上传并存储图片(玩转中继器)
  • 【仿生机器人系统设计】涉及到的伦理与安全问题
  • 数据基座觉醒!大数据+AI如何重构企业智能决策金字塔(上)
  • 代码随想录打卡|Day53 图论(Floyd 算法精讲 、A * 算法精讲 (A star算法)、最短路算法总结篇、图论总结 )
  • 历年武汉大学计算机保研上机真题
  • 服务器液冷:突破散热瓶颈,驱动算力革命的“冷静”引擎
  • 美国服务器文件系统的基本功能和命令
  • ansible-playbook 进阶 接上一章内容
  • dart实现单client连接的grpc server (以ip地址作判断)
  • Yum配置第三方源与本地源详解
  • 日常--OBS+mediamtx实现本地RTMP推流环境搭建(详细图文)
  • RPG17.蓝图函数库与轻重攻击连击
  • C++ 5.29 dddd
  • 【深度剖析】义齿定制行业数字化转型模式创新研究(上篇2:痛点和难点分析)
  • AI智能监控系统:赋能厂区安全管理的数智化革新
  • [Dify] 如何应对明道云API数据过长带来的Token超限问题