迁移到 1.0
大多数项目无需改动,但自动找到的配置文件现在会优先于 package.json。升级前请查看配置文件。CLI 参数、环境变量、GitHub 状态名称和退出码仍然受支持。本页列出所有行为不同的地方。CONTRACT.md 列出了保持兼容的内容。
1.0 是一个新的主版本,^0.x 和 ~0.x 版本范围不会升级到它:在你主动升级之前,一切都不会改变。如果你是从 0.3.x 升级,下文的大部分内容同样适用。
手动升级
- 使用 Node.js 22.17 或更高版本,CI 中也一样。Node.js 16、18 和 20 已停止维护。
- 更新 BundleWatch:
npm install bundlewatch@1 --save-devpnpm add bundlewatch@1 --save-devyarn add bundlewatch@1 --devbun add bundlewatch@1 --dev- 逐项查看下面的需要检查的地方。
- 构建,然后运行
npx bundlewatch,保留现有的 glob 或--config <路径>参数。确认它检查的是预期的文件和体积限制。
使用 AI 编程助手升级
将下面的提示词复制到你的 AI 编程助手中,以升级项目:
在这个仓库中将 BundleWatch 升级到 1.0。
阅读 https://bundlewatch.io/guide/migrating-to-v1.md 了解有哪些变化,并阅读 https://bundlewatch.io/llms-full.txt 获取完整的文档。然后:
1. 使用这个项目所用的包管理器,将 BundleWatch 更新到最新的 1.x 版本。它需要 Node.js 22.17 或更高版本:如果 CI 中使用的 Node.js 版本更旧,请更新它。
2. 对照迁移指南中“需要检查的地方”(Things to check)一节检查配置,并跟进其中的链接。查找现在会优先于 package.json 中 bundlewatch 键的 bundlewatch.config.* 文件,确保每个现有命令仍检查相同的文件和体积限制。数字形式的 "maxSize" 现在会生效:如果某个文件未通过一个以前从未检查过的限制,不要提高该限制,而是告诉我。
3. 在 GitHub Actions 上,按照指南中的说明改用工作流的 GITHUB_TOKEN,并移除 1.0 已不再需要的变通做法,例如只是为了避免与 master 对比而设置的 CI_BRANCH_BASE,或设置为 Pull Request 最新提交的 CI_COMMIT_SHA。
4. 如果没有其他地方使用 brotli-size 依赖,请将其移除。
5. 构建,然后运行 `npx bundlewatch`,保留现有的 glob 或 `--config <路径>` 参数,并确认它检查的是预期的文件和体积限制。总结你修改了什么、哪些行为现在有所不同,以及还剩下哪些需要我来做的事,例如删除不再使用的 token secret。需要检查的地方
- 自动找到的
bundlewatch.config.*文件现在会优先于package.json中的bundlewatch键。请检查每个现有命令应使用哪些文件和体积限制。如果某个配置文件仅用于单独的--config命令,请将其重命名为查找列表之外的名称,并更新该命令,使不带参数的运行仍使用package.json。参见配置文件。 - 数字形式的
maxSize(例如102400)现在会生效。如果某个文件现在未通过,说明它以前就已经超出限制:参见 数字形式的 maxSize。 files和ci.trackBranches会替换默认值,而不是与之合并:参见 跟踪分支。- 在 GitHub Actions 上,推送会与默认分支对比,而不是
master:参见 GitHub Actions 上的基准分支。 - Pull Request 构建不再保存基准:参见 Pull Request 构建。
- 没有推送权限的用户的 token 将无法再保存基准:参见 服务的变化。
- 对
bundlewatch/lib/…的深层导入不再可用,bundlewatch/lib/app和bundlewatch/lib/app/index.js除外:参见 加载该包。 - 使用代理时,请参阅 代理变量。使用 GitHub Enterprise 时,请参阅 GitHub Enterprise。
变化内容
加载该包
import bundlewatch, { STATUSES } from 'bundlewatch'以及require('bundlewatch').default/.STATUSES与之前一样可用。- 该包同时提供 ES 模块和 CommonJS 构建,并带有 TypeScript 类型。
bundlewatch/lib/app和bundlewatch/lib/app/index.js仍会加载主导出,import和require()都可以;直接运行node_modules/bundlewatch/lib/bin/index.js仍会运行 CLI。- 其他对
bundlewatch/lib/…的深层导入不再可用;请使用该包的主导出。
结果短链接
- 以前,结果会被打包进 URL,再通过 Firebase Dynamic Links 缩短,而 Google 已关闭该产品。大型项目生成的 URL 会被浏览器和服务器拒绝(issue #404 和 #456)。
- 现在,当服务接受你的 token 进行写入时,链接是短链接:
https://service.bundlewatch.io/r/<id>。什么情况下不是短链接,请参阅 结果链接。 - 每次配置了 token 的运行都会多向服务发送一个请求,用于创建短链接。该请求 5 秒后放弃,并回退为长链接。
- 已有的
/results?d=…链接仍然可以访问,包括maxSize不限时生成的、以前从未能渲染的链接。旧的ja2r7.app.goo.gl短链接在 Google 继续重定向它们期间仍然可用。
bundlewatchServiceHost: null
禁用服务后,不会输出结果链接,GitHub 状态没有 details 链接,Node.js API 返回 url: undefined。在 1.0 之前,该链接指向 null/results?d=…。
带凭据的服务 URL
bundlewatchServiceHost URL 中的 Basic Auth 凭据(https://user:pass@…)仍然有效,并且不再出现在结果链接中:0.x 会把它们输出到 CI 日志中,并作为 GitHub 状态的 details 链接发布。参见 bundlewatchServiceHost。
GitHub Actions 上的基准分支
- Pull Request 构建以前就会与 Pull Request 的目标分支对比。
- 其他构建(例如推送)现在会与仓库的默认分支对比,而不是
master(issue #423 和 service #280)。 - 设置
CI_BRANCH_BASE或ci.repoBranchBase仍然可以覆盖这一行为。如果你设置CI_BRANCH_BASE只是为了避开master,请将其删除:它也会替换 Pull Request 的目标分支。参见 基准分支与跟踪分支。
GitHub Actions 上的 Pull Request 状态
- 状态现在会报告到 Pull Request 的最新提交。
- 以前它们会被报告到
GITHUB_SHA,即一个临时合并提交,因此除非你自己设置了CI_COMMIT_SHA,否则不会显示在 Pull Request 上。继续设置它也仍然有效。
跟踪分支
trackBranches的默认值现在是['master', 'main', 'develop'],在 GitHub Actions 中还会加上仓库的默认分支。- 配置中的
trackBranches和files数组现在会替换默认值。以前它们会按索引逐项合并,因此trackBranches: ['main']实际跟踪的是['main', 'develop']。
Pull Request 构建不再保存基准
Pull Request 构建会与基准对比,但不再保存基准。以前,如果 Pull Request 的源分支名是被跟踪的名称(例如 fork 中的 master),它会用自己的体积覆盖真正的 master 的基准。
哪些构建算作 Pull Request 构建,请参阅 Pull Request 构建。
数字形式的 maxSize
数字形式的 maxSize(例如 102400)现在会生效。以前它会被静默忽略,检查总是通过。如果你的 bundle 超过了数字形式的限制,BundleWatch 现在会报告。
0(无论是数字,还是 '0'、'0kB' 这样的字符串)仍然表示不限制。
其他修复
- 在 GitHub Actions 的推送构建中,包含
/的分支名现在能被正确读取:0.x 会把推送到feat/foo识别为feat(issue #422)。 - 如果一次运行中有文件缺失或无法读取,它不再发送基准。服务以前也会拒绝这样的基准;现在 CLI 会记录原因。
- 使用
compression: 'none'时,空文件会被计为 0 B,而不是以Could not read file失败。使用 gzip 和 brotli 时,空文件以前就会被测量(分别为 20 B 和 1 B)。 - 名为某个
Object.prototype属性(例如constructor)的文件被删除后,现在会显示为已移除,而不是没有体积的通过项。同名的新文件会以 0 字节作为基准。规范化后路径恰好为__proto__的文件,现在会被测量和检查,而不是被丢弃。 - 在没有 package.json 的目录中运行 BundleWatch 不会再崩溃(issue #434)。
-V和--version会输出版本号。其他参数与之前一致,包括不带值的--max-size表示不限制体积;参见 命令行。- 设置了
CI但没有设置CI_REPO_OWNER和CI_REPO_NAME时,BundleWatch 会回退到GIT_URL,而不是使用仓库undefined/undefined。 - BundleWatch 现在会先查找
bundlewatch.config.*文件,再回退到package.json。搜索从当前目录开始,包含最近的package.json所在目录,在每个目录中依次检查.mjs、.js、.cjs、.mts、.ts、.cts和.json。使用第一个找到的文件;没有包时会搜索到文件系统根目录。配置无效时运行失败,不会回退。--config会覆盖自动查找,并支持绝对路径。它通过import()加载.mjs文件以及只有具名导出的配置,并在 Node.js 22.18 及更高版本上加载.ts、.mts和.cts文件。参见 使用配置文件。
代理变量
BundleWatch 不再读取 HTTP_PROXY、HTTPS_PROXY、NO_PROXY 或类似的变量:0.x 只是借由其 HTTP 库顺带使用了它们,从未在文档中说明。如果代理会阻止直接连接,请参阅 故障排查。
Brotli
无需安装 brotli-size 即可使用 Brotli 压缩,你可以将其移除。Node 内置的 zlib 会得到完全相同的体积。
GitHub Enterprise
设置了 GITHUB_API_URL 时,提交状态会发送到该地址的 GitHub API;GitHub Enterprise Server 上的 GitHub Actions 会自动设置它。其余设置请参阅 GitHub Enterprise。
从使用 normalizeFilenames 的 0.3.x 升级
0.3.x 会把所有未被该模式匹配的文件以空名称保存。在第一次运行 1.0 时,这些文件会显示为新增,而一个空名称的条目会显示为已移除,直到某个跟踪分支保存了新的基准。
服务的变化(service.bundlewatch.io)
这些变化适用于所有 CLI 版本,包括 0.x。
WARNING
在 service.bundlewatch.io 强制执行下面更严格的检查之前,请替换没有推送权限的用户的 token:以拥有推送权限的用户身份在 /setup-github 创建新的 token,或在 GitHub Actions 中使用 GITHUB_TOKEN。
POST /results用于创建短链接,需要写入权限(见下文);GET /r/{id}用于渲染它。- 保存基准和创建短链接需要更严格的授权,先以仅报告模式上线:
- 要保存基准,公开仓库上的 token 必须属于拥有推送权限的用户,或者是该仓库的安装 token,例如该仓库自己工作流中的
GITHUB_TOKEN。 - 以前,任何 GitHub token 都可以覆盖公开仓库的基准。
- 一开始,服务只会记录新规则将会拒绝的请求。
- 在报告模式下,更严格的检查从不改变决定,即使它失败或超时也是如此。
- 读取基准与之前一致。
- 要保存基准,公开仓库上的 token 必须属于拥有推送权限的用户,或者是该仓库的安装 token,例如该仓库自己工作流中的
- 错误码有所变化:
- 格式错误的结果链接返回
400,而不是500。 - 与 GitHub 通信失败时返回
503,而不是401或500。 - 过大而无法保存的基准返回
413,而不是500。
- 格式错误的结果链接返回
- 服务现在接受
maxSize为体积字符串(例如"100KB")的基准和链接。0.x 会拒绝它们,尽管当配置中的maxSize是数字时,0.x CLI 自己就会发送这样的值。 /setup-github会校验 OAuthstate。在另一个浏览器中发起的授权,或 10 分钟之前发起的授权,需要重新开始。- 部署改用 AWS SAM 和 GitHub Actions OIDC,取代 Serverless Framework v3 和 CircleCI。参见
packages/service/README.md。
使用 GitHub Actions 的 token
如果你在 GitHub Actions 中使用从 service.bundlewatch.io/setup-github 获取的 token 运行 BundleWatch,可以改用 GitHub 为每次工作流运行创建的 token:为工作流授予 statuses: write 权限,保留 contents: read,并将 secrets.GITHUB_TOKEN 作为 BUNDLEWATCH_GITHUB_TOKEN 传入。服务接受用该 token 保存基准和创建短链接。完整的工作流请参阅 GitHub Actions。