构建分析

分析构建的统计信息是更好地理解 Webpack 的一个好方法。可视化 Webpack 输出可帮助您了解打包结果的组成。

配置 Webpack

要获得合适的输出,您需要对配置进行一些调整。至少应该传入 --json 标记并将输出保存为文件,如下所示:

package.json

"scripts": {
  "build:stats": "webpack --env production --json > stats.json",
  ...
},

无论您的 Webpack 配置如何,以上是您需要的基本设置。现在执行 npm run build:stats。过一会儿,你应该可以在你的项目根目录找到 stats.json 文件。我们可以通过各种工具来分析此文件,以更好地了解正在发生的事情。

您还可以考虑使用以下标记:

  • --profile 捕获与时间相关的信息。该设置是可选的,但值得一试。
  • --progress 显示 Webpack 在构建的不同阶段花了多长时间。

要理解 Webpack 在构建过程中为什么会包含特定模块,请使用 whybundledwebpack-why--display-reasons 标记也提供了许多相关信息。例如:npm run build -- --display-reasons

鉴于您在当前设置中需要考虑生产环境,所以构建过程会清理构建目录!如果您想避免这种情况,需要额外调整配置。

Node API

我们还可以通过 Node 获取统计信息。由于统计信息可能包含错误,因此我们需要对其进行分情况处理:

const webpack = require("webpack");
const config = require("./webpack.config.js")("production");

webpack(config, (err, stats) => {
  if (err) {
    return console.error(err);
  }

  if (stats.hasErrors()) {
    return console.error(stats.toString("errors-only"));
  }

  console.log(stats);
});

如果您想对统计数据进行进一步处理,上面这种技术可能很有价值,尽管其他解决方案已经足够了。

如果您想要 JSON 格式的输出,请使用 stats.toJson()。要想获得_详细_输出,请使用 stats.toJson("verbose")。它遵循 Webpack 支持的所有 stat 选项。

如果要模仿 --json 标记产生的结果,请使用console.log(JSON.stringify(stats.toJson(), null, 2));,输出会以可读的方式进行格式化。

StatsWebpackPlugin 和 WebpackStatsPlugin

如果您想通过插件管理统计数据,请查看 stats-webpack-plugin。它使您可以更多地控制输出。您可以使用它从输出中排除特定的依赖项。

webpack-stats-plugin 是另一种选择。它允许您在输出数据之前转换数据。

启用性能预算

Webpack 允许您定义性能预算。基于这个设想,它给出了你必须遵循的构建大小约束。默认情况下禁用该功能,并且构建大小的计算包括 chunk 块和入口块。如果未满足预算并且已将其配置为一种构建错误,则会终止整个构建。

要将该功能集成到项目中,请调整配置:

webpack.config.js

const productionConfig = merge([

  {
    performance: {
      hints: "warning", // "error" 或者 false 都是有效值
      maxEntrypointSize: 50000, // 以字节为单位, 默认为 250k
      maxAssetSize: 450000, // 以字节单位
    },
  },

  ...
]);

实际情况下,您可能希望保持一个预算的下限值,目前的例子足够进行演示了。如果你现在执行构建(npm run build),你应该看到一个警告:

WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (48.8 KiB). This can impact web performance.
Entrypoints:
  main (103 KiB)
      manifest.3fd9a1eb.js
      manifest.d41d8cd9.css
      vendor.0a4df2ff.js
      vendor.3dd53418.css
      main.9043ef51.js
      main.d5d711b1.css

您可以增加预算的大小或删除配置以消除警告。一个有吸引力的选择是用更轻的方案来替换 React,如使用包章节中所述。

可用的分析工具

尽管查看文件本身可以让您了解正在发生的事情,但通常最好使用特定的工具。

官方分析工具

Webpack 官方分析工具

官方分析工具会根据应用的依赖关系图给您一些好的建议,它也可以在本地运行。

Webpack Visualizer

webpack-visualizer

Webpack Visualizer 提供了一个饼图,显示了您的包的构成,可以了解每个依赖在整体结果中所占的大小。

