维护记录

完成的工作

  • scripts/rename-posts.ts 接入 .github/workflows/deploy.yml:在 Install Bun dependencies 之后、Generate covers and inject front matter 之前新增 Rename posts 步骤,使每次 master 推送自动将文章重命名为 YYYYMMDD[xxxxxx].md,并同步处理 cover SVG 与 frontmatter 引用。✅
  • package.json 新增 typescript@7.0.2@types/bun 开发依赖,用于 CI 中编译脚本。✅
  • 新增 tsconfig.scripts.json:将 scripts/**/*.ts 编译输出到 scripts/dist/noEmitOnError: false 保证即使存在类型错误也会产出 JS。✅
  • .gitignore 增加 scripts/dist/,避免提交 CI 产物。✅
  • 更新 .github/workflows/deploy.yml:安装依赖后先执行 bunx tsc -p tsconfig.scripts.json,随后所有 bun scripts/*.ts 改为 bun scripts/dist/*.js。✅
  • 修复 scripts/format-markdown.tsexecSyncshell: true 在 TypeScript 7 / @types/node 下产生的类型错误,改为根据平台选择 cmd.exe/bin/sh。✅
  • 修复 scripts/__tests__/rename-posts.test.ts 的跨文件 mock.module 污染问题:在 beforeEach 中恢复真实 node:fs/promisesnode:fs 模块,避免其它测试的 mock 影响真实 fs 集成测试。✅
  • 迁移到 Node v24
    • package.json 删除 bun-types@types/bun,新增 @types/node@^24;移除 bun.lock,由 npm install 生成 package-lock.json
    • tsconfig.scripts.json 切换到 module/moduleResolution: NodeNext,使编译产物的相对导入带上 .js 后缀。
    • 所有脚本的 shebang 和使用说明改为 node scripts/dist/<name>.jsscripts/rename-posts.tsBun.spawn 替换为 node:child_processspawn
    • 所有 8 个测试文件改用 node:test + 本地 expect 助手(scripts/__tests__/expect.ts),并把原本 mock node:fs/promises 的用例改为真实临时目录集成测试(inTempDir 助手),避免了 Node 实验性 --experimental-test-module-mocks 的缓存痛点。
    • 5 个 GitHub Actions workflow(deploy.ymltest-scripts.ymlcheck-dead-links.ymlsync-covers.ymlvalidate-posts.yml)移除 oven-sh/setup-bun,改为 actions/setup-node@v4 + npm install + npx tsc + node scripts/dist/*.js。✅

遇到的问题

  • tsc 首次编译报错 Cannot find type definition file for 'bun',原因是仅安装 bun-typestypes: ["bun"] 无法解析;补充安装 @types/bun 后解决。⚠️
  • 编译过程中 scripts/format-markdown.tsshell: true 触发类型错误,已按平台显式指定 shell 路径。⚠️
  • 全量 bun testmock.module 在 bun:test 中跨文件持久而偶发/必发失败;已通过恢复真实模块解决。⚠️
  • Node 原生 ESM 不支持扩展名省略,源 TS 文件全部相对导入加上 .js 后缀。⚠️
  • Node 的 mock.module 只能影响后续 import(),而 ESM 模块缓存对同一次 import 复用旧导出;改用真实临时目录集成测试以绕过实验性 API。⚠️
  • node --test scripts/dist/__tests__/*.js 在 npm scripts 中依赖 shell 展开 glob,CI (bash) 正常;Windows 上需另行处理。⚠️

下次建议

  • 观察首次迁移后 CI 运行日志(Hugo on GitHub PagesTest Scripts 等),确认 Node 工具链无回归。
  • 如需把 npm test 在 Windows 上做成跨平台,可改用 node --test scripts/dist/__tests__(目录)或显式列举文件。