[基建日志] 发文流水线的终极闭环: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 一条命令完成三件事:
- 生成模板 — SEO 六件套(canonical、JSON-LD、OpenGraph、Twitter Card、keywords、description)全部预埋
- 注入注册表 —
blog-registry.ts自动追加,列表页立刻可见 - 零人工干预 — 从敲回车到"文章上线",不需要手动编辑任何配置文件
加上构建前的 verify-seo.js 卡点,整条流水线实现了:
人类只需要写内容。其余全部交给机器。
Dogfooding
顺便说一句,你现在看到的这篇文章,就是用这套刚写好的自动注入脚本生成的。
一条命令。零手工配置。模板 + SEO + 路由注册,全自动。
Dogfooding feels good.
2026-04-15 · diffserv.xyz