Webpack Bundle Analyzer:深入分析与优化你的包
Webpack Bundle Analyzer是一个用于可视化的工具,它可以帮助你分析Webpack打包后的输出文件,查看哪些模块占用了最多的空间,从而进行优化。
2500G计算机入门到高级架构师开发资料超级大礼包免费送!
首先,你需要安装Webpack Bundle Analyzer和Webpack本身:
npm install webpack webpack-cli --save-dev
npm install webpack-bundle-analyzer --save-dev
接下来,配置Webpack配置文件(webpack.config.js
):
const path = require('path');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist'),},plugins: [new BundleAnalyzerPlugin({analyzerMode: 'static',reportFilename: 'report.html',openAnalyzer: false, // 不自动打开浏览器}),],// 其他配置...
};
运行Webpack并生成分析报告:
npx webpack --mode production
这将在dist
目录下生成一个report.html
文件,打开这个文件,你将看到一个交互式的图表,显示了你的包的大小分布。
为了进一步优化,你可以采取以下策略:
代码分割(Code Splitting):
使用splitChunks
配置项将大型库或组件拆分为单独的chunk,只在需要时加载。
module.exports = {// ...optimization: {splitChunks: {chunks: 'all',},},// ...
};
Tree Shaking:
启用sideEffects属性和ES模块,让Webpack删除未使用的代码。
// package.json
{"sideEffects": false
}
javascript
// 在Webpack配置中启用ES模块
module.exports = {// ...module: {rules: [{test: /\.m?js$/,resolve: {fullySpecified: false,},},],},// ...
};
使用压缩插件:
使用TerserWebpackPlugin
或其他压缩工具减小文件大小。
const TerserWebpackPlugin = require('terser-webpack-plugin');module.exports = {// ...optimization: {minimize: true,minimizer: [new TerserWebpackPlugin(),],},// ...
};
加载器优化:
根据需要选择合适的加载器,例如使用url-loader
或file-loader
处理静态资源,设置合适的阈值以避免不必要的转换。
module.exports = {// ...module: {rules: [{test: /\.(png|jpg|gif)$/i,use: [{loader: 'url-loader',options: {limit: 8192, // 8KBfallback: 'file-loader',},},],},],},// ...
};
模块懒加载(Lazy Loading)
对于大型应用,可以使用动态导入(import()
)实现模块懒加载,只有在用户需要时才加载相关模块。
// Before
import SomeBigComponent from './SomeBigComponent';// After
const SomeBigComponent = () => import('./SomeBigComponent');
代码预热(Code Preheating)
对于频繁使用的懒加载模块,可以考虑预热,提前加载,减少首次使用时的延迟。
// 在应用启动时预加载组件
import('./SomeBigComponent').then(() => {console.log('SomeBigComponent preloaded');
});
提取公共库(Common Chunks)
通过optimization.splitChunks配置,可以将多个模块共享的库提取到单独的chunk中。
module.exports = {// ...optimization: {splitChunks: {cacheGroups: {vendors: {test: /[\\/]node_modules[\\/]/,priority: -10,chunks: 'initial',},common: {name: 'common',test: /[\\/]src[\\/]/,chunks: 'all',minChunks: 2,priority: -20,reuseExistingChunk: true,},},},},// ...
};
使用CDN引入库
对于第三方库,如果它们在所有页面中都使用,考虑从CDN引入,减少服务器负载和首次加载时间。
// 在HTML模板中
<script src="https://cdn.example.com/jquery.min.js"></script>
图片优化
使用image-webpack-loader
或sharp
库对图片进行压缩和优化。
module.exports = {// ...module: {rules: [{test: /\.(png|jpe?g|gif|svg)$/i,use: [{loader: 'image-webpack-loader',options: {bypassOnDebug: true, // webpack@4 compatibilitymozjpeg: {progressive: true,quality: 65,},optipng: {enabled: false,},pngquant: {quality: [0.65, 0.9],speed: 4,},gifsicle: {interlaced: false,},// the webp option will enable WEBPwebp: {quality: 75,},},},],},],},// ...
};
利用缓存
使用cache配置来缓存Webpack编译结果,加快后续构建速度。
module.exports = {// ...cache: {type: 'filesystem',},// ...
};
避免重复的模块
使用Module Federation
或externals
配置,避免在多个应用之间重复引入相同的库。
Module Federation (Webpack 5+)
// 主应用 (Host App)
module.exports = {// ...experiments: {outputModule: true,},externals: {react: 'React','react-dom': 'ReactDOM',},// ...plugins: [new ModuleFederationPlugin({name: 'host_app',remotes: {remote_app: 'remote_app@http://localhost:3001/remoteEntry.js',},shared: ['react', 'react-dom'],}),],// ...
};// 远程应用 (Remote App)
module.exports = {// ...experiments: {outputModule: true,},plugins: [new ModuleFederationPlugin({name: 'remote_app',filename: 'remoteEntry.js',exposes: {'./RemoteComponent': './src/RemoteComponent',},}),],// ...
};
externals
配置
module.exports = {// ...externals: {react: 'React','react-dom': 'ReactDOM',},// ...
};
这将告诉Webpack这些库已经在全局作用域中可用,避免重复打包。
使用Source Maps
在开发阶段启用Source Maps,便于调试。
module.exports = {// ...devtool: 'cheap-module-source-map',// ...
};
优化字体和图标
对于图标和字体,可以使用url-loader
或file-loader
配合limit
参数来决定是否内联到CSS或单独打包。
module.exports = {// ...module: {rules: [{test: /\.(woff|woff2|eot|ttf|otf|svg)$/,use: [{loader: 'url-loader',options: {limit: 10000,name: '[name].[ext]',outputPath: 'fonts/',},},],},],},// ...
};
避免全局样式污染
使用CSS Modules或Scoped CSS,限制CSS作用域,防止样式冲突。
// CSS Modules
import styles from './styles.module.css';// Scoped CSS
<style scoped>.myClass { /* ... */ }
</style>
优化HTML输出
使用HtmlWebpackPlugin
生成优化过的HTML模板,自动引入Webpack生成的脚本和样式。
const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {// ...plugins: [new HtmlWebpackPlugin({template: './public/index.html',inject: 'body', // 将脚本注入到body底部}),],// ...
};
使用Webpack Dev Server
在开发环境中使用Webpack Dev Server,实现热更新和快速迭代。
module.exports = {// ...devServer: {contentBase: './dist',hot: true,},// ...
};
2500G计算机入门到高级架构师开发资料超级大礼包免费送!
相关文章:
Webpack Bundle Analyzer:深入分析与优化你的包
Webpack Bundle Analyzer是一个用于可视化的工具,它可以帮助你分析Webpack打包后的输出文件,查看哪些模块占用了最多的空间,从而进行优化。 2500G计算机入门到高级架构师开发资料超级大礼包免费送! 首先,你需要安装W…...
Java后端开发学习历程
1、JavaWeb------------------------>19天 2、SSMSpringBoot------------->12天 3、瑞吉外卖项目------------------>15天 4、JavaSE-------------------------->25天 总耗时71天(2024.03.11——2024.05.26两个半月),Java后端…...
CentOS 7 socat命令端口转发
场景 开发排查问题需配置远程调试,但配置调试的服务器不支持外网访问,于是就考虑到用端口转发的方式让开发进行远程调试,转发工具比如有:rinetd等等,意外看到使用socat做转发更简单方便,下面就记录一下 命令简介 socat 是一个功能强大的网络工具,可以在两个连接的数据…...
vue全局修改设置滚动条样式
vue全局修改设置滚动条样式 具体代码: ::-webkit-scrollbar{ /*滚动条整体样式*/width: 6px; /*高宽分别对应横竖滚动条的尺寸*/height: 1px; } ::-webkit-scrollbar-thumb{ /*滚动条里面小方块*/border-radius: 5px;background: #cfcbcb; } ::-webkit-scrollbar-…...

✨聚梦AI绘图插件-for photoshop(基于ComfyUI) 内测版V0.1发布
🎈背景 photoshop本身是有AI生成能力的,不过限于种种原因,国内使用很不方便。 photoshop也是有AI插件的,不过大多安装起来比较复杂,或者,干脆就会收费。 所以我们做了一个免费的AI插件,期望能…...

java “错误:编码GBK 的不可映射字符”
环境:JDK-17 本机编码:utf-8 代码编码:GBK 错误:java “错误:编码GBK 的不可映射字符” 解决1:记事本打开java源文件,另存为选择ANSI编码 解决2:复制代码再将编码格式改为utf-8,…...

前端 JS 经典:Web 性能指标
什么是性能指标:Web Performance Metrics 翻译成 Web 性能指标,一般和时间有关系,在短时间内做更多有意义的事情。 一个站点表现得好与不好,标准在于用户体验,而用户体验好不好,有一套 RAIL 模型来衡量。这…...

SVN创建分支,分支合并,切换分支。通俗易懂
1、首先在svnbucket.com远程仓库上创建项目,这里我创建了个测试demo: 2、先把svn仓库的项目检出到自己的文件夹,我这里是demo001文件夹,此时并没有创建truck, branches, tags这三个目录: 3、 在demo001文件夹里新建tru…...

【编译原理复习笔记】中间语言
中间语言 中间语言的特点和作用 (1)独立于机器 (2)复杂性介于源语言和目标语言之间 中间语言可以使编译程序的结构在逻辑上更为简单明确 常用的中间语言 后缀式 图表示:抽象语法树,有向无环图 三地址代…...

linux笔记6--shell相关
文章目录 1. 查看当前的shell类型2. ps -f命令3. 父子shell4. 分号在命令里的作用问题:环境变量echo: 5. sleep和jobssleep:jobs:例子:&: 6. 外部命令和内建命令图解外部命令type命令 7. history命令8. alias命令9. 推荐 1. 查看当前的sh…...
链表-线性表的链式表示
链表-线性表的链式表示 #mermaid-svg-ozpXrKnNCyYdqHvN {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ozpXrKnNCyYdqHvN .error-icon{fill:#552222;}#mermaid-svg-ozpXrKnNCyYdqHvN .error-text{fill:#552222;stro…...
GNU/Linux - 时区设置
CST China Standard Time 北京时间/中国标准时间 在时区划分上,属东八区,比协调世界时早 8 小时,记为 UTC8 GMT Greenwich Mean Time 格林威治标准时间 是指位于英国伦敦郊区的格林尼治天文台的标准时间,因为本初子午线被定…...
红队攻防渗透技术实战流程:云安全之云原生安全:内核漏洞和版本漏洞
红队云攻防实战 1. 云原生安全 -Docker安全-容器逃逸-版本漏洞1.1 容器逃逸-版本漏洞-runC容器逃逸1.2 实战案例-版本漏洞-runC容器逃逸1.3 容器逃逸-版本漏洞-containerd逃逸1.4 实战案例-版本漏洞-containerd逃逸1.5 Docker安全-容器逃逸-CDK自动化1.6 Docker安全-容器逃逸-c…...

spring状态机实战
一、什么是状态机 状态机是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型,是一种概念性机器,它能采取某种操作来响应一个外部事件。这种操作不仅能取决于接收到的事件,还能取决于各个事件的相对发生顺序。状态…...
Ubuntu系统上安装NVIDIA驱动【笔记】
Ubuntu上安装NVIDIA驱动,您可以按照以下步骤操作: 首先,您需要配置软件源(根据情况配置,否则影响更新和下载速度)。 接下来,您可以按照上一条回答中的步骤来安装新的NVIDIA驱动。首先ÿ…...

生成式AI导论2024-李宏毅
生成式AI导论2024-李宏毅 第0讲: 课程说明第1讲:生成式AI是什么第2講:今日的生成式人工智慧厲害在哪裡?從「工具」變為「工具人」 第0讲: 课程说明 生成式AI的入门课程 第1讲:生成式AI是什么 生成式人…...

跨平台之用VisualStudio开发APK嵌入OpenCV(三)
本篇将包含以下内容: 1.使用 Visual Studio 2019 开发一个 Android 的 App 2.导入前篇 C 编译好的 so 动态库 3.一些入门必须的其它设置 作为入门,我们直接使用真机进行调试,一方面运行速度远高于模拟器,另一方面模拟器使用的…...
渗透测试框架之CobaltStrike,Metasploit域名上线隐藏IP
概述 为什么要隐藏IP 在拿下了目标机之后,目标机在内网里面,使用msf或者CS时,用自己的VPS做服务器的话,导致很容易被溯源。 域名上线原理 当我们访问域名时会经过域名解析 域名解析就是域名到IP地址的转换过程,那么…...

vue.js对接海康威视摄像头web开发包
一、登录海康开放平台下载web开发包,下载需要先登录海康账号,没有的需先注册一个。 这里的appkey、ip、port、secret 和cameraIndexCodeasd是自己去申请的 appkey: "****", ip: "****", port: **, secret: "****", //必填…...
Selenium中使用的三种等待
文章目录 1.前言2.在selenium中常见的等待操作一般有3个 1.前言 在使用selenium时很多元素在使用的时候都需要加载,如果不等待加载结束直接使用就会报错,功能不能继续。一般解决的办法就是使用等待操作。 2.在selenium中常见的等待操作一般有3个 slee…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...