
如何生成并更新 esbuild 的内部浏览器兼容性表【免费下载链接】esbuildAn extremely fast bundler for the web项目地址: https://gitcode.com/GitHub_Trending/es/esbuildesbuild 在把代码降级到目标--target时依赖两份由脚本生成的 Go 文件internal/compat/js_table.go 和 internal/compat/css_table.go。它们记录了各浏览器引擎Chrome、Safari、Firefox、Node 等对各类 JavaScript 与 CSS 特性的支持起始版本文件开头都标注了This file was automatically generated不能手工编辑。当你需要在本地重新生成这两份表或者把背后的第三方兼容性数据源刷新到最新版本时入口就是 compat-table/README.md 中给出的两条命令make compat-table和make update-compat-table。本文按仓库内 docs/development.md 与 Makefile 的描述完整走一遍这两条路径。准备工作环境要求compat-table/README.md 说明该代码从第三方浏览器兼容性数据生成 esbuild 的内部浏览器兼容性表运行入口是顶层仓库目录下的make命令。结合 docs/development.md 与 Makefile 的实际目标需要满足已安装 Go并能通过make构建出 esbuild 可执行文件文档给出的等价手动方式是go build ./cmd/esbuild已安装 Node因为生成过程会执行npm ci并用node运行打包产物。如果已有构建好的./esbuild可跳过这一步否则在仓库顶层目录执行make该目标对应 Makefile 中的esbuild: version-go cmd/esbuild/*.go pkg/*/*.go internal/*/*.go go.mod构建成功后会在顶层目录得到名为esbuild的可执行文件Windows 上是esbuild.exe。重新生成兼容性表make compat-table在顶层目录执行make compat-table对照 Makefile 中该目标的定义它依次做三件事准备 npm 依赖。compat-table目标依赖compat-table/node_modules该目标的实现是cd compat-table npm ci按 compat-table/package-lock.json 安装锁定版本的依赖包括mdn/browser-compat-data和caniuse-lite当前锁定版本见 compat-table/package.json。用 esbuild 打包生成器。执行./esbuild compat-table/src/index.ts --bundle --platformnode --external:./compat-table/repos/* --outfilecompat-table/out.js --log-levelwarning --sourcemap把 compat-table/src/index.ts 打包为compat-table/out.js。其中--external:./compat-table/repos/*表示不打包repos/目录下克隆的数据仓库。运行生成器。执行node --enable-source-maps compat-table/out.jscompat-table/src/index.ts 中的generateTableForJS与generateTableForCSS分别把结果写回仓库内的internal/compat/js_table.go与internal/compat/css_table.go写入位置见 compat-table/src/js_table.ts 与 compat-table/src/css_table.ts 开头的注释。需要知道的一个副作用compat-table/src/index.ts 在入口处会调用installGitHubDependencies()它读取 compat-table/package.json 中githubDependencies字段钉住的 commit把对应的 kangax/compat-table 数据仓库克隆到compat-table/repos/下并git fetch后git reset --hard到钉住的那个 commit。也就是说这一步会访问网络、下载 git 仓库且会在compat-table/repos/下产生本地克隆该目录被--external排除在打包之外只在运行时读取。验证生成结果生成器是无条件覆盖写两个 Go 文件的因此验证方式是检查这两个文件的内容与改动。运行完后打开 internal/compat/js_table.go确认首行仍是// This file was automatically generated by js_table.ts其中包含Engine常量Chrome、Deno、Edge、ES、Firefox、Hermes、IE、IOS、Node、Opera、Rhino、Safari及各特性的版本区间用git diff internal/compat/js_table.go internal/compat/css_table.go查看相对于仓库当前提交的变化。如果数据源没有变化diff 应为空有变化则说明表内容已按当前锁定的数据源重新生成。另外docs/development.md 说明仓库的 Go 测试可以用make test-go或手动go test ./internal/... ./pkg/...运行可用于确认改动后的代码整体仍可编译测试。更新第三方数据源make update-compat-tablemake compat-table只是用当前锁定版本的数据重新生成表。要让表反映最新的第三方数据compat-table/README.md 指明应使用make update-compat-table。在顶层目录执行make update-compat-table对照 Makefile 的定义它与上面的流程有两处实质区别先执行cd compat-table npm i mdn/browser-compat-datalatest caniuse-litelatest --silent --save-exact把这两个 npm 包升到最新版并写入 compat-table/package.json 与 lockfile--save-exact精确记录版本号。这一步会修改仓库中的文件执行前请确认工作区状态必要时先提交当前改动。打包步骤相同但运行命令带上了--update参数node --enable-source-maps compat-table/out.js --update。查看 compat-table/src/index.ts 中installGitHubDependencies的实现检测到--update时它会把 kangax/compat-table 克隆git reset --hard到origin/gh-pages的最新提交并把新 commit hash 回写到compat-table/package.json的githubDependencies字段不带--update时则始终回到钉住的 commit。验证方式与上一节相同检查internal/compat/js_table.go、internal/compat/css_table.go是否被重写以及git diff中是否出现 compat-table/package.json 里依赖版本与githubDependenciescommit 的变化。更新后建议同样运行make test-go确认测试通过。表的构成与已知限制理解生成逻辑有助于判断哪些变化会进入表里三个数据源合并compat-table/src/index.ts 依次把compat-table.ts处理 kangax/compat-table 仓库的数据、caniuse.tscaniuse-lite、mdn.tsmdn/browser-compat-data的支持数据mergeSupportMaps合并同一特性引擎版本组合冲突时会直接抛出Merge conflict错误所以数据源更新失败时优先看这个报错。人工覆盖compat-table/src/index.ts 中还有一段段手动force覆盖例如针对 Safari 的FunctionOrClassPropertyAccess、针对 Firefox 的css.GradientInterpolation每条都带注释说明原因。第三方数据与实测不符时的修改点就在这里而不是改生成后的 Go 文件。不支持的数据视为不支持supportMapToVersionRanges中如果某个版本没有失败记录但通过的测试数少于最大值会被保守地判定为不支持注释解释这是针对无法再运行的很旧浏览器版本的部分数据情况。整个流程依赖网络npm 安装、git clone/fetch kangax 数据仓库生成的两个 Go 文件会被覆盖写入仓库这些都是该操作的固有副作用。【免费下载链接】esbuildAn extremely fast bundler for the web项目地址: https://gitcode.com/GitHub_Trending/es/esbuild创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考