DuplicatePackageCheckerPlugin

如果在构建中多次找到单个包,duplicate-package-checker-webpack-plugin 会发出警告。否则,很难发现这个问题。

Webpack 图表

Webpack-Chart

Webpack Chart 是另一种类似的可视化工具。

webpack-unused

webpack-unused 打印出未使用的文件,可用于了解哪些资源不再使用,可以从项目中删除。

Stellar Webpack

Stellar-Webpack

Stellar Webpack 提供类似于宇宙星系的视觉效果,允许您以 3D 形式检查应用程序。

webpack-bundle-tracker

webpack-bundle-tracker 可以在 Webpack 编译时捕获数据,并把这些数据以 JSON 格式输出。

webpack-bundle-analyzer

webpack-bundle-analyzer

webpack-bundle-analyzer 提供打包内容的交互式树形图。

webpack-bundle-size-analyzer

webpack-bundle-size-analyzer 提供了文本形式的打包结果统计信息。

$ webpack-bundle-size-analyzer stats.json
react: 93.99 KB (74.9%)
purecss: 15.56 KB (12.4%)
style-loader: 6.99 KB (5.57%)
fbjs: 5.02 KB (4.00%)
object-assign: 1.95 KB (1.55%)
css-loader: 1.47 KB (1.17%)
<self>: 572 B (0.445%)

inspectpack

inspectpack 可用于确定哪些位置的代码可以改进。以下示例执行了重复分析:

$ inspectpack --action=duplicates --bundle=bundle.js
## Summary

* Bundle:
    * Path:                /PATH/TO/bundle.js
    * Bytes (min):         1678533
* Missed Duplicates:
    * Num Unique Files:    116
    * Num Extra Files:     131
    * Extra Bytes (min):   253955
    * Pct of Bundle Size:  15 %

jarvis

jarvis-webpack

Jarvis 是一个用户界面,旨在显示与您的 Webpack 构建相关的所有信息。例如,它显示了 Tree Shaking 可以过滤掉的模块数量,以及在不同的连接类型下资源的表现情况。

webpack-runtime-analyzer

webpack-runtime-analyzer 对 Webpack bundle 进行实时分析。您可以在用户界面查看各种格式的包的组成情况、大小和模块详细信息。它将上述许多工具的功能组合到一个工具中。

webpack-monitor

Webpack Monitor 是另一个类似的工具,用户界面非常的清晰。它能够提供有关改进构建的建议。

webpack-deps-tree

webpack-deps-tree 显示 Webpack 模块图。使用它,您可以了解包中的模块是如何相互关联的。

重复分析

除了 inspectpack 之外,还有其他工具可用于计算重复项:

独立工具

除了使用与 Webpack 输出相关的工具以外,还有一些与 Webpack 无关的独立工具。

source-map-explorer

source-map-explorer 是一个独立于 Webpack 的工具。它允许您使用源映射深入了解您的构建。它通过可视化的树图,显示了代码在整体结果中占比情况。

madge

madge

madge 是另一种可以根据模块构成输出图形的独立工具。图形输出允许您更详细地了解项目内部的依赖关系。

总结

当您优化打包输出的大小时,这些工具是非常宝贵的。官方工具具有最多功能,但可视化工具更容易揭示问题点,你会很容易看到它们的组成。

回顾一下:

  • Webpack 允许您提取包含有关构建的信息的 JSON 文件。其中的数据包括构建组成和时间。
  • 可以使用各种工具分析生成的数据,这些工具可以深入了解打包组成等方方面面。
  • 性能预算允许您限制构建的大小。设置预算使开发人员更容易意识到生成的包的大小。
  • 理解打包结果是了解如何优化整体规模,加载内容和时间的关键。它还可以揭示更重要的问题,例如冗余数据。
  • 您可以找到不依赖于 Webpack 但仍对分析有价值的第三方工具。

您将在下一章中学习如何调整 Webpack 性能。

用户头像
登录后发表评论