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

Webpack优化实战:从配置到性能调优

Webpack优化实战:从配置到性能调优

大家好,我是蔓蔓。在大厂工作时,我负责过多个大型项目的Webpack配置和优化。今天我来和大家分享Webpack优化的实战技巧。

基础优化

合理配置mode

// webpack.config.js module.exports = { mode: process.env.NODE_ENV === 'production' ? 'production' : 'development' };

优化resolve配置

const path = require('path'); module.exports = { resolve: { // 配置路径别名 alias: { '@': path.resolve(__dirname, 'src'), '@components': path.resolve(__dirname, 'src/components'), '@utils': path.resolve(__dirname, 'src/utils') }, // 减少文件查找范围 extensions: ['.js', '.jsx', '.ts', '.tsx', '.json'], // 配置模块查找路径 modules: [path.resolve(__dirname, 'node_modules')] } };

代码分割

入口分割

module.exports = { entry: { main: './src/main.js', vendor: ['react', 'react-dom', 'lodash'] }, optimization: { splitChunks: { chunks: 'all', cacheGroups: { vendor: { test: /[\\/]node_modules[\\/]/, name: 'vendors', chunks: 'all' }, common: { name: 'common', minChunks: 2, chunks: 'all', priority: -10, reuseExistingChunk: true } } } } };

动态导入

// 按需加载组件 const Home = () => import(/* webpackChunkName: "home" */ './pages/Home'); const About = () => import(/* webpackChunkName: "about" */ './pages/About'); // 路由懒加载 const routes = [ { path: '/', component: Home }, { path: '/about', component: About } ];

压缩优化

代码压缩

const TerserPlugin = require('terser-webpack-plugin'); const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); module.exports = { optimization: { minimizer: [ new TerserPlugin({ terserOptions: { compress: { drop_console: true, drop_debugger: true } } }), new CssMinimizerPlugin() ] } };

资源压缩

const CompressionPlugin = require('compression-webpack-plugin'); module.exports = { plugins: [ new CompressionPlugin({ algorithm: 'gzip', threshold: 8192, // 超过8KB的文件才压缩 minRatio: 0.8 // 压缩率低于80%才压缩 }) ] };

缓存策略

文件名哈希

module.exports = { output: { filename: '[name].[contenthash].js', chunkFilename: '[name].[contenthash].chunk.js' } };

模块缓存

const HardSourceWebpackPlugin = require('hard-source-webpack-plugin'); module.exports = { plugins: [ new HardSourceWebpackPlugin() ] };

性能监控

速度分析

const SpeedMeasurePlugin = require('speed-measure-webpack-plugin'); const smp = new SpeedMeasurePlugin(); module.exports = smp.wrap({ // webpack配置 });

体积分析

const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; module.exports = { plugins: [ new BundleAnalyzerPlugin() ] };

进阶优化

Tree Shaking

module.exports = { optimization: { usedExports: true } }; // package.json { "sideEffects": false }

Scope Hoisting

module.exports = { optimization: { concatenateModules: true } };

懒加载图片

// 使用IntersectionObserver const lazyImages = document.querySelectorAll('img[data-src]'); const imageObserver = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { const img = entry.target; img.src = img.dataset.src; imageObserver.unobserve(img); } }); }); lazyImages.forEach(img => imageObserver.observe(img));

总结

Webpack优化是一个持续的过程,需要结合项目实际情况进行:

  1. 合理配置代码分割和懒加载
  2. 使用压缩和缓存策略
  3. 监控构建速度和包体积
  4. 利用Tree Shaking和Scope Hoisting

技术应当有温度,优化后的构建能提升开发和用户体验。

http://www.jsqmd.com/news/843216/

相关文章:

  • 别再死记硬背了!用Python模拟D触发器与JK触发器波形,5分钟搞定时序逻辑难题
  • MD5是哈希,不是加密,防君子不防小人
  • PSI5协议:汽车传感器同步通信的基石
  • 从源头到治理:光伏并网逆变器直流分量抑制技术全解析
  • 跨平台国密实战:使用sm-crypto在浏览器与Node.js中实现SM2/SM3/SM4
  • RISC-V vs MIPS:同为RISC,指令集设计哲学与编码格式有何不同?
  • 别再为485传感器没文档发愁了!一个USB转485模块+两款免费软件,5分钟搞定Modbus通信测试
  • 用Python和nilmtk库,5分钟上手非侵入式用电分析(附实战代码)
  • 5G网络优化关键参数解读:从入门到实战
  • NotebookLM化学辅助实战手册(附ACS期刊PDF解析模板+分子式自动标注插件)
  • YOLOv5优化 | 注意力融合 | 轻量化CBAM模块的嵌入与性能调优
  • linux技术分享笔记
  • 2026年4月热门的静力切割厂商推荐,建筑物切割/楼板切割/地面切割/建筑拆除/高铁遮板切割,静力切割源头厂家有哪些 - 品牌推荐师
  • Linux Ext 调度器的 BPF 程序集成:用户态与内核态的交互
  • FDE(前沿部署工程师):AI时代年薪百万的新贵,到底值不值得冲?
  • 别再死记硬背公式了!手把手带你用MATLAB/Simulink仿真SVPWM(附模型文件)
  • 在国产UOS系统上搞定Horizon Client for Linux(ARM版)的保姆级安装与排错
  • LTE到5G NR技术演进要点:从4G网优工程师到5G的跨越
  • Linux Ext 调度器的热插拔特性:调度器的动态加载与卸载
  • CST仿真入门实战:Dipole天线结果解读与关键参数分析
  • STM32F429三重ADC+DMA实战:从CubeMX配置到7.2MHz采样率代码调试全流程(避坑指南)
  • IMX6ULL-ALPHA开发板适配uboot2023.04:从官方EVK到自定义板卡的移植实战
  • 微博相册批量下载神器:3分钟学会免费获取高清图片的终极指南
  • AUTOSAR CAN驱动Mailbox配置实战:从Full/Basic CAN到FIFO深度详解
  • 时间序列分类新范式:从ROCKET到MINI ROCKET的演进与实践
  • 蚂蚁百灵 Ring-2.6-1T 开源解析:万亿级思考模型如何实现「按需推理」
  • 【NotebookLM研究问题生成避坑白皮书】:从0到1构建可复现、可评估、可审计的问题生成工作流
  • 泡沫箱码垛(易碎),伯朗特机器人宽幅吸盘+低真空,吸气泡沫箱无压痕
  • 2026年|10款亲测降ai率工具,论文AI率从80%降到10%,内含AIGC免费降重 - 降AI实验室
  • 零代码构建你的AI知识库:让Obsidian笔记开口说话