Webpack 构建速度优化

news/2025/10/13 19:52:19/文章来源:https://www.cnblogs.com/amulong1237/p/19139234

Webpack 构建速度优化是一个系统工程,需要从多个维度进行优化。以下是全面的优化方案:

1. 分析工具先行

1.1 构建速度分析

# 安装速度分析插件
npm install --save-dev speed-measure-webpack-plugin
const SpeedMeasurePlugin = require('speed-measure-webpack-plugin')
const smp = new SpeedMeasurePlugin()module.exports = smp.wrap({// webpack 配置plugins: [// ... 其他插件]
})

1.2 打包体积分析

const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPluginmodule.exports = {plugins: [new BundleAnalyzerPlugin({analyzerMode: 'server',openAnalyzer: true})]
}

1.3 构建过程分析

const { ProgressPlugin } = require('webpack')module.exports = {plugins: [new ProgressPlugin({activeModules: true, // 显示活跃模块entries: true, // 显示入口modules: true, // 显示模块dependencies: true, // 显示依赖})]
}

2. 优化解析和编译

2.1 缩小文件搜索范围

module.exports = {resolve: {// 明确第三方模块路径modules: [path.resolve(__dirname, 'node_modules')],// 减少后缀尝试extensions: ['.ts', '.tsx', '.js', '.jsx'],// 使用别名避免层层查找alias: {'@': path.resolve(__dirname, 'src'),'react': path.resolve(__dirname, './node_modules/react'),}},module: {rules: [{test: /\.js$/,// 只处理 src 目录下的文件include: path.resolve(__dirname, 'src'),use: ['babel-loader']}]}
}

2.2 避免不必要的解析

module.exports = {module: {// 不解析已知的预编译库noParse: /jquery|lodash|moment/,rules: [{test: /\.js$/,exclude: /node_modules/,use: {loader: 'babel-loader',options: {cacheDirectory: true, // 开启 babel 缓存cacheCompression: false // 关闭缓存压缩}}}]}
}

3. 利用缓存机制

3.1 Webpack 5 持久化缓存

module.exports = {cache: {type: 'filesystem', // 使用文件系统缓存buildDependencies: {config: [__filename] // 构建依赖配置},cacheDirectory: path.resolve(__dirname, 'node_modules/.cache/webpack')}
}

3.2 Webpack 4 缓存方案

const HardSourceWebpackPlugin = require('hard-source-webpack-plugin')module.exports = {plugins: [new HardSourceWebpackPlugin(),// 或者使用 cache-loader],module: {rules: [{test: /\.js$/,use: [{loader: 'cache-loader',options: {cacheDirectory: path.resolve('.cache')}},'babel-loader']}]}
}

4. 多进程/多实例构建

4.1 Thread Loader (推荐)

module.exports = {module: {rules: [{test: /\.js$/,exclude: /node_modules/,use: [{loader: 'thread-loader',options: {workers: require('os').cpus().length - 1, // CPU 核心数 - 1poolTimeout: Infinity // 开发模式保持进程运行}},'babel-loader']}]}
}

4.2 Terser 多进程压缩

const TerserPlugin = require('terser-webpack-plugin')module.exports = {optimization: {minimizer: [new TerserPlugin({parallel: true, // 开启多进程terserOptions: {compress: {drop_console: true // 生产环境移除 console}}})]}
}

5. 代码分割与按需加载

5.1 动态导入

// 路由懒加载
const Home = () => import(/* webpackChunkName: "home" */ './views/Home.vue')
const About = () => import(/* webpackChunkName: "about" */ './views/About.vue')// 组件懒加载
const HeavyComponent = () => import('./components/HeavyComponent.vue')

5.2 SplitChunks 优化

module.exports = {optimization: {splitChunks: {chunks: 'all',cacheGroups: {vendor: {test: /[\\/]node_modules[\\/]/,name: 'vendors',priority: 10,chunks: 'all'},common: {name: 'common',minChunks: 2,priority: 5,reuseExistingChunk: true}}}}
}

6. DLL 预编译(适用于大型项目)

6.1 创建 DLL 配置

// webpack.dll.config.js
const path = require('path')
const webpack = require('webpack')module.exports = {mode: 'production',entry: {vendor: ['react', 'react-dom', 'lodash', 'moment']},output: {path: path.resolve(__dirname, 'dll'),filename: '[name].dll.js',library: '[name]_library'},plugins: [new webpack.DllPlugin({name: '[name]_library',path: path.join(__dirname, 'dll', '[name]-manifest.json')})]
}

6.2 使用 DLL

// webpack.config.js
const webpack = require('webpack')module.exports = {plugins: [new webpack.DllReferencePlugin({manifest: require('./dll/vendor-manifest.json')})]
}

7. 开发环境优化

7.1 增量编译

module.exports = {watch: true,watchOptions: {ignored: /node_modules/, // 忽略 node_modulesaggregateTimeout: 300, // 防抖延迟poll: 1000 // 轮询间隔}
}

7.2 热更新优化

const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin')module.exports = {devServer: {hot: true,port: 8080,compress: true, // 开启 gzipoverlay: true, // 显示错误覆盖层stats: 'minimal' // 减少控制台输出},plugins: [new ReactRefreshWebpackPlugin() // React 热更新]
}

8. 生产环境优化

8.1 资源压缩

const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
const TerserPlugin = require('terser-webpack-plugin')module.exports = {optimization: {minimize: true,minimizer: [new TerserPlugin(), // JS 压缩new CssMinimizerPlugin() // CSS 压缩]},plugins: [new CompressionPlugin({ // Gzip 压缩test: /\.(js|css|html|svg)$/,threshold: 8192})]
}

8.2 预编译资源

const PrepackWebpackPlugin = require('prepack-webpack-plugin').defaultmodule.exports = {plugins: [// 预编译常量new webpack.DefinePlugin({'process.env.NODE_ENV': JSON.stringify('production')}),// 预编译资源(可选)new PrepackWebpackPlugin()]
}

9. 高级优化技巧

9.1 模块联邦 (Webpack 5)

// app1 webpack.config.js
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin')module.exports = {plugins: [new ModuleFederationPlugin({name: 'app1',filename: 'remoteEntry.js',exposes: {'./Button': './src/Button'},shared: ['react', 'react-dom']})]
}

9.2 资源内联

module.exports = {module: {rules: [{test: /\.(png|jpg|gif)$/,use: [{loader: 'url-loader',options: {limit: 8192, // 8KB 以下转 base64fallback: 'file-loader'}}]}]}
}

10. 监控与持续优化

10.1 构建监控

// 构建耗时监控
class BuildTimePlugin {apply(compiler) {let startTimecompiler.hooks.beforeRun.tap('BuildTimePlugin', () => {startTime = Date.now()})compiler.hooks.done.tap('BuildTimePlugin', () => {const endTime = Date.now()console.log(`构建耗时: ${(endTime - startTime) / 1000}秒`)})}
}

10.2 配置文件优化建议

// 根据环境使用不同配置
module.exports = (env, argv) => {const isProduction = argv.mode === 'production'return {mode: argv.mode || 'development',devtool: isProduction ? 'source-map' : 'eval-cheap-module-source-map',// 其他配置...}
}

优化效果评估

实施这些优化后,通常可以看到:

  • 开发环境:冷启动时间减少 50-70%,热更新时间减少 60-80%
  • 生产环境:构建时间减少 30-50%,打包体积减少 20-40%

建议根据项目实际情况选择适合的优化方案,优先解决性能瓶颈最严重的环节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/936376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[模拟赛] 过关(pass)

前言: 我做不出 \(T1\) 我活鸡蛋。/kk 题目描述: 有 \(n+1\) 关卡,有一个机器人从关卡 \(1\) 开始闯关,每个关卡里有一个陷阱。机器人没有第 \(i\) 关的经验时会回到第 \(pi\) 关重新闯一遍,并获得了这一关的经验…

2025.10.13

马上月考了,文化课不能落下,11月还要考S组,但是自己现在dp还没练,效率太低了啊啊啊啊,年底前能学完内容吗(

c++初体验

#实验任务1 ##代码1 #include <iostream>2 #include <string>3 #include <vector>4 #include <algorithm>5 using namespace std;6 template<typename T>7 void output(const T &c)…

元宇宙的搜索引擎:如何在虚拟世界中查找信息 - 详解

元宇宙的搜索引擎:如何在虚拟世界中查找信息 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&quo…

四则运算错题本和错题重做的建立

1.建立一个储存错题的字符串数组 2.通过循环记录错题数量,记录并打印今日正确率 3.通过循环将错题逐一遍历并与输入进来的答案进行比对判断正误

行列式的性质

转置 \[D = \begin{vmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \…

04_SQL语句一

04_SQL语句一 sql练习,可以先导入准备好的数据 https://github.com/datacharmer/test_db 随意导入,练习SQL玩法1.MySQl核心SQL语句 SQL,英文全称为Structured Query Language,中文意思是结构化查询语言,它是一种…

死锁的原因、表现以排查

什么是死锁 死锁是指两个或两个以上的线程(或进程)在执行过程中,因为争夺资源而陷入的相互等待的状态,若无外力干涉,它们都无法推进下去。 表现 1、用户反馈:哪个功能卡住了,具体的操作路径是什么?涉及哪些页面…

详细介绍:【C++】二叉搜索树

详细介绍:【C++】二叉搜索树pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

朱世乐的 Johnson 算法笔记

这个算法的使命是啥? 解决“全源最短路”问题(所有点到所有点的最短路)。 特别擅长处理带负权边的稀疏图。是对“跑N遍SPFA”的巨大优化。 核心思想?(天才的魔法) Dijkstra 很快,但怕负权边。 Johnson 的想法:…

完整教程:文心大模型4.5:百度推出的新一代原生多模态基础大模型

完整教程:文心大模型4.5:百度推出的新一代原生多模态基础大模型pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

day010

今日完成:java时间timer,html 明日完成:sql 遇到问题:无

详细介绍:DVWA | XSS 跨站脚本注入

详细介绍:DVWA | XSS 跨站脚本注入2025-10-13 19:29 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !imp…

实用指南:JVM栈溢出时如何dump栈信息?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

20232323 2025-2026-1《网络与系统攻防技术》实验一实验报告

一.实验内容 本次实验针对 Linux 平台可执行文件 pwn1,围绕缓冲区溢出(BOF)漏洞挖掘与 shellcode 注入技术展开,核心目标是通过三种路径篡改程序执行流程:1. 手动修改机器指令,将 main 函数调用的 foo 函数替换…

树莓派4B安装WiringPi使用gpio命令

1.使用Git下载WiringPi C 源码 git clone https://github.com/WiringPi/WiringPi.git2.编译源码 安装 ./build卸载 ./build uninstall 3.执行命令gpio -v,查看WiringPi版本4.使用gpio readall查看gpio状态5.使用pinou…

1分钟Get宠物神兽壁纸我家猫被问疯了!

谁懂啊!自从换了这张壁纸,每个朋友都来问我怎么做的! 今天就公开这个“朋友圈装B指南”! 手把手教你把你家主子变成《山海经》神兽!超简单!【准备】 1️⃣ 下载“豆包”APP 2️⃣ 选一张主子的靓照📸 【施法步…

Zabbix 6.0+ 运用官方模板监控 Redis 数据库的完整安装指南

Zabbix 6.0+ 运用官方模板监控 Redis 数据库的完整安装指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

【图论】Floyd算法简析

在计算机科学中,Floyd-Warshall算法是一种在具有正或负边缘权重(但没有负周期)的加权图中找到最短路径的算法。算法的单个执行将找到所有顶点对之间的最短路径的长度(加权)。 虽然它不返回路径本身的细节,但是可…