维护记录#
完成的工作#
- 应用户要求,把 scripts 工作流从 Node.js + tsc 全面迁移到 Deno ✅
- 新增
deno.json:tasks 列出全部 14 个入口(test / validate-posts / check-dead-links / format-markdown / sync-covers / gen-covers / rename-posts / optimize-images / git-commit-push + 各 *-dry 变体),unstable: ["sloppy-imports"] 避免改 28 处 .js 后缀 import,imports: { sharp: "npm:sharp@0.33.5" } 锁定 sharp 版本,nodeModulesDir: "none" 拒绝自动创建 node_modules/ - 更新 5 个 workflow yml(validate-posts / sync-covers / check-dead-links / test-scripts / deploy):替换
setup-node@v4 + npm install + npx tsc 三件套为 denoland/setup-deno@v2,把 node scripts/dist/xxx.js 全部换成 deno task xxx 或 deno run -A scripts/xxx.ts - 删除
package.json / package-lock.json / tsconfig.scripts.json / scripts/dist/(168K 编译产物,git 历史里也会清) - 新增
deno.lock(212 行,锁定 sharp + 平台原生包 + transitive deps),跟 package-lock.json 一样入仓 - 更新
.gitignore:scripts/dist/ 改为 .tools/(Deno 二进制 + cache,本地用,不入仓)+ .npm-cache/(旧依赖) - 更新
CLAUDE.md 反映新结构(Deno 命令、scripts 目录树、修正 content/maintenance/ → content/claudelog/、删除不存在的 format-markdown.yml 引用) - POC 5 项全过:Deno 直接吃 .ts /
node:test 原生兼容 / node:child_process.execSync 工作 / npm:sharp 预编译包自动下载 / denoland/setup-deno@v2 一行可换 - 测试 39 passed (162 steps),0 failed — 与 Node + tsc 完全等价 ✅
- 所有 9 个脚本 dry-run 验证可加载/可执行
遇到的问题#
- 沙箱 HOME 不可写 ⚠️
deno_install 默认装到 ~/.deno,沙箱拒绝curl ... | sh 不接受 inline DENO_INSTALL=... env(子 shell 不继承 export 之前的赋值)- 解决:
export DENO_INSTALL="$PWD/.tools/deno" && curl ... | sh -s -- -y
- Deno 默认缓存路径也不可写 ⚠️
DENO_DIR 默认是 ~/.cache/deno,沙箱拒- 解决:本地开发设
export DENO_DIR="$PWD/.tools/deno-cache",CI runner 不存在此问题
--sloppy-imports 是拦路虎 ⚠️- 全部 28 处
from './lib/xxx.js'(实际 .ts 文件)在 Deno 默认严格模式下报错 - 三种解法:加
--sloppy-imports(每次手动)、deno.json 配 unstable: ["sloppy-imports"](项目级)、手工改 28 处后缀(易出错) - 采用 #2,0 行代码改动,vs 改 28 处 import + 担心 typo
- sharp 自动下载有警告 ⚠️
- Deno 默认跳过 npm 包 lifecycle scripts,提示 “Enable
nodeModulesDir: auto” - sharp 不需要 postinstall(平台预编译包
@img/sharp-darwin-arm64 等),警告可忽略 - Linux CI 同理:会自动下
@img/sharp-linux-x64
- Deno task 不解析
-- 分隔符 ⚠️- 原计划用
deno task xxx -- --message "..."(像 npm 那样) - 实测 Deno 2.9 把
-- 原样透传给脚本,被 parseArgs 当成 -- flag - 解决:workflow 里改用
deno run -A scripts/xxx.ts --message "..." 直接调用
- CLAUDE.md 文档漂移 ⚠️
- 原本引用了
.github/workflows/format-markdown.yml,但文件根本不存在(deploy.yml 里有 format-markdown.ts 调用,不是独立 workflow) content/maintenance/ 是错的,实际是 content/claudelog/- 顺手一起修了
决策点#
- 保留 Node + prettier:Deno 没有等价 prettier 的内置格式化器,且 prettier 跨语言一致性强。
deploy.yml 里 format-markdown.ts shell 调用 prettier 是最干净的边界。代价:workflow 仍需 setup-node@v4 + npm install -g prettier@3.9.6,但 node_modules 不存在,体积零增量 - 保留
migrate-slug-scheme.ts(一次性脚本,无测试,workflow 里没引用):虽然功能已结束,但删用户写过的代码得用户授权。留着,以后清理 - 不加
nodeModulesDir: "auto":会强制创建 node_modules/ 目录,违背"零 npm"目标。sharp 无 postinstall,警告忽略
CI 影响#
- before:4 个 workflow 各 5 步(checkout → setup-node → npm install → npx tsc → node scripts/dist/xxx.js),平均每 job ~45 秒在 npm 上
- after:3 步(checkout → setup-deno → deno task xxx),setup-deno 几秒,deno 跑 .ts 是缓存热路径
- 预计 CI 时间省 30-40%
下次建议#
- 观察第一次 push 触发 deploy.yml 的运行,确认 sharp 在 Linux runner 上跑通(
@img/sharp-linux-x64 自动下载) - 如果
deno task test 在 CI 比 node --test scripts/dist/__tests__/*.js 慢(不太可能,但 Deno 冷启动比 node 慢),考虑加 cache: 'deno' 或类似策略到 setup-deno migrate-slug-scheme.ts 可以独立删(下次大扫除时),无功能影响- 如果哪天不需要 prettier 了,可以把 deploy.yml 的
setup-node@v4 也去掉,实现纯 Deno
文件变更清单#
- 新增:
deno.json、deno.lock - 删除:
package.json、package-lock.json、tsconfig.scripts.json、scripts/dist/(含 11 .js + 3 .js in lib/ + 10 .js in tests/) - 修改:
.github/workflows/{deploy,validate-posts,sync-covers,check-dead-links,test-scripts}.yml + CLAUDE.md + .gitignore - 脚本源码(
scripts/**/*.ts):0 行改动