Webpack性能优化:构建速度与体积优化策略

一、构建速度优化

1、​​升级Webpack和Node.js​

  • ​优化效果​​:Webpack 4比Webpack 3构建时间降低60%-98%。
  • ​原因​​:
    • V8引擎优化(for of替代forEachMap/Set替代Object)。
    • 默认使用更快的md4哈希算法。
    • AST直接从Loader传递,减少解析时间。
# 示例:Webpack 3 vs Webpack 4构建时间对比
Webpack 3: Time: 54263ms
Webpack 4: Time: 26563ms

2、​​多进程/多实例构建​

  • ​方案选择​​:
    • thread-loader(官方推荐,Webpack 4+)。
    • HappyPack(Webpack 3,已逐渐被替代)。
  • ​原理​​:将模块解析分配给Worker线程并行处理。
// thread-loader 配置示例
module.exports = {module: {rules: [{test: /\.js$/,use: ['thread-loader', 'babel-loader']}]}
};

​3、并行压缩代码​

  • ​推荐插件​​:
    • terser-webpack-plugin(Webpack 4默认,支持ES6)。
    • uglifyjs-webpack-plugin(开启parallel参数)。
// terser-webpack-plugin 并行压缩
const TerserPlugin = require('terser-webpack-plugin');
module.exports = {optimization: {minimizer: [new TerserPlugin({ parallel: 4 })]}
};

 4、​​缩小构建目标​

  • ​关键配置​​:
    • 限制babel-loader作用范围(排除node_modules)。
    • 优化resolve配置,减少文件搜索范围。
