海边

2026-10-05

维护记录

完成的工作

  • 删除博客底部右侧的 powered by hugo 与 hugo-paper 两个外链,保留左侧 © {{ 年份 }} {{ 站点标题 }} 版权段 ✅
    • 新增覆写文件 layouts/partials/footer.html,照搬 vendor 主题 themes/hugo-paper/layouts/partials/footer.html 的结构,仅去掉右侧两个 <a> 标签
    • 顶部加注释说明:与 themes/hugo-paper/layouts/partials/footer.html 同步、只尾部两个 <a> 不同,下次主题 bump 时按此对比 diff
    • 走覆写模式(与 partials/bg.html / partials/header.html / _default/baseof.html 同套路),vendor-in 的 themes/hugo-paper/ 不动,避免下次 sync hugo-paper 时冲突
  • 验证 hugo --minify 通过(265 页)、deno task test 通过(23/23)、deno task validate-posts 通过
  • 构建产物 public/ 中新生成的页面 footer 正确收敛为:
    1<footer
    2  class="mx-auto flex h-[4.5rem] max-w-(--w) items-center px-8 text-xs tracking-wider uppercase opacity-60"
    3>
    4  <div class="mr-auto">© 2026, sdttttt</div>
    5</footer>
    

遇到的问题

  • 调试时 which deno 找不到 —— 本机 mise 装了 deno 2.9.7 但 cwd 不在用 deno 的项目根,shell 没自动激活。直接用绝对路径 ~/.local/share/mise/installs/deno/2.9.7/bin/deno 跑即可 ⚠️ - 下次可直接 mise exec -- deno task test
  • public/ 里能看到一些旧 slug 文件(20240615-immortalwrt的编译踩坑-vc6/、20200402-只需要服务中心-b4y/ 等)渲染成 PaperMod 风格 footer —— 这是上一次部署留下的旧产物(rename-posts.ts 每次重生成随机 4 位 hash),新构建会用新 slug t2s / 6v0,CI 下次 deploy 整树覆盖后即消失

下次建议

  • vendor-in 主题 + override 模式现已稳定(4 个覆写:_default/baseof.html、partials/bg.html、partials/header.html、partials/footer.html),下次 sync hugo-paper 时记得逐一对照 diff
  • 如未来想完全自定义 footer 文案(比如加 RSS / ICP 备案号),直接改 layouts/partials/footer.html 即可;版权段目前读 site.Copyright,未配置所以走默认 © {{ now.Year }} {{ site.Title }}

维护记录(续)

完成的工作

  • 清理 static/bg/ 下的 3 张 JPG(原图为抠图前的备份,按 claudelog 14 续计划"如果不再需要回滚可手动删除")✅
    • 删除:F_tZfZBbwAALItU.jpg (256KB) + FxC7q1YaUAE8SOL.jpg (197KB) + GiG69PDa8AAvoeS.jpg (127KB),共 ~580KB
    • 模板 layouts/partials/bg.html 没做 basename 去重,同名 JPG/PNG 会被全部加载,所以这次清理同时节省仓库体积和访客下载量
    • hugo --minify 重新构建,public/index.html 现在只有 3 个 .page-bg__img div(之前是 6 个,jpg+png 各一份)
  • 顺手验证:仓库内其它位置无 .jpg 引用;.DS_Store 在 .gitignore 里

遇到的问题

  • claudelog 14 续写过 “按 basename 优先 PNG、忽略同名 JPG” 的 baseof 重构,但读 layouts/partials/bg.html 实际没有这个过滤逻辑(readDir 直接 append 所有 jpg/png)⚠️ - 当时要么 claudelog 描述超前于代码改动,要么被回滚过
  • 这次没去补这个去重逻辑 —— 因为直接删 JPG 已经解决了"多倍加载"问题(一个 div 一份 URL);如果以后再加新图,要么用纯 PNG,要么重新审视这个模板

