将性能预算纳入你的构建流程

定义性能预算后,就该设置构建流程来跟踪它了。许多工具可让你为所选性能指标定义阈值,并在你超出预算时发出警告。了解如何选择最适合你的需求和当前设置的工具。🕵️‍♀️

Lighthouse 性能预算

Lighthouse 是一款审核工具,可在几个关键领域(性能、无障碍、最佳实践以及你的网站作为渐进式 Web 应用的性能)中测试网站。

Lighthouse 的命令行版本 (v5+) 支持基于以下内容设置性能预算

  • 资源大小
  • 资源计数

你可以为以下任何资源类型设置预算

  • document
  • font
  • image
  • media
  • other
  • script
  • stylesheet
  • third-party
  • total

预算在 JSON 文件中设置,定义预算后,新的“超出预算”列会告诉你是否超出任何限制。

Budgets section in Lighthouse report
Lighthouse 报告中的“预算”部分

Webpack 性能提示

Webpack 是一款功能强大的构建工具,用于优化代码向用户的交付方式。它还支持基于资源大小设置性能预算。

webpack.config.js 中开启性能提示,以便在你的捆绑包大小超出限制时获取命令行警告或错误。这是在整个开发过程中留意资源大小的好方法。

在构建步骤之后,webpack 会输出一个颜色编码的资源列表及其大小。任何超出预算的内容都以黄色突出显示。

Webpack output highlighting bundle.js
突出显示的 bundle.js 大于你的预算

资产和入口点的默认限制均为 250 KB。你可以在配置文件中设置自己的目标。

Webpack bundle size warning
Webpack 捆绑包大小警告 ⚠️

预算与未压缩的资源大小进行比较。未压缩的 JavaScript 大小与执行时间有关,大文件可能需要很长时间才能执行,尤其是在移动设备上。

Webpack performance optimization recommendation
额外功能:webpack 不仅会警告你,还会就如何缩小捆绑包大小给出建议。💁

Bundlesize

Bundlesize 是一个简单的 npm 包,用于根据你设置的阈值测试资源大小。它可以在本地运行并与你的 CI 集成。

Bundlesize CLI

通过指定阈值和要测试的文件来运行 bundlesize CLI

bundlesize -f "dist/bundle.js" -s 170kB

Bundlesize 以一行输出颜色编码的测试结果。

Failing bundlesize CLI test
Bundlesize CLI 测试失败 ❌
Passing bundlesize CLI test
Bundlesize CLI 测试通过 ✔️

用于 CI 的 Bundlesize

如果将 bundlesize 与 CI 集成以自动强制执行拉取请求的大小限制,你将获得 bundlesize 的最大价值。如果 bundlesize 测试失败,则不会合并该拉取请求。 它适用于 GitHub 上使用 Travis CICircleCIWerckerDrone 的拉取请求。

Bundlesize check status on GitHub
GitHub 上的 Bundlesize 检查状态

你可能今天有一个快速的应用程序,但添加新代码通常会改变这一点。使用 bundlesize 检查拉取请求将帮助你避免性能下降。Bootstrap、Tinder、Trivago 和许多其他公司都使用它来控制预算。

使用 bundlesize,可以为每个文件单独设置阈值。如果你在应用程序中拆分捆绑包,这将特别有用。

默认情况下,它测试 gzipped 资源大小。你可以使用 compression 选项切换到 brotli 压缩或完全关闭它。

Lighthouse Bot

Lighthouse Bot

Lighthouse Bot 与 Travis CI 集成,并根据五个 Lighthouse 审核类别中的任何一个强制执行预算。例如,你的 Lighthouse 性能得分预算为 100。有时,关注单个数字比关注单个资源预算更简单,而 Lighthouse 分数考虑了很多因素。

Lighthouse scores 💯
Lighthouse 分数 💯

在你将网站部署到暂存服务器后,Lighthouse Bot 会运行审核。在 .travis.yml 中,使用 --perf--a11y--bp--seo--pwa 选项为特定的 Lighthouse 类别设置预算。目标是保持在绿色区域,分数至少为 90。

after_success:
  - ./deploy.sh # Deploy the PR changes to staging server
  - npm run lh -- --perf=96 https://staging.example.com # Run Lighthouse test

如果 GitHub 上拉取请求的分数低于你设置的阈值,Lighthouse Bot 可以阻止合并拉取请求。⛔

Lighthouse Bot check status on GitHub
GitHub 上的 Lighthouse Bot 检查状态

Lighthouse Bot 然后会在你的拉取请求上评论更新后的分数。这是一个很棒的功能,可以鼓励在代码更改发生时就性能进行对话。

Lighthouse reporting scores on pull request
Lighthouse 报告拉取请求上的分数 💬

如果你发现你的拉取请求因 Lighthouse 分数不佳而被阻止,请使用 Lighthouse CLI 或在 开发者工具 中运行审核。它会生成一份报告,其中包含有关瓶颈和简单优化提示的详细信息。

总结

工具 CLI CI 总结
Lighthouse ✔️
  • 基于不同类型资源的大小或计数的预算。
webpack ✔️
  • 基于 webpack 生成的资源大小的预算。
  • 检查未压缩的大小。
bundlesize ✔️ ✔️
  • 基于特定资源大小的预算。
  • 检查压缩或未压缩的大小。
Lighthouse Bot ✔️
  • 基于 Lighthouse 分数的预算。