和 Codex 一起重构博客

Table of Contents

起因是看到了项目 impeccable,一个面向网页设计优化的 skills 集。我想验证这套能力在自己的博客上能推进到什么程度,于是以现有站点为对象做了一次完整重构。

注意:本文大部分是 codex 自己生成的,我只是简单做了校订。

这次工作持续了2小时1,范围从界面审计逐步扩展到发布链、样式系统和入口内容统一。最终结果不是单点修补,而是一次沿着“审计 -> 修复 -> 抽象 -> 打磨 -> 回收内容层问题”推进的系统性整理。

Impeccable 项目

这是一个专业的网页设计优化 skill 集,支持多种 agent 工具,他提供以下几个有用的 commands,也是我这次项目中使用的

  • audit 审计,能对现在的设计做全面的设计审计,给出问题报告,包括评分和建议,往往是所有过程的开始
  • critique 批评,从用户体验角度做质量评估,提供可用反馈
  • harden 硬化,优化错误处理,文本信息,边界条件处理等,提供健壮性
  • normalize 规范化设计,让各页面的设计保持统一
  • optimize 优化性能,减少图片、字体等加载延迟
  • adapt 多尺寸设备支持
  • clarify 改进文案,标签和 thumbnail ,让界面更可理解
  • animate 提供更好的交互动画
  • colorize 提供更好的颜色,优化可读性
  • extract 提取可复用组件,让系统更好维护

可以看到,这整套 skills 是符合设计流程和工程流程的,一站式解决了开发者”随手写的样式很难看“,但抄样式又抄不出统一性的问题。

博客样式优化流程

起点:先让它做一次足够严格的审计

起点不是直接改样式,而是先做一次比较完整的 audit。这样可以先建立问题列表,再决定修改顺序,而不是围绕模糊的审美直觉来回试错。

第一轮结论大体准确:站点并不属于典型的 AI 模板风格,但存在一批长期维护项目常见的问题,包括共享 CSS/JS 的历史遗留缺陷、导出器责任混杂、页面级内容完成度不一致,以及首页和文章页层级不够稳定。更重要的是,这一轮已经把问题按层拆开:共享资源、导出链、内容源、视觉细节。后续协作基本都沿着这条分层继续推进。

先把上下文钉死:引导 AI 正确理解项目构建方式

在开始修改之前,我先把项目的真实边界补充完整,我的项目是使用 使用 org-mode 写博客 ,所以工程化方式很特殊:

  • assets/ 目录是静态的,可以直接改。
  • 其他 HTML 页面都由 ~/.emacs.d/site-lisp/ox-publish-blog.el 生成。
  • 平时我在 Emacs 里用 M-x my/preview-blog 预览,站点跑在 localhost:8080
  • 只要全套环境加载完整,也可以 batch 执行发布。

这些信息后来都写进了本地的 AGENTS.md 。这样做的直接作用,是把“哪些文件可直接修改、哪些必须回源头”的规则固定下来,避免后续把时间浪费在错误层面。

第一阶段:先做 harden,把共享层的硬问题处理掉

明确生成链路之后,最先推进的是 harden,而不是样式打磨。共享层不稳,后续的 visual polish 很容易变成返工。

这一阶段主要处理了三类问题:

  1. 修共享前端资源里的问题

桌面端 TOC 观察逻辑原来有选择器错误,移动端 TOC 开关也不是一个真正可访问的按钮。修正之后,目录才真正成为稳定的导航系统。

  1. 修共享样式和主题 token

dark token、对比度、触控尺寸、长文本溢出等基础问题也做了一轮修补。这些修改不显眼,但决定了站点的整体完成度。

  1. 把修复放回导出链,而不是手改生成页

skip link、外链 noopener noreferrer 、CDN 图片统一升级到 HTTPS、图片 alt 和 lazy/decode、页面语言标记等处理,都回收到了 ox-publish-blog.el 的后处理逻辑里。目标不是修当前输出,而是保证后续发布默认就是正确的。

第二阶段:normalize 和 optimize,把“系统感”补起来

共享层基本稳定后,继续推进的是 normalize 和 optimize。

normalize 的核心不是换皮,而是把零散数值收成一套稳定 token,包括颜色、阴影、圆角、间距、字体角色和明暗主题规则。到这一步后,共享样式才真正具备统一性。

optimize 更偏工程层。最大的收益是移除了每个 HTML 页面重复注入的 Org 默认内联样式,统一改成依赖共享样式文件。这一步也暴露出一个事实:页面其实仍然依赖其中一批 Org 基础规则。后续又补回了标题、对齐、tag、timestamp、postamble 等基础样式,才使这次优化真正闭环。