下次建议

  • 当前 static/bg/ 留下 .DS_Store(gitignored,不会进仓库),3 张 PNG 各 ~200KB。如果以后想再瘦身,可以用 sharp / oxipng 对 PNG 做无损压缩,预计能再省 20-30%
  • claudelog 14 续描述的 baseof 重构可能从未落地;如果未来想严格按"按 basename 去重"的语义加回来,注意当前"删 JPG"已经让模板自然只剩 3 张图,加上去重后行为不变

维护记录(再续)

完成的工作

  • 修复 layouts/partials/bg.html 模板的后缀白名单
    • 根因:Go template 第 27 行用 (in (slice ".jpg" ".jpeg" ".png" ".webp" ".gif" ".svg") (path.Ext .Name)),把 JPG/PNG 都接受,static/bg/ 里同名 .jpg/.png 都会被加入 $bgImages,最终页面同时下载 2 倍体积
    • 修复:改为 (eq (path.Ext .Name) ".png"),只接受 .png 后缀
    • 位置:layouts/partials/bg.html:27(readDir 分支)
    • 防御性收益:以后误传 JPG 到 static/bg/ 也不会被加载
    • hugo --minify 重建验证:仍是 3 张 png,渲染正确

遇到的问题

  • claudelog 14 续里的描述是"按 basename 优先 PNG、忽略同名 JPG",但代码里没体现。这次不按"basename 去重"的方案做(更复杂),而是直接把白名单收敛到 .png —— 因为 static/bg/ 事实只使用 PNG,白名单语义最清晰;要支持别的格式再去改也方便 ⚠️

下次建议

  • 如果以后真的需要支持多种格式(webp/svg/jpg),可以加一个 helper:basename → format priority,既保留多格式又避免双倍加载

维护记录(三续)

完成的工作

  • AGENTS.md 「提交与 PR 规范」节追加一条规范:推送前必须先检查远端是否有新提交 ✅
    • 触发原因:今天这次 push 遇到了 rebase 冲突 + 需要 --force-with-lease 才能推上去 —— 根因是本地 commit 876248f 完成后 CI bot 又推了 b71c015 chore(format): prettier markdown,远端在我推上之前已经领先一步
    • 新规范内容:
      • 推送前必跑:git fetch origin && git log HEAD..origin/master --oneline
      • 看到新提交(常见来源:CI bot 的 chore(format) 格式化了你刚改的 markdown)必须先 rebase / merge 解决冲突再 push
      • 避免与远端历史分叉;--force-with-lease 仍是 rebase 后的合规选项,但能避免就避免

下次建议

  • 如果 CI race 频繁发生(如 deploy.yml 的 Commit auto-fix results 步骤在 push 完成后又产生新 commit),可以考虑:
    • 给 auto-fix 脚本加 git fetch < origin --quiet && git rev-parse HEAD 检查:如果本地 HEAD 跟 fetch 后的 origin/master HEAD 不一致,说明已有人推送,则跳过 auto-fix commit
    • 或者把 Commit auto-fix results 步骤拆到 deploy job 之后单独跑,避免跟用户 push 抢顺序
  • 当前 git-commit-push.ts 的 pull --rebase 已经会捕获到远端领先,但没有"在 add -A 之前先 fetch 检查"的逻辑 —— 如果有上游 race 担忧,可以在脚本里加一步 dry-run git fetch + 比比 HEAD 与 origin/master,有差异时先 dry-run 报错而不是直接 add + commit

维护记录(四续)

