当前位置: 首页 > news >正文

SDD 规范驱动实战:我用 Vibe Coding 开发了一个 AI 网页翻译 Chrome 插件

阅读英文技术文章时,你是不是也经历过:复制段落 → 丢进翻译工具 → 格式乱掉 → 再粘回笔记软件 → 手动排版。折腾半天,真正阅读的时间还没排版多。

我最近用 Vibe Coding + SDD(Specification-Driven Development,规范驱动编程)的方式,开发了一个 Chrome 插件:md-wx-chrome-extensions。它能在英文网页上一键提取正文,调用 AI 模型翻译,然后用 Markdown 格式渲染出来,最后一键复制到公众号编辑器。

这篇文章不是纯理论,而是一次真实项目的完整复盘。你会发现:在 AI 能疯狂产出代码的时代,写清楚需求反而成了最核心的工程能力。


一、SDD 文档先行:四个文档,四道保险

很多人用 AI 写代码,上来就是一句:“帮我写个翻译插件。”然后 AI 哐哐生成一堆代码,跑起来发现:提取的正文全是导航栏和广告,翻译接口写死了 OpenAI,界面还是个半成品。

问题出在哪儿?你没有先写文档。

SDD(规范驱动编程)的核心就是:先让 AI 生成完整的规范文档,充分对齐意图,再动手写代码。在我的项目里,第一步不是敲代码,而是让 AI 依次产出四个文档:

proposal.md → 需求文档:做什么、不做什么 design.md → 技术设计:怎么做、选什么技术 task.md → 任务拆分:按什么顺序做 layout.md → 界面布局:界面长什么样、怎么交互

这四个文档就像盖楼前的四张图纸:需求图告诉你盖什么楼,设计图告诉你用什么结构,施工图告诉你先砌哪面墙,装修图告诉你房间怎么布置。图纸齐了,AI 这个施工队才不会乱来。

我通常会这样对 AI 说:

“请先阅读项目背景,然后依次生成 proposal.md、design.md、task.md、layout.md 四个文档。只生成文档,不要写任何代码。等我确认文档无误后再开始编码。”


二、proposal.md:先把“做什么”和“不做什么”说清楚

第一个文档是需求文档,核心就两件事:定义 MVP 和明确边界。

MVP(最小可行性单元)不是把功能做少,而是用最小的成本验证最核心的价值。这个插件的 MVP 就是:

  • 提取当前页面的正文
  • 调用可配置的 AI 模型翻译
  • 以 Markdown 格式渲染
  • 一键复制

至于用户系统、翻译历史、多语言互译、收藏夹……统统不做,写进文档的“非目标”部分。