第三阶段:extract,把导出器从“能跑”整理成“能维护”

这次协作里,工程价值最高的一段其实是 extract。

原来的 ox-publish-blog.el 能完成发布,但更像长期演化出来的工作脚本,而不是边界清晰的发布系统。随着修复逐步增多,如果继续往里堆逻辑,维护成本会很快上升。

因此后来连续做了几轮 extract:

  • 把 shared publish config 抽出来
  • 把 HTML 后处理流水线拆成明确步骤
  • 把 sitemap 里的 HTML 片段模板化
  • 把 postamble、analytics、license、元信息行拆成可复用片段
  • 最后把 org-publish-project-alist 也改成统一 builder 生成

这部分完成之后,最明显的改进不在页面,而在维护性。导出器的职责边界更清楚,后续继续扩展时不必再依赖历史记忆。

第四阶段:polish,不是改花,而是把不顺的地方收平

进入 polish 阶段后,重点不是添加更多视觉元素,而是消除那些影响阅读节奏和版面一致性的细小问题。

这一阶段最有效的调整包括:

  • 首页不再是所有文章权重一样的长列表,而是有主推和次级层级
  • 文章页的 TOC 被明确降级成辅助导航,不再抢标题区的注意力
  • 中英混排的字体气质重新统一,避免英文像一套设计、中文像另一套设计
  • 首页首卡逐渐减轻“组件感”,更像编辑导语区
  • 导航、文章标题链接、目录链接的 hover 和 active 状态变得更自然
  • 有 TOC 的文章页里,首段和正文列宽重新统一,不再突然窄一截

其中一个很典型的问题,是带 TOC 的文章页里首段和正文宽度不一致。最后定位到的根因并不是容器宽度,而是一条专门作用于 p:first-of-typeblockquote + pmax-width: 58ch 规则。删除这条规则之后,版面立即恢复一致。这个例子说明,AI 在这类工作里最有效的作用往往不是“自动生成更好的 CSS”,而是帮助更快定位真正生效的那一层规则。

第五阶段:clarify,把入口内容的完成度拉齐

样式和结构稳定之后,内容层的不一致开始变得显眼。于是又做了几轮 clarify,把高曝光入口页的标题和摘要重新整理了一遍,例如 About 改成 =关于=,旧文章标题统一成更稳定的中文展示名,首页前几篇摘要也改成更适合扫读的形式。

这一步再次说明,视觉系统稳定之后,内容质量会被更清楚地暴露出来。设计系统不能替代内容整理,但它能把内容层的问题显式化。

这次协作真正让我满意的,不是页面本身

如果只看结果,这次得到的成果包括:

  • 共享样式和共享脚本更稳了
  • 发布链可以在 batch 环境里完整跑通
  • 站点生成逻辑更清楚了
  • 首页、文章页、移动端的阅读体验都更顺了
  • 入口内容的标题和摘要也更统一了

更重要的是,这次协作逐渐形成了一套明确的工作方式2

  • 先审计,再分层
  • 把项目边界讲清楚
  • 共享问题回到 shared asset
  • 生成问题回到导出器
  • 内容问题回到 Org 源
  • 每一轮都只解决一类问题

和单次把页面“改完”相比,这种分层处理方式更适合长期维护。

正确的与 Codex 做交互

本段是人写的

Codex 已经很聪明,但因为我目前还没让他连接 browser ,他看不到真正的 UI ,我会在预览结果后,通过截图和标注告诉 Codex 有问题的地方,让他优化。多数时候,我只是问他:你觉得你接下来要做什么?

他会告诉我,我们现在有 1/2/3 多个项目,但收益更大的是应该先做 1 。这是一种良好的判断。

或者我问:我们是不是到这里差不多了,但我有一个另外的需求。Codex 多数时候也答应。总的来说,通过这套 skill 来做样式重构还是非常简单的。

结语

这次重构之后,我更确定了一点:AI 更适合作为可纳入工作流的工程伙伴,而不是脱离上下文的万能生成器。它适合参与审计、定位、重构和复盘;前提是项目结构足够清楚,修改边界足够明确。

这次工作的最终价值,不只在于页面本身变得更稳、更统一,也在于博客的维护方式被进一步显式化。对于长期维护的个人站点来说,这比单次视觉优化更重要。

Footnotes:

1

codex 生成这一段时说他用了两天,典型的 ai 幻觉。

2

其实我觉得最大的收获是我不需要自己写任何东西,把需求告诉 codex 就行了,包括这篇文章

Author: gsj987

Publish Date: 2026-03-14 Sat 15:42

License: CC BY-NC 4.0