[基建日志] 发文流水线的终极闭环:100% 机器防呆

脚手架生成模板、自动注册路由——lastIndexOf(']') 纯字符串注入的暴力美学。杀鸡不用牛刀,但鸡必须死。

发现裂缝

昨天刚吹完"三重防御系统",今天重构列表页改成数据驱动的 Registry 模式时,突然发现给自己挖了个坑: 脚手架 create-post.js 能自动生成模板文件,但如果我脑子一抽忘了往 blog-registry.ts 里加数据,就会产生一个"幽灵页面"—— 文件存在,路由能访问,但列表页不展示。SEO 爬虫能抓到,用户却找不到入口。

这不是假设。这就是stw-sentinel-guide曾经的状态—— 一个孤魂野鬼,在列表页的盲区里游荡。

打上补丁

怎么解决?引入一个庞大的 AST 解析器来精确操控 TypeScript 语法树?

不。杀鸡不用牛刀。

最终方案是一段极其粗暴但绝对有效的逻辑:

// 定位数组最后一个 ] 的位置,在其前方插入新条目
const lastBracketIdx = registryRaw.lastIndexOf(']')

const newEntry = `{
  slug: '${slug}',
  title: '${title}',
  description: '${description}',
  tag: '${tag}',
  date: '${datePublished}',
},`

const injected = registryRaw.slice(0, lastBracketIdx) + newEntry + '\n]'

没有抽象语法树,没有编译器插件,没有任何运行时依赖。lastIndexOf(']') 定位数组末尾,纯字符串拼接注入。 粗暴、丑陋、但 100% 有效

因为 blog-registry.ts 的结构是确定的——一个导出数组,里面是字面量对象。 对确定结构的文件做确定性操作,AST 是过度工程。

终极闭环

现在 pnpm post:new 一条命令完成三件事:

  1. 生成模板 — SEO 六件套(canonical、JSON-LD、OpenGraph、Twitter Card、keywords、description)全部预埋
  2. 注入注册表blog-registry.ts 自动追加,列表页立刻可见
  3. 零人工干预 — 从敲回车到"文章上线",不需要手动编辑任何配置文件

加上构建前的 verify-seo.js 卡点,整条流水线实现了:

人类只需要写内容。其余全部交给机器。

Dogfooding

顺便说一句,你现在看到的这篇文章,就是用这套刚写好的自动注入脚本生成的。

一条命令。零手工配置。模板 + SEO + 路由注册,全自动。

Dogfooding feels good.


2026-04-15 · diffserv.xyz