为了让 AI 理解得更准确,我还会在 proposal.md 里写详细的示例。比如翻译返回格式:

  • 保留原 Markdown 标题层级(#、##、###)
  • 保留代码块、列表、引用等格式
  • 翻译成中文,但专有名词保留英文(如 API、Git)
  • 不添加额外解释,只输出翻译结果

这些约束写清楚,AI 生成代码时就不会自由发挥。你可能会问:写这么多细节,是不是有点浪费时间?恰恰相反,在文档里多花十分钟,能省下后面和 AI 反复拉扯的十个小时。

还有一个容易忽略的点:如果是在已有项目上迭代,必须让 AI 先阅读现有文档和代码,而不是从零生成。否则它可能会推倒你原来合理的设计,把项目搞成四不像。


三、design.md:技术选型决定项目生死

需求理清之后,第二个文档是技术设计。选型就像选地基,AI 可以帮你盖楼,但楼盖在沙滩上一定会塌。

这个项目我遇到了几个关键技术难点,都在 design.md 里做了充分调研和决策:

1. 正文提取:别自己造轮子

“从任意网页提取正文”听起来简单,实际上非常复杂。不同网站的 HTML 结构千差万别,导航栏、广告、推荐列表全是干扰项。

经过和 AI 多轮讨论,最终选定了 Mozilla 的Readability.js,它就是 Firefox 阅读模式的核心库,专门解决这个问题。只需要把当前页面 DOM 传进去,它就能返回干净的正文内容。

选型启示:遇到通用难题,先找现成的成熟方案,而不是让 AI 从零写一个“看起来能用”的提取器。

2. 模型调用:走 OpenAI 兼容协议

AI 模型如果写死某一家,用户就没法自由切换 DeepSeek、通义千问这些国内模型。现在的 AI 圈,OpenAI 接口几乎成了事实标准,很多模型服务都提供兼容协议。

所以核心设计是:把baseURLapiKeymodel全部做成用户可配置项。用户想用哪个模型,只要填对应的地址和密钥就行。这样插件就从一个“OpenAI 翻译工具”变成了“通用 AI 翻译工具”。

3. Markdown 渲染:选轻量库

翻译结果是 Markdown 格式,渲染成 HTML 需要选择一个解析库。我选了marked,轻量、稳定、通用。为什么不用更重的框架?因为插件界面就那么点大,够用就好,别把项目搞复杂。

这三个选型定下来后,整个项目的技术骨架就清晰了:Readability 负责“提取”,OpenAI 兼容协议负责“翻译”,marked 负责“渲染”。design.md 就是把这些决策和理由记录下来,避免后续开发中 AI 又“灵机一动”换方案。


四、task.md:把设计拆成 AI 可执行的小任务

有了需求和技术设计,还不够。如果你直接对 AI 说“按照 design.md 把插件做出来”,它可能会一次性生成大量代码,结果乱七八糟,出了问题都不知道从哪儿查起。

所以第三个文档是 task.md,把整个开发过程拆解成一系列有序的小任务。每个任务都足够小,小到 AI 可以一次性完成并通过验收。

比如我的 task.md 大概是这样的结构:

  1. 初始化项目结构:创建 manifest 文件和基础目录
  2. 实现正文提取模块:集成 Readability.js,编写 content script
  3. 实现 AI 调用模块:封装 OpenAI 兼容接口,支持流式返回
  4. 实现 Markdown 渲染模块:集成 marked,处理复制功能
  5. 搭建基础 UI:根据 layout.md 生成界面
  6. 联调与测试:串联所有模块,修复问题

每个任务完成后,我会运行测试、检查效果,确认无误后 commit 一次。这样即使后面某一步出错,也能快速定位到是哪个任务引入的问题。

task.md 的价值在于:把一个大目标变成一串小目标,让 AI 每一步都有明确的任务边界,也让你每一步都能验收。


五、layout.md:界面布局也要提前定义

第四个文档是 layout.md,专门描述界面长什么样、交互怎么走。很多人忽视这一步,结果 AI 生成的界面要么丑得没法用,要么交互逻辑混乱。

我的 layout.md 里会包含:

  • 整体布局:插件是弹窗还是侧边栏?宽度多少?有哪些区域?
  • 组件描述:按钮放哪里?输入框在哪儿?结果展示区怎么滚动?
  • 交互流程:用户点击“翻译”后发生什么?加载状态怎么显示?复制按钮的反馈是什么?
  • 流式渲染:翻译结果是一段一段出现的,界面如何平滑展示?

这些描述不需要画图,用文字说清楚就行。AI 理解能力很强,只要你描述得足够具体,它就能生成符合预期的界面。

有了 layout.md,AI 在写 UI 代码时就有据可依,不会出现“按钮位置不对”“结果区域太窄”这种反复修改的情况。界面不是玄学,描述清楚,AI 就能画出来。


六、项目准备:把 Git 当成后悔药

四个文档确认后,才开始写代码。但写代码之前,还有一件重要的事:Git 版本控制。

Vibe Coding 最大的风险是什么?AI 生成代码很快,但翻车也很快。有时候它一个“幻觉”,就把你昨天调好的代码改崩了。

所以项目初始化后,我做的第一件事就是初始化 Git 仓库。不是为了装专业,而是因为 AI 生成的是“可验收代码”,你必须随时能验收、能回退。

我给自己总结了三个层次的回退命令:

# 1. 改动还没到暂存区,直接丢弃 git restore . # 2. 改动到了暂存区,但没提交 git restore --staged . git restore . # 3. 已经提交了,回退到上一个版本 git reset --hard HEAD^

这三个命令,在 AI 产生幻觉时就是救命的后悔药。AI 生成代码很快,但回滚更快——前提是你有 Git。

另外,管理 AI 会话也很重要。当一个任务聊了太久,上下文已经严重污染时,我会果断开启新会话,把关键结论写进文档,让新会话先读文档再继续。这样比在一个会话里反复纠正 AI 高效得多。


七、迭代实践:从 Popup 到侧边栏

MVP 跑通后,第一个真实需求来了:

当前 popup 页面是弹窗形式,高度有限。翻译后的内容可能很多,能不能做成从右侧打开,高度撑满整个页面?

这个问题很有意思。很多开发者第一反应是调popup.html的高度,但 Chrome 弹窗有尺寸限制,没办法真正撑满。

我没有急着改代码,而是先 Research:Chrome 插件的 popup 页面是否可以做成侧边栏?

答案是可以,但不是通过 popup,而是 Chrome 的Side Panel API(Chrome 114+)。它可以让插件在浏览器右侧打开一个与页面等高的侧边栏,完美满足需求。

于是我先更新文档。按照 SDD 的流程,四个文档都要同步更新:

  • proposal.md:增加“侧边栏展示”作为需求变更
  • design.md:补充 Side Panel API 的技术方案
  • task.md:新增“改造为侧边栏”的任务项
  • layout.md:更新界面布局,从弹窗改为右侧面板

文档确认无误后,再让 AI 按照文档修改代码。从 popup 到侧边栏,本质上就是配置调整加页面文件改名,以及样式上的一些适配。用户再也不用在小小的弹窗里看长文翻译了。

文档和代码保持一致,Git 同时跟踪两者的版本。这是 SDD 最容易被忽视的优势:需求怎么变的,代码怎么跟着改的,历史记录里一目了然。


八、复盘与踩坑

整个项目做下来,有几个点值得总结:

1. 四个文档缺一不可

proposal 定义方向,design 决定方案,task 控制节奏,layout 保证体验。少了任何一个,后面都可能返工。文档不是走过场,而是 AI 协作中的“合同”。

2. 管理 AI 会话,别让它“精神分裂”

当你和一个 AI 会话聊了几十个来回,它的上下文会越来越乱,开始忘记前面定下的规范。这时候别硬聊,开个新会话,把四个文档扔给它,让它先读再说。

3. 迭代后记得移除冗余代码

从 popup 改成侧边栏后,原来 popup 相关的样式和逻辑就成了死代码。如果不清理,项目会越来越臃肿,AI 下次读取项目时也可能被冗余代码误导。用完就删,保持项目干净,是对下一个接手者(包括未来的你)最大的善意。

Vibe Coding 的本质不是让 AI 替你写代码,而是让你有精力去思考真正重要的设计。

AI 帮你解决的是“怎么写”,但“写什么”“为什么这么写”永远是你自己的功课。SDD 的四个文档,就是把这门功课做扎实。


写在最后

这个插件从四个文档到侧边栏迭代,全程用 SDD + Vibe Coding 完成。最让我意外的不是 AI 写了多少代码,而是文档真正成了项目的“源代码”——代码可以删了重写,但只要文档在,项目就能一次次被准确重建。

如果你也在用 AI 做开发,不妨试试这个流程:先让 AI 生成 proposal、design、task、layout 四个文档,逐项确认,再动手写代码。你会发现,慢就是快,少就是多。

http://www.cnnetsun.cn/news/4212304.html

相关文章:

  • 2026年7月黄石市新房价格深度分析报告
  • 面向具身智能的TVA-VLA长程任务记忆与技能复用
  • php json schema 你的PHP JSON Schema验证,真能像健身库一样,一个git clone就搞定吗?
  • [通信与计算]通信原理03:信道容量与信道编码:原理与工程实践
  • js实践小案例
  • 无偏教师 v2:适用于无锚框和基于锚框检测器的半监督目标检测
  • Agent 敢开写权限吗?—— 深入探讨 AI 代理的自主操作风险与安全边界
  • C++初阶——类和对象(下)
  • AI 编程不得不知道的二三事
  • 隐匿中的生长:当代青年 “偷感” 现象解读
  • 2021CSP-J初赛真题解析(适合复习、巩固、备考)
  • 麒麟(Kylin)服务器系统网卡地址设置
  • 女孩子可以考什么证书比较简单
  • Ansible实战:LNMP一键部署指南
  • 汉森制药(002412)深度研究报告
  • 理解 JWT:三段分别是什么
  • 计算机毕业设计之企业社交网络平台的设计与实现
  • HarmonyOS 性能优化工具链:从「手工排查」到「工程化治理」的全栈实战指南
  • 01-具身机器人硬件全景拆解
  • ABAP 里有没有 AI Agent 的 Progressive Disclosure,一套从封装、Released API 到 RAP 暴露层的完整对照
  • 从奈奎斯特判据到无源性:为什么只需保证逆变器导纳无源就能稳定并网?
  • 【python】条件语句
  • 【2015-03-02】《RealView编译工具汇编器指南》摘录:内置变量和常数
  • 手机玩鸣潮 3.6 版本,随时随地开荒新地图不卡顿
  • AIGC 到底是什么:从传统软件到生成式人工智能
  • 规模化养殖冰爽强甘多少钱
  • Go单例模式:sync.Once与双重检查
  • 【第9篇】 EfficientViT(ICCV 2023):基于多尺度线性注意力的高效高分辨率密集预测网络
  • 封神了!Scrapling 火了,AI 时代的数据采集神器来了
  • 经验丰富的杭州园林景观工程公司排名哪个好