webpack优化前端性能

news/2025/10/13 20:55:24/文章来源:https://www.cnblogs.com/amulong1237/p/19139347

Webpack 优化前端性能主要从构建时优化运行时优化两个维度进行。以下是全面的优化方案:

1. 代码分割与按需加载

1.1 动态导入 (懒加载)

// React 路由懒加载
const Home = lazy(() => import(/* webpackChunkName: "home" */ './views/Home'))
const About = lazy(() => import(/* webpackChunkName: "about" */ './views/About'))// Vue 组件懒加载
const AsyncComponent = () => ({component: import('./AsyncComponent.vue'),loading: LoadingComponent,delay: 200
})// 条件懒加载
document.getElementById('btn').addEventListener('click', () => {import('./heavy-module.js').then(module => {module.heavyFunction()})
})

1.2 SplitChunks 代码分割

module.exports = {optimization: {splitChunks: {chunks: 'all',minSize: 20000, // 超过20KB才单独打包maxSize: 244000, // 尝试拆分大于244KB的包cacheGroups: {vendor: {test: /[\\/]node_modules[\\/]/,name: 'vendors',priority: 10,chunks: 'all'},react: {test: /[\\/]node_modules[\\/](react|react-dom)[\\/]/,name: 'react-vendor',priority: 20},common: {name: 'common',minChunks: 2,priority: 5,reuseExistingChunk: true},styles: {name: 'styles',test: /\.css$/,chunks: 'all',enforce: true}}}}
}

2. 资源压缩与优化

2.1 JavaScript 压缩

const TerserPlugin = require('terser-webpack-plugin')module.exports = {optimization: {minimize: true,minimizer: [new TerserPlugin({parallel: true, // 多进程压缩terserOptions: {compress: {drop_console: true, // 移除consoledrop_debugger: true, // 移除debuggerpure_funcs: ['console.log'] // 移除特定函数},mangle: {safari10: true // 解决Safari 10/11 bugs}},extractComments: false // 不提取注释})]}
}

2.2 CSS 压缩与提取

const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')module.exports = {module: {rules: [{test: /\.css$/,use: [process.env.NODE_ENV === 'production' ? MiniCssExtractPlugin.loader : 'style-loader','css-loader','postcss-loader' // 添加前缀等]}]},plugins: [new MiniCssExtractPlugin({filename: 'css/[name].[contenthash:8].css',chunkFilename: 'css/[name].[contenthash:8].chunk.css'})],optimization: {minimizer: [new CssMinimizerPlugin({parallel: true})]}
}

2.3 图片资源优化

module.exports = {module: {rules: [{test: /\.(png|jpg|jpeg|gif|svg)$/,type: 'asset',parser: {dataUrlCondition: {maxSize: 8 * 1024 // 8KB以下转base64}},generator: {filename: 'images/[name].[contenthash:8][ext]'},use: [{loader: 'image-webpack-loader',options: {mozjpeg: { progressive: true, quality: 65 },optipng: { enabled: false },pngquant: { quality: [0.65, 0.90], speed: 4 },gifsicle: { interlaced: false },webp: { quality: 75 }}}]}]}
}

3. 缓存策略

3.1 输出文件哈希命名

module.exports = {output: {filename: 'js/[name].[contenthash:8].js',chunkFilename: 'js/[name].[contenthash:8].chunk.js'},plugins: [new MiniCssExtractPlugin({filename: 'css/[name].[contenthash:8].css'})]
}

3.2 模块ID优化

module.exports = {optimization: {moduleIds: 'deterministic', // 保持模块ID稳定chunkIds: 'deterministic', // 保持块ID稳定runtimeChunk: {name: 'runtime' // 提取runtime代码}}
}

4. Tree Shaking 与副作用优化

4.1 启用 Tree Shaking

module.exports = {mode: 'production',optimization: {usedExports: true, // 标记使用到的导出sideEffects: false, // 开启副作用检测concatenateModules: true // 模块作用域提升}
}

4.2 package.json 配置

{"name": "your-package","sideEffects": ["*.css","*.scss","./src/polyfills.js"]
}

4.3 Lodash 按需引入

// 安装 babel-plugin-lodash
npm install --save-dev babel-plugin-lodash// .babelrc
{"plugins": ["lodash"]
}// 使用方式
import _ from 'lodash'
// 会被转换为:
// import _cloneDeep from 'lodash/cloneDeep'
// import _debounce from 'lodash/debounce'

5. 预加载与预获取

5.1 资源提示

// 预加载关键资源
import(/* webpackPreload: true */ './critical-module')// 预获取非关键资源
import(/* webpackPrefetch: true */ './non-critical-module')// 在路由组件中使用
const LazyComponent = lazy(() => import(/* webpackPrefetch: true */ './LazyComponent'
))

5.2 PreloadPlugin 自动预加载

const PreloadWebpackPlugin = require('preload-webpack-plugin')module.exports = {plugins: [new PreloadWebpackPlugin({rel: 'preload',include: 'initial',fileBlacklist: [/\.map$/, /hot-update/]})]
}

6. 打包分析优化

6.1 打包分析工具

const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPluginmodule.exports = {plugins: [new BundleAnalyzerPlugin({analyzerMode: 'static',openAnalyzer: false,reportFilename: 'bundle-report.html'})]
}

6.2 自定义分析插件

class BundleSizePlugin {apply(compiler) {compiler.hooks.done.tap('BundleSizePlugin', (stats) => {const assets = stats.toJson().assetsassets.forEach(asset => {const size = (asset.size / 1024).toFixed(2)if (size > 500) { // 大于500KB警告console.warn(`🚨 ${asset.name} 体积过大: ${size} KB`)}})})}
}

7. 运行时性能优化

7.1 长缓存优化

module.exports = {optimization: {splitChunks: {cacheGroups: {// 第三方库单独打包vendor: {test: /[\\/]node_modules[\\/]/,name: 'vendors',chunks: 'all'},// 提取webpack runtimeruntime: {name: 'runtime',chunks: 'all',test: /runtime/}}}}
}

7.2 外部扩展 (Externals)

module.exports = {externals: {// 从CDN引入,不打包react: 'React','react-dom': 'ReactDOM',vue: 'Vue',axios: 'axios'}
}// 在HTML中通过CDN引入
<script src="https://cdn.jsdelivr.net/npm/react@17/umd/react.production.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/react-dom@17/umd/react-dom.production.min.js"></script>

8. 高级优化技巧

8.1 模块联邦 (微前端)

const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin')module.exports = {plugins: [new ModuleFederationPlugin({name: 'app',filename: 'remoteEntry.js',remotes: {shared: 'shared@https://cdn.example.com/remoteEntry.js'},shared: {react: { singleton: true },'react-dom': { singleton: true }}})]
}

8.2 PWA 优化

const WorkboxPlugin = require('workbox-webpack-plugin')module.exports = {plugins: [new WorkboxPlugin.GenerateSW({clientsClaim: true,skipWaiting: true,runtimeCaching: [{urlPattern: /\.(?:png|jpg|jpeg|svg)$/,handler: 'CacheFirst',options: {cacheName: 'images',expiration: {maxEntries: 50,maxAgeSeconds: 30 * 24 * 60 * 60 // 30天}}}]})]
}

9. 开发环境性能优化

9.1 热更新优化

module.exports = {devServer: {hot: true,port: 8080,compress: true, // 开启gzipoverlay: true, // 错误覆盖层stats: 'minimal', // 精简输出clientLogLevel: 'warning' // 控制台日志级别},cache: {type: 'memory', // 内存缓存maxGenerations: 1}
}

9.2 增量编译

module.exports = {snapshot: {managedPaths: [path.resolve(__dirname, 'node_modules')]},cache: {type: 'filesystem',buildDependencies: {config: [__filename]}}
}

10. 性能监控与度量

10.1 性能预算

module.exports = {performance: {hints: 'warning',maxEntrypointSize: 500000, // 入口点最大500KBmaxAssetSize: 300000, // 资源最大300KBassetFilter: function(assetFilename) {return assetFilename.endsWith('.js') || assetFilename.endsWith('.css')}}
}

10.2 构建监控

// webpack.config.js
class BuildMonitorPlugin {apply(compiler) {compiler.hooks.done.tap('BuildMonitorPlugin', (stats) => {const info = stats.toJson()console.log('构建时间:', info.time + 'ms')console.log('资源数量:', info.assets.length)// 发送构建报告if (process.env.CI) {this.sendReport(info)}})}
}

优化效果评估指标

实施优化后,关注以下指标:

指标 优化目标 测量工具
首次加载时间 < 3秒 Lighthouse
首次内容绘制 (FCP) < 1.5秒 Web Vitals
最大内容绘制 (LCP) < 2.5秒 Web Vitals
打包体积 主包 < 200KB Bundle Analyzer
缓存命中率 > 90% 浏览器Network

通过综合运用这些优化策略,可以显著提升前端应用的加载性能和运行时性能。

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

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

相关文章

2025.10.13总结 - A

今天满课,生活充实且乏力。加油

洛谷版自我介绍

清华大学紫荆书院学生科学技术协会 (ZAST) 赛事部 副部长 Deputy Director of the Competition Department, Zijing Association of Science and Technology(ZAST), Tsinghua University 清华大学紫荆书院科协常年举办…

Windows五次shift漏洞复现

前言 当我们每次按五次shift之后都会弹出如下图所示的样式,在早期的windows7版本,就可以利用这个漏洞进行取得意想不到的效果。一、原理 我们可以给sethc进行改名,将本该启动sethc变成启动cmd,然后利用dos命令进行…

P8186 [USACO22FEB] Redistributing Gifts S 题解 - 符星珞

题目描述 FJ 有 \(N\) 个礼物给他的 \(N\) 头奶牛,这 \(N\) 个礼物和 \(N\) 头奶牛都分别按顺序被标记为从 \(1\) 到 \(N\) 的整数。每头奶牛都有一个愿望单,记录着一个含有 \(N\) 个礼物的排列。比起在愿望单中出现…

深入解析:个人用云计算学习笔记 --17(DNS 服务器)

深入解析:个人用云计算学习笔记 --17(DNS 服务器)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

Windows续

一、Windows 文件系统 1.1 文件系统基本概念 文件系统是操作系统用于明确存储设备或区分上的文件的方法和数据结构。 操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。 1.2 文件系统格式(…

uml九类例图详解

九种常见UML图(分类+图解) 九种常见UML图1.类图 概述 类图(Class Diagram)是面向对象系统建模中最常用和最重要的图,是定义其它图的基础。 类图主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种…

继续学习,争取早日找到实习 - Irving11

关于SQL的一些经典实例 一、TOP n 1、路径问题: csv_path = "student_score.csv" df = pd.read_csv(r"D:\Pycharm\pythonProject3\student_score.csv") 文件路径里的 \ 在 Python 中被当作转义字…

悟空原创:零门槛编程?实现了!拖拉流程,支持窗口界面设计支持生成独立可执行程序

悟空原创:零门槛编程?实现了!拖拉流程,支持窗口界面设计支持生成独立可执行程序悟空原创:零门槛编程?实现了!拖拉流程,支持窗口界面设计支持生成独立可执行程序零门槛编程,不会写代码,只想简单拖拉图形控件就…

Keil MDK 将不同文件中的特定数据链接到同一位置

最近在一个STM32的项目中,为了方便现场调试的抓取一些运行数据,就想在项目中增加类似于 linux 的串口终端,实现一些基本命令行的调试命令。本着开源优先的原则,一通搜索,最终选定了 xcmd 这个开源库。 XCMD 介绍 …

详细介绍:用于水管和污水管道巡检机器人的同步定位与建图综述

详细介绍:用于水管和污水管道巡检机器人的同步定位与建图综述2025-10-13 20:33 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !impor…

1013日总结

今天把作业写了一点,也就是界面那一块。 写了1000行左右,但还是有问题--前端数据反馈不到后端,明天我再看看。

C语言自学--自定义类型:结构体 - 指南

C语言自学--自定义类型:结构体 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

2025公众号排版效率榜:5款AI工具实测对比,从排版到分发一站搞定

作为新媒体运营者,你是否也曾经历过这些场景:花2小时排版一篇公众号文章,换平台发布时格式错乱需重新调整;追热点时选题慢半拍,配图担心版权风险;团队协作时版本混乱,分发10个平台重复操作到深夜?2025年,随着…

完整教程:R语言——离群点检测应用

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

OpenLayers地图交互 -- 章节十六:双击缩放交互详解 - 教程

OpenLayers地图交互 -- 章节十六:双击缩放交互详解 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

中国联通重要突破!正式获得开展eSIM手机运营服务商用试验批复

中国联通重要突破!正式获得开展eSIM手机运营服务商用试验批复Posted on 2025-10-13 20:25 lzhdim 阅读(0) 评论(0) 收藏 举报今日,中国联通公众号发文称,近期,中国联通正式获得开展eSIM手机运营服务商用试验的…

071_尚硅谷_十进制转其它进制

071_尚硅谷_十进制转其它进制1.十进制转二进制 2.十进制转八进制 3.十进制转十六进制

CF1935E Distance Learning Courses in MAC

刚开始以为是 case 题,结果是性质题。 首先肯定从高到低考虑,现在比较困难的事情就是如何决策到底哪些数占据高位哪些数占据低位。这样分类讨论贼多而且还不好做,出题人肯定不会自己给自己设限,想一写基于性质的做…

联考の记录

记录&总结。虽然我写东西的时候总会感觉有其他人看我写的东西导致写出来的东西非常不自然,但我决定还是写一下。这个东西每打一次联考就来更一下,不然偶然写一次感觉也没什么用处。 从一次大失败开始: 10.13 得…