跳到主要内容

性能分析

2024年03月21日
柏拉文
越努力,越幸运

一、认识


Webpack 性能优化手段主要有 并行编译缓存缩小资源搜索范围 等等。介绍这些具体的优化方法之前,有必要先聊聊: 如何收集分析 Webpack 打包过程的性能数据。

二、Webpack Stats


Webpack 内置了 stats 接口,专门用于统计模块构建耗时、模块依赖关系等信息,推荐用法:

1. 添加 profile = true 配置:

// webpack.config.js
module.exports = {
// ...
profile: true
}

2. 运行编译命令,并添加 --json 参数,参数值为最终生成的统计文件名,如:

npx webpack --json=stats.json

3. 上述命令执行完毕后,会在文件夹下生成 stats.json 文件,内容大致如下:

{
"hash": "2c0b66247db00e494ab8",
"version": "5.36.1",
"time": 81,
"builtAt": 1620401092814,
"publicPath": "",
"outputPath": "/Users/tecvan/learn-webpack/hello-world/dist",
"assetsByChunkName": { "main": ["index.js"] },
"assets": [
// ...
],
"chunks": [
// ...
],
"modules": [
// ...
],
"entrypoints": {
// ...
},
"namedChunkGroups": {
// ...
},
"errors": [
// ...
],
"errorsCount": 0,
"warnings": [
// ...
],
"warningsCount": 0,
"children": [
// ...
]
}

stats 对象收集了 Webpack 运行过程中许多值得关注的信息,包括:

  1. modules: 本次打包处理的所有模块列表,内容包含模块的大小、所属 chunk、构建原因、依赖模块等,特别是 modules.profile 属性,包含了构建该模块时,解析路径、编译、打包、子模块打包等各个环节所花费的时间,非常有用

  2. chunks: 构建过程生成的 chunks 列表,数组内容包含 chunk 名称、大小、包含了哪些模块等

  3. assets: 编译后最终输出的产物列表、文件路径、文件大小等

  4. entrypoints: entry 列表,包括动态引入所生产的 entry 项也会包含在这里面

  5. children: 子 Compiler 对象的性能数据,例如 extract-css-chunk-plugin 插件内部就会调用 compilation.createChildCompiler 函数创建出子 Compiler 来做 CSS 抽取的工作

我们可以从这些数据中分析出模块之间的依赖关系、体积占比、编译构建耗时等

三、Webpack Analysis


Webpack Analysiswebpack 官方提供的可视化分析工具,相比于其它工具,它提供的视图更全,功能更强大,能够通过创建依赖关系图对你的包进行更彻底的检查。

使用上只需要将上一节 webpack --json=stats.json 命令生成的 stats.json 文件导入页面,就可以看到一些关键统计信息。

四、Webpack Bundle Analyzer


Webpack-bundle-analyzer 是一个非常有名的性能分析插件,只需要一些简单配置就可以在 Webpack 构建结束后生成 Tree Map 形态的模块分布统计图,用户可以通过对比 Tree Map 内容推断各模块的体积占比,是否包含重复模块、不必要的模块等,用法:

1. 安装模块依赖

yarn add -D webpack-bundle-analyzer

2. 添加插件

const BundleAnalyzerPlugin = require("webpack-bundle-analyzer")
.BundleAnalyzerPlugin;

module.exports = {
...
plugins: [new BundleAnalyzerPlugin()],
};

编译结束后,默认自动打开本地视图页面。基于 Webpack Bundle Analyzer 提供的视图,我们可以分析出:

  1. Bundle 包所包含的模块内容,从而推断出产物中是否包含预期之外的模块

  2. 确定模块体积大小与占比, 从而确定是否存在优化空间

  3. 了解 Bundle 产物体积,以及经过压缩后的体积