module.exports = {module: {rules: [{ test: /\.js$/, exclude: /node_modules/, use: 'babel-loader' }]},resolve: {modules: [path.resolve(__dirname, 'node_modules')], // 限定模块搜索路径extensions: ['.js'], // 减少后缀尝试alias: { react: path.resolve(__dirname, './node_modules/react/dist/react.min.js') } // 别名缩短路径}
};

 

​5、缓存优化​

  • ​策略​​:
    • babel-loader开启cacheDirectory
    • terser-webpack-plugin启用缓存。
    • 使用hard-source-webpack-plugin为模块提供中间缓存。
// babel-loader 缓存示例
use: [{loader: 'babel-loader',options: { cacheDirectory: true }
}]

 二、构建体积优化

1、​​代码分包(减少主包体积)​

  • ​方案1:设置Externals​
    通过CDN引入基础库(如React),不打包进Bundle。
const HtmlWebpackExternalsPlugin = require('html-webpack-externals-plugin');
plugins: [new HtmlWebpackExternalsPlugin({externals: [{ module: 'react', entry: '//cdn.url/react.min.js', global: 'React' }]})
];
  •  ​​方案2:SplitChunksPlugin分包​

分离公共模块与业务代码。

optimization: {splitChunks: {chunks: 'all',cacheGroups: {vendors: { test: /[\\/]node_modules[\\/]/, name: 'vendors' }}}
}

 

2、Tree Shaking​

  • ​条件​​:必须是ES6模块语法(import/export)。
  • ​生效方式​​:
    • Webpack生产模式默认开启。
    • 确保.babelrc中设置"modules": false

3、图片与字体优化​

  • ​压缩图片​​:image-webpack-loader集成imagemin
rules: [{test: /\.(png|jpg)$/,use: [{ loader: 'file-loader', options: { name: 'img/[name][hash:8].[ext]' } },{ loader: 'image-webpack-loader', options: { mozjpeg: { quality: 65 } } }]
}]
  •  ​​小资源内联​​:url-loader将小文件转为Base64。
use: [{ loader: 'url-loader', options: { limit: 10240 } }] // 小于10KB的文件内联

4、​​删除无用代码​

  • ​CSS清理​​:purgecss-webpack-plugin移除未使用的CSS。
const PurgecssPlugin = require('purgecss-webpack-plugin');
plugins: [new PurgecssPlugin({ paths: glob.sync(`${PATHS.src}/**/*`, { nodir: true }) })
];
  • ​动态Polyfill服务​​:按需加载Polyfill(如polyfill.io)。
<script src="https://polyfill.io/v3/polyfill.min.js?features=Promise,Map"></script>

 三、高级分析与监控

​1、构建速度分析​

  • ​工具​​:speed-measure-webpack-plugin
  • ​效果​​:输出每个Loader和插件的耗时。
const SpeedMeasurePlugin = require('speed-measure-webpack-plugin');
const smp = new SpeedMeasurePlugin();
module.exports = smp.wrap({ /* webpack配置 */ });

 2、体积分析​

  • ​工具​​:webpack-bundle-analyzer
  • ​效果​​:可视化分析各模块大小。
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
plugins: [new BundleAnalyzerPlugin()];

3、​​日志优化​

  • ​工具​​:friendly-errors-webpack-plugin
  • ​效果​​:精简控制台输出,突出错误和警告。
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin');
plugins: [new FriendlyErrorsPlugin()];
stats: 'errors-only' // 仅显示错误
四、总结
​优化方向​​关键技术​​效果​
构建速度多进程/缓存/缩小目标减少60%+构建时间
体积优化代码分包/Tree Shaking/图片压缩减少30%-50% Bundle大小
开发体验热更新/日志优化快速定位问题,减少刷新
长期维护ESLint规范/CI集成提升代码质量和团队协作效率

核心原则​​:

  1. ​优先使用高版本Webpack​​(内置优化更多)。
  2. ​并行与缓存是速度优化的关键​​。
  3. ​按需加载与死代码删除是体积优化的核心​​。
  4. ​通过可视化分析工具量化优化效果​​。

 

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

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

相关文章

ajax学习手册

Ajax 通俗易懂学习手册 目录 Ajax 基础概念XMLHttpRequest 详解Fetch API (现代方式)处理不同数据格式错误处理和状态码Ajax 高级技巧实战项目案例最佳实践 Ajax 基础概念 什么是 Ajax&#xff1f; Ajax Asynchronous JavaScript And XML 通俗解释&#xff1a; Ajax 就像…

人工智能学习02-安装环境

人工智能学习概述—快手视频 人工智能学习02-安装—快手视频 Python安装 Python安装分为两种方法&#xff0c;一是从官网(https://www.python.org/)下载Python工具(比如python-2.7.msi)进行安装&#xff0c;并设置Path环境变量&#xff1b;二是下载工具Anaconda集成环境进行安…

电脑开不了机,主板显示67码解决过程

文章目录 现象分析内存条问题BIOS设置问题其它问题 解决清理内存条金手指所需工具操作步骤注意事项 电脑在运行过程中&#xff0c;显示内存不足&#xff0c;重启电脑却无法启动。 现象 System Initialization 主板风扇是转的&#xff0c;也有灯光显示&#xff0c;插上屏幕&am…

在ubuntu等linux系统上申请https证书

使用 Certbot 自动申请 安装 Certbot Certbot 是 Let’s Encrypt 官方推荐的自动化工具&#xff0c;支持多种操作系统和服务器环境。 在 Ubuntu/Debian 上&#xff1a; sudo apt update sudo apt install certbot申请证书 纯手动方式&#xff08;不自动配置&#xff09;&…

springboot的test模块使用Autowired注入失败

springboot的test模块使用Autowired注入失败的原因&#xff1a; 注入失败的原因可能是用了junit4的包的Test注解 import org.junit.Test;解决方法&#xff1a;再加上RunWith(SpringRunner.class)注解即可 或者把Test由junit4改成junit5的注解&#xff0c;就不用加上RunWith&…

Cursor Rules 使用

前言 最近在使用 Cursor 进行编程辅助时&#xff0c;发现 AI 生成的代码风格和当前的代码风格大相径庭。而且有时它会输出很奇怪的代码&#xff0c;总是不符合预期。 遂引出本篇&#xff0c;介绍一下 Rules &#xff0c;它就可以做一些规范约束之类的事情。 什么是 Cursor R…

项目任务,修改svip用户的存储空间。

修改存储空间 3GB->5GB&#xff0c;这是项目任务&#xff0c;首先有人任务就要去思考实现思路&#xff0c;首先存储空间&#xff0c;也就是说不只是前端样式3GB改一下就可以了&#xff0c;那用户实际还是3GB&#xff0c;所以我们去网站看后端谁返回给我们了3GB&#xff0c;我…

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…

iview中的table组件点击一行中的任意一点选中本行

<Table border ref"selection" size"small" on-row-click"onClickRow"></Table>// table组件点击一行任意位置选中onClickRow(row, index) {this.$refs.selection.toggleSelect(index)}写上toggleSelect(index)方法即可&#xff0c;…

前端工具库lodash与lodash-es区别详解

lodash 和 lodash-es 是同一工具库的两个不同版本&#xff0c;核心功能完全一致&#xff0c;主要区别在于模块化格式和优化方式&#xff0c;适合不同的开发环境。以下是详细对比&#xff1a; 1. 模块化格式 lodash 使用 CommonJS 模块格式&#xff08;require/module.exports&a…

算法-构造题

#include<iostream> #include<bits/stdc.h> using namespace std; typedef long long ll; const ll N 5e5 10; int main() {ll n, k;cin >> n >> k; ll a[N] {0}; // 初始化一个大小为N的数组a&#xff0c;用于存储排列// 构造满足条件的排列for (l…

LeetCode--25.k个一组翻转链表

解题思路&#xff1a; 1.获取信息&#xff1a; &#xff08;1&#xff09;给定一个链表&#xff0c;每k个结点一组进行翻转 &#xff08;2&#xff09;余下不足k个结点&#xff0c;则不进行交换 2.分析题目&#xff1a; 其实就是24题的变题&#xff0c;24题是两两一组进行交换&…

OC—UI学习-2

导航控制器和导航工具栏 导航控制器 UINAvigationController与UIViewController的关系 UIViewController是什么&#xff1f; 它是一个普通的视图控制器&#xff0c;负责管理一个页面 UINavigationController是什么&#xff1f; 它是一个容器控制器&#xff0c;专门用来管理一…

Microsoft前后端不分离编程新风向:cshtml

文章目录 什么是CSHTML&#xff1f;基础语法内联表达式代码块控制结构 布局页面_ViewStart.cshtml_Layout.cshtml使用布局 模型绑定强类型视图模型集合 HTML辅助方法基本表单验证 局部视图创建局部视图使用局部视图 高级特性视图组件依赖注入Tag Helpers 性能优化缓存捆绑和压缩…

【SpringBoot+SpringCloud】Linux配置nacos踩坑大全

*建议在开发时使用Linux环境下搭建nacos 1.在nacos官网找到搭配SpringBoot和SpringCloud的版本 2.Nacos 依赖 Java 环境来运行&#xff0c;需要在linux系统中安装JDK 1.8 3.按照Nacos官网步骤安装&#xff0c;防火墙配置开放8848和9848端口 客户端拥有相同的计算逻辑&…

如何在 Java 中优雅地使用 Redisson 实现分布式锁

分布式系统中&#xff0c;节点并发访问共享资源可能导致数据一致性问题。分布式锁是常见的解决方案&#xff0c;可确保操作原子性。Redisson是基于Redis的Java分布式对象库&#xff0c;提供多种分布式同步工具&#xff0c;包括分布式锁。Redisson与Redis&#xff08;实时数据平…

pikachu靶场通关笔记20 SQL注入03-搜索型注入(GET)

目录 一、SQL注入 二、搜索型注入 三、源码分析 1、渗透思路1 2、渗透思路2 四、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入百分号单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取…

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…

A Survey on the Memory Mechanism of Large Language Model based Agents

目录 摘要Abstract1. LLM-Based Agent的Memory1.1 基础概念1.2 用于解释Memory的例子1.3 智能体记忆的定义1.3.1 狭义定义(肯定不用这个定义)1.3.2 广义定义 1.4 记忆协助下智能体与环境的交互过程1.4.1 记忆写入1.4.2 记忆管理1.4.3 记忆读取1.4.4 总过程 2. 如何实现智能体记…

搭建 Serverless 架构

✅ 一、理解 Serverless 架构核心概念 核心理念&#xff1a; 无需管理服务器&#xff1a;只需编写业务逻辑&#xff0c;部署后由云平台托管运行环境。 事件驱动&#xff08;Event-driven&#xff09; 按需计费&#xff08;按调用次数/资源消耗&#xff09; 高可扩展性与自动…