完成的工作

  • 主题架构重构:layouts/ override → themes/sdttttt-paper/ 子主题(从方案 A/B/C 中选 C)✅
    • 背景:此前用 layouts/ 覆写 + vendor-in themes/hugo-paper/ 两层结构,维护时需要同步跟踪两个目录;想统一到"自己的主题"
    • 新结构:
      • themes/hugo-paper/ — 父主题,原样 vendor-in
      • themes/sdttttt-paper/ — 子主题,通过 Hugo [parent] name = "Paper" 继承父主题,5 个 override 文件 + 1 个 theme.toml + 1 个 README.md
      • go.mod — 新增,Hugo modules 入口(module github.com/sdttttt/sdttttt.github.io)
      • hugo.toml — theme = "sdttttt-paper" + 新增 [module.imports] 块让父主题作为 module 加载
      • 旧的 layouts/_default/baseof.html / layouts/partials/{bg,header,footer}.html / assets/custom.css 全部 git mv 到 themes/sdttttt-paper/(git 识别为 R,保留 blame)
    • 每个 override 文件头注释已更新:明确说明这是 sdttttt-paper 的文件、原件在父主题哪、sync 上游时如何 reapply diff
    • themes/sdttttt-paper/README.md 新建:说明基于什么、override 清单、同步上游两步指南
    • 删除空的 layouts/ 和 assets/ 目录(里头仅 .DS_Store,已被 .gitignore)
    • AGENTS.md「项目结构」节 同步重写:描述新两层主题布局、go.mod 入口、主题同步两步走

遇到的问题

  • [parent] block 在 directory-based 主题下不生效:起初 sdttttt-paper/theme.toml 写了 [parent] name = "hugo-paper"(按目录名猜),但 [parent] 在 Hugo directory-based 加载路径下完全被忽略——构建结果只有 14 页(仅 sdttttt-paper 自带那 4 个 layout 有效页面),其余页面 fallback 到 0 layout,3 个 WARN(taxonomy / term / search 没 layout)⚠️
  • [parent] name 实际匹配的是父主题 theme.toml 的 name 字段而不是目录名:父主题 themes/hugo-paper/theme.toml 里是 name = "Paper",不是 hugo-paper。改成 [parent] name = "Paper" 后仍然不行——说明 [parent] 这个字段本身在 directory-based 加载路径里就是失效的
  • 主题继承要求 Hugo modules,不允许 directory-based 加载:查 Hugo 文档后发现 theme = "X" 是 directory-based 加载、不参与组件继承;要让 sdttttt-paper override hugo-paper 的 layout,必须双方都作为 module 加载
  • Hugo modules 加载 themes/hugo-paper 的 path 写法踩坑:
    • path = "themes/hugo-paper" → Hugo 拼成 themes/themes/hugo-paper(错)
    • path = "./themes/hugo-paper" → 同上(错)
    • path = "hugo-paper" → ✅ Hugo 按短名从 themesDir 找,识别为 module
    • 实际成功的配置:
      1[[module.imports]]
      2  path = "sdttttt-paper"
      3[[module.imports]]
      4  path = "hugo-paper"
      
  • 构建验证:266 页 / 测试 23/23 / validate-posts 通过;footer / bg / 默认亮色 三个 override 都正确生效

下次建议

  • go.mod 与 Hugo modules 体系的引入是这次迁移的最大认知成本。AGENTS.md 已说明 go.mod 是 Hugo modules 入口、不是真的依赖 Go 工具链,但要小心 CI 上 Hugo 版本是否 >= 0.93(项目锁在 0.161.1,无问题)
  • 以后 sync 上游 hugo-paper 时会面临两层 diff:父主题 themes/hugo-paper/ 直接 patch;子主题 themes/sdttttt-paper/ 的 override 文件按每个文件头注释的指引 reapply diff。建议在 sync 前先 git diff themes/hugo-paper/ /tmp/hp-clone/ 看清楚上游改动面再动手
  • 可以考虑:在 sync 上游脚本(未来如果有)中自动检查 themes/sdttttt-paper/ 的每个 override 文件是否需要重同步——比如基于 “diff themes/hugo-paper/X vs /tmp/hp-clone/X,如果上游 X 有变且 sdttttt-paper 也存在同名 override,则报警”
  • 后续可能简化:如果 sync 上游的成本大于 override 的价值(override 变化频繁),可以考虑拆分成多个更小的子主题(一个子主题负责一个 override 关注点),但现在 4 个 override 不复杂,没必要拆