最近圈子里被 Vibe Coding 这个词刷屏了。有人把它当成一个新流行词,但我在实际用过一段时间后,更愿意把它理解成一种完全不同的开发姿态:不再是你一行行敲代码,而是你告诉 AI 你想要什么,AI 把代码写出来,你来做检查、纠偏和收口。
今天我用一个真实项目讲清楚,从脑子里一个模糊想法,到产品真的上线能被别人访问,完整走完要经历哪些步骤,中间会踩哪些坑,以及每步的核心操作是什么。我用的例子是一个"个人极简记账工具",不大不小,正好覆盖了 Vue/React 前端、少量后端接口、数据库和部署上线这几个典型环节。这篇文章适合两类人看:一类是想用 Vibe Coding 做点小产品的非专业开发者,另一类是已经在日常开发里用 AI 辅助、但觉得流程还不够顺手的程序员。不管你是哪类,这套流程都能帮你少走弯路,把"想法到上线"这件事从碰运气变成稳定复现。
1. 第 1 步:把模糊想法压缩成能执行的规格
Vibe Coding 最大的错觉就是"我只要描述得够随意,AI 就能给我一个能用的东西"。实际情况是,AI 对自然语言的理解虽然很强,但它没有能力替你做产品决策。它不知道你是想要一个给家人用的记账工具,还是给投资用的现金流分析系统。所以第一步不是写代码,而是写清楚"你到底要做什么"。
1.1 为什么跳过需求梳理会翻车
我见过太多人打开对话框,直接说"帮我做一个记账 App",然后 AI 回了一堆功能清单,看起来特别全,日历、报表、账单分类、多账户、预算管理全都有。但做出来的东西往往互相矛盾,比如账单分类和预算模块的数据口径对不上,日历试图展示的数据模型和列表页用的不是同一套,最后项目变成一坨拼不起来的代码。
原因很简单:AI 面对模糊指令时,会倾向于生成一个"最均衡"的解决方案,把常见功能都塞进去,而不是针对你的实际场景做取舍。这就好比你去餐厅跟厨师说"随便上一桌菜",他只会给你上大众点评排名最高的那些,而不是根据你的忌口和偏好来配菜。
正确做法是,在给 AI 下指令之前,先花 30 分钟写一份需求底稿,不用长,几十行就够。这份底稿的核心是把四件事说清楚:给谁用、解决什么问题、第一版要什么、第一版不要什么。
1.2 30 分钟写出一份需求底稿
拿记账工具举例,我的需求底稿是这样的:
code复制项目:个人极简记账工具
目标用户:我本人,最多加我对象
核心痛点:现在记账软件太重,我只想快速记录一笔支出,月底看总数
第一版功能:
- 记一笔:金额、分类(餐饮/交通/购物/其他)、备注(可选)
- 查账单:按月份筛选,显示总数和分类汇总
- 本地存储,不需要登录
不要做的:
- 预算管理、多账户、图表分析、定期账单、多人协作
注意最后一条"不要做"的清单,这比"要做"的清单更重要。AI 最大的问题不是做得太少,而是做得太多。你明确告诉它不要做什么,它才能真正收敛。
这份底稿写完,你其实已经在做一件很接近 Spec-Driven 的事情。区别在于传统的 spec-driven 开发要求厚厚的规格文档,而 Vibe Coding 只需要一个轻量的行为约定。我后面还会讲到,这个约定在整条链路里反复出现,它是你判断 AI 产出对不对的唯一依据。
1.3 把大需求切成可交付的 MVP 切片
需求底稿出来之后,下一步是把它拆成几个可以独立交付的小切片。一个切片就是一个完整的"最小可用功能",跑得通、看得到结果。对于一个记账工具,我的切片清单大致是:
- 切片 A:能新增一笔记录,并显示在列表里
- 切片 B:能按月份筛选,并显示分类汇总
- 切片 C:数据在本地持久化,刷新不丢
每个切片都要小而完整。原则是:一个切片做完,产品就能满足一个真实使用场景。切片 A 做完,我已经能用它记几天账了;切片 B 做完,我能看月度总结了。这样做有两个好处:一是每步都能验证,二是出了问题不至于整个项目推翻重来,最多重做一个切片。
这一步做完,你的"输入材料"就齐了。我一般会把这个需求底稿和切片清单放在一个项目根目录的 spec.md 文件里,后续所有 AI 交互都围绕这个文件展开。这个小习惯,是后续流程能跑顺的地基。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 第 2 步:搭好 Vibe Coding 工作台
需求想清楚了,下一步是准备干活的环境。Vibe Coding 不是说打开一个对话框直接开聊就行,你需要一套能让你和 AI 高效协作的工作台。选错工具链,后面每一步都会被拖累。
2.1 从 IDE 到 AI 编程插件的四种搭配方式
先看工具链。目前主流的方案有几类,我按常用程度列一下:
| 方案类型 | 代表工具 | 适用人群 | 说明 |
|---|---|---|---|
| AI 原生 IDE | Cursor、Windsurf | 重度用户 | 编辑器天生就是为 AI 协作设计的,对话面板、diff 应用、代码引用都内置 |
| 传统 IDE + 插件 | VS Code + Cline / Continue / Copilot | 已有编辑习惯的人 | 不换编辑器,给现有工作流加 AI 能力 |
| 命令行 AI | Aider、OpenAI Codex CLI | 熟悉 Git 和终端的开发者 | 直接在终端里对话,AI 自动提交 commit |
| 在线 AI 平台 | Vercel AI 平台等 | 快速原型验证 | 偏向应用托管和快速部署,内置 AI 集成,适合做 demo |
我自己主力用 Cursor 做开发,然后在涉及部署的时候搭配 Vercel 这类在线平台。为什么不是只用一个工具?因为 AI 编程工具解决的是"写代码"这个环节,而 Vercel 这类平台解决的是"把代码跑起来并提供访问入口"这个环节,两者不是替代关系。你可以在 Cursor 里把代码写完,推送到 Git 仓库,由 Vercel 自动构建部署。
对新手来说,我的建议是从"传统 IDE + 插件"起步,因为 VS Code 的资料最多、问题排查最容易。等熟悉了 AI 协作的节奏,再考虑换 AI 原生 IDE,体验会再上一个台阶。
2.2 给 AI 一个能跑起来的本地环境
工具装好之后,有一件事很多人忽略:你的本地环境必须能真正的把项目跑起来。原因很直接,AI 生成的代码不是拿来当摆设看的,你要运行它、观察它、找它的毛病。如果本地连一套 Node.js 环境都没有装好,AI 生成一个前端项目你都不知道怎么启动,那整个流程就会卡死在第一步。
所以,开工之前确保三件套齐了:
- 运行时:Node.js LTS 版本(前端全栈项目的运行时基础)
- 包管理器:npm 或 pnpm(用来安装项目依赖)
- Git:初始化仓库,给每一步留备份
这三样装好,你就可以创建一个空项目,然后让 AI 开始工作。先不要急着写复杂功能,先让 AI 生成一个最小骨架,启动起来、在浏览器里能打开页面,这个"从零到 Hello World"的过程本身就是在验证你的工作台链路是否通畅。
比如我用 Cursor 建了一个空的 nextjs 项目之后,会先让 AI 做一件事:"启动项目,在首页显示'记账工具'四个字和一个新增按钮,按钮点击后弹出一个表单"。这个骨架跑通,就说明 AI 能调用工具、能理解你的项目结构、能继续迭代了。
2.3 把上下文喂给 AI:spec.md 是锚点
很多人在用 Vibe Coding 时容易陷入一个循环:AI 回答一次,你觉得不对,重新描述一次,AI 又生成另一版,来回几次后你已经忘了最初要什么了。这个问题的根子在于没有给 AI 一个稳定的上下文锚点。
我的做法是:项目根目录永远放一个 spec.md,里面就是第 1 步写的需求底稿 + 切片清单。每次开始一段新的 AI 对话时,第一句话永远是"打开 spec.md,按里面的需求实现切片 A"。每次和 AI 对话,我都不重新描述需求,而是指向 spec.md,让 AI 自己读。
为什么这样做?因为 AI 的上下文窗口有限,对话一长,前面的约定就会被冲淡。如果你反复用自然语言补充需求,很容易和 spec.md 里的原始定义发生冲突,最后代码就乱了。让 spec.md 成为唯一的事实来源,可以保证每段对话都是围绕同一份需求基线展开的。
还有一个细节:同一项需求,尽量在同一次对话里完成,不要开多个并行对话。AI 的对话上下文是隔离的,你在这个窗口里让 AI 重构了数据结构,另一个窗口的 AI 并不知道,很容易把旧结构又写回来。这是多人使用同一代码库时最常见的冲突来源,单人使用也绕不开。
3. 第 3 步:写好第一份提示词,让 AI 少跑偏
工具链搭好,终于到了核心环节:写提示词。这一步直接决定了 AI 输出质量的下限。很多人觉得 Vibe Coding 靠的是感觉,随意说话就好——有这种感觉的人,通常很快就会被 AI 的"自信胡说"坑一把。
3.1 坏提示词和好提示词到底差在哪
先看一个反面例子。如果你直接说:
code复制帮我做一个记账功能的表单
AI 大概会返回一个看起来很标准的表单:日期、金额、分类、备注,外加一个保存按钮。看起来没问题对吧?但你如果用了一下就会发现:金额没做校验,分类是硬编码的下拉列表,保存按钮不知道数据存到哪,表单提交之后页面不会刷新。问题不是 AI 能力不行,是你没给它任何约束,它只能按照"教科书里最通用的记账表单"来写。
换一种说法:
code复制在 pages/index.tsx 中实现新增记账表单:
1. 金额字段,必填,只允许数字,大于 0
2. 分类字段,必填,选项为:餐饮/交通/购物/其他
3. 备注字段,选填,最多 50 字
4. 点击保存后,把数据写入 localStorage 的 transactions 数组
5. 保存成功后,清空表单并刷新下方列表
效果立刻不一样。AI 知道了目标文件、字段校验规则、数据存储位置、交互行为细节,生成出来的代码基本能直接跑。这个例子说明一个核心道理:提示词不是聊天,而是写接口文档。你给的约束越明确,AI 的产出就越可预期。
3.2 一个通用的提示词模板
我用了不少时间摸索出一套适合自己的提示词模板,分享出来供你参考。它不需要每次都写得很长,但核心要素尽量齐全:
code复制角色:你是一名资深全栈工程师,代码风格清晰,注释精简。
任务:在现有项目中实现 [具体功能]。
参考文件:先阅读 spec.md,了解项目背景和约定。
实现要求:
1. [功能需求点列表,尽量一条一句]
2. [数据结构定义]
3. [交互行为定义]
4. [样式要求,或者引用现有设计规范]
不要做:
- [明确排除的功能]
- [不要引入新的依赖,除非特别说明]
完成标准:
- [验收标准,比如:运行 npm run dev 后,能完成某个操作流程]
这个模板里的每个字段都有它的作用。"角色"是让 AI 的代码风格偏向更有经验的人,"任务"是聚焦目标,"参考文件"是建立上下文锚点,"实现要求"是行为约束,"不要做"是防跑偏,"完成标准"是让 AI 在提交时自查。相比之下,最后那条"完成标准"最容易被忽略,但恰恰是最关键的——没有验收标准,AI 永远觉得自己干完了,而你要自己跑一遍才发现一堆问题。
3.3 迭代式修改:一次只让它改一点点
提示词写得好,也别指望 AI 一次性生成完美代码。我的经验是:把开发过程当作无数个"小步快跑"的循环。每次只提一个具体改动,让 AI 改了,你验证,然后再下一个。
比如在记账工具里,切片 A 做完之后,我发现列表里的时间格式不是我喜欢的样子。我不会说"把时间显示弄得好看点",我会说:
code复制列表中的交易时间目前显示为 ISO 字符串,例如 2025-01-15T08:30:00.000Z。
改为按本地时区显示为"2025-01-15 08:30"的格式,在 src/utils/date.ts 中添加一个 formatTime 函数并引用它。
为什么这么具体?因为"好看点"是主观描述,AI 的判断和你可能完全不同。而"格式化为 YYYY-MM-DD HH:mm"是客观标准,AI 一眼就知道怎么做。在 Vibe Coding 里,你只需要负责把主观需求翻译成客观描述,剩下的交给 AI。
还有个小技巧:涉及到跨模块改动时,先让 AI 说方案,再让它动手。比如"我想把 localStorage 换成数据库,在动手之前,先告诉我你打算怎么改、涉及哪些文件"。这样你可以在动手前就发现方案的漏洞,避免 AI 批量重写代码之后才发现方向错了。
3.4 每次生成后,自己跑一遍再喊继续
我见过很多人让 AI 写代码,AI 说"已完成",然后直接信任它,继续提下一个需求。这是最危险的用法。AI 的"已完成"只代表它认为自己把代码写完了,不代表代码真的能跑、没有 bug。
我的铁律是:AI 每完成一个任务,我至少花两分钟自己验证一下——启动项目、点一遍关键操作、看看控制台有没有报错。验证通过,才允许进入下一个任务。这条铁律帮我挡掉了大量隐形问题,后面第 4 步我会展开讲,怎么把验证这件事做得更系统化。
4. 第 4 步:建立验证闭环,让 AI 修自己的 Bug
代码写出来只是开始,验证和纠错才是 Vibe Coding 真正花时间的地方。这一步的工作量大概占整个流程的六成,但也是最容易提升效率的地方。
4.1 为什么 AI 生成的代码必须验证
你可能会想,AI 这么聪明,生成的代码还会有问题吗?会,而且挺常见。主要问题有几种:逻辑边界条件没考虑(比如金额为 0 时怎么办)、模块间接口不一致(A 函数改了,调用它的地方没改)、依赖版本不兼容、以及一些环境相关的坑。
我之前遇到过一件事:AI 给记账工具加了导出 CSV 的功能,代码看着没问题,但实际导出时中文全部变成乱码。原因是没有加 BOM 头,Excel 打开 UTF-8 文件时会识别错误。这种问题,AI 单纯看代码很难发现,只有实际导出一个文件、用 Excel 打开才能暴露。
所以验证不是走形式,它是 Vibe Coding 流程里最核心的质量关卡。如果省去验证,你其实就是让 AI 帮你写了一大堆没有经过测试的代码,这等于在给我的项目埋雷。
4.2 把报错信息当成 AI 的反馈信号
验证过程中遇到报错,多数新手的第一反应是慌了:怎么这么多错误,是不是整个路子不对?其实恰恰相反,报错是最宝贵的反馈信号,因为报错信息本身就包含了问题定位和修复线索。
当你遇到报错时,正确做法是把完整的报错信息贴给 AI,不是自己看完之后去猜,而是原样复制粘贴。比如浏览器控制台报了个错,你就把控制台那一段红色文字原封不动发给 AI,加上一句"运行到这一步报错了,帮我排查并修复"。AI 看到报错信息,往往能直接定位问题所在。
这里有三个坑要避开:
- 只贴了一行报错,没有贴堆栈信息。AI 需要完整上下文才能定位到具体文件和函数。
- 自己先改了一部分代码再问 AI。你改动的部分和报错的对应关系会混乱,AI 很难判断哪些是你改的、哪些是原来的。
- 贴报错信息时手打了缩写,比如"报了个 TypeError,不知道哪来的"。TypeError 有很多种,不贴完整信息等于没贴。
总之,报错信息是 AI 和代码库之间最直接的通路,把这条路保持干净清晰,你的纠错效率会高很多。
4.3 给 AI 装上自动化测试的"验收官"
依赖人肉验证,总有不靠谱的时候。你会发现,AI 改了一个地方,另外一个地方悄悄坏了。这个问题在纯人工验证下很难发现,因为你可能根本不会去点那个地方。
解决思路是给项目加上自动化测试,让测试用例当"验收官"。我一般在给 AI 下需求的时候,就会加一条要求:为这次实现的关键函数写单元测试。比如在记账工具里,我写了一个统计每月分类汇总的工具函数,就让 AI 顺带写测试用例:
javascript复制// src/utils/statistics.test.ts
import { describe, it, expect } from 'vitest';
import { getMonthlySummary } from './statistics';
describe('getMonthlySummary', () => {
it('应按分类汇总当月的交易金额', () => {
const transactions = [
{ id: 1, amount: 30, category: '餐饮', date: '2025-01-10' },
{ id: 2, amount: 200, category: '购物', date: '2025-01-15' },
{ id: 3, amount: 50, category: '餐饮', date: '2025-01-20' },
];
const summary = getMonthlySummary(transactions, '2025-01');
expect(summary).toEqual({ 餐饮: 80, 购物: 200 });
});
});
有了这套测试,AI 在改代码的时候,你可以让它跑一遍测试,"确保测试全部通过"。这比你自己肉眼盯代码可靠得多。而且测试用例本身也可以让 AI 写,你只需要验收测试的覆盖范围是否合理。
4.4 版本控制:给你的 AI 建一剂后悔药
Vibe Coding 的迭代速度很快,AI 可能一小时改十几次,其中大部分是好的,偶尔也会改坏。没有版本控制保护,你可能就回不去了。
所以我强烈建议,在整个过程中每完成一个小的里程碑,就手动提交一次代码。比如"完成切片 A"提交一次,"完成切片 B"提交一次,"修复了 CSV 中文乱码"再提交一次。不用把交得特别细致,但保证每个能跑的状态都有记录。
我现在用的流程是:让 AI 改代码之前,我先 commit 一次当前状态,做基线保存。AI 改完之后,我验证通过,再 commit 一次,做成果保存。这样每一步都是可回退的,万一 AI 改着改着把页面弄崩了,你可以直接回退到最近一个可用状态,而不是手动去找 AI 改了什么。
很多在线平台(包括 Vercel)都支持从 Git 仓库自动构建部署,所以 Git 提交记录同时也构成了你的部署历史。每提交一个版本,都可以作为线上候选版本,这让"回滚到旧版本"变得非常简单。
5. 第 5 步:部署上线,让产品真正被访问
代码写完了、测试也过了,剩下最后一步:把它部署上线,让产品能被真实访问。很多人在这步会卡住,主要原因是部署涉及的东西和开发完全不同,域名、服务器、环境变量、HTTPS 证书,每一个听着都很专业。但实际上,现代部署平台已经把大部分复杂度消化掉了。
5.1 选一条符合你项目的部署路线
部署方案的选择主要取决于你的项目类型。我简单列几个常见路线:
| 项目类型 | 推荐方案 | 特点 |
|---|---|---|
| 前端静态站 / JAMStack 应用 | Vercel / Netlify | 免费额度够用,推送 Git 自动构建,自带 HTTPS 和全球 CDN |
| 全栈应用(含服务端代码) | Vercel / Railway / Render | 支持服务端函数,Vercel 对 Next.js 等框架支持最好 |
| 传统后端服务 | Railway / 云厂商容器服务 | 适合需要自定义运行时的场景 |
| 数据库 | Vercel Postgres / Supabase / SQLite(本地文件) | 看你的数据量和使用场景,小项目尽量选托管服务 |
拿我的记账工具举例,它是 Next.js 全栈项目,所以我选择了 Vercel 作为部署平台。原因是 Next.js 和 Vercel 同源,部署几乎是无缝的:你把代码推到 GitHub,在 Vercel 里导入这个仓库,它会自动识别框架、安装依赖、执行构建命令,最后给你一个可访问的域名。
如果你只是想快速验证一个原型,Vercel 还有一个 AI 相关的能力,可以在对话中直接修改和部署应用,适合做 demo 和 presentation。但如果是正经产品,我仍然建议走"本地开发 -> Git 提交 -> 自动构建"这条更规范的路。
5.2 上线前的配置清单
别急着点击部署,先把几个关键配置检查完,否则上线之后容易出问题。
第一,环境变量。项目里如果有 API 密钥、数据库连接串这类敏感信息,千万别写死在代码里。在本地开发时用 .env.local 文件,部署平台上在配置界面里设置环境变量。Vibe Coding 生成的代码里可能已经有读取环境变量的逻辑,你要做的就是把生产环境的变量在平台配置界面填好。
第二,域名。Vercel 会给你一个 xxx.vercel.app 的免费域名,正式产品建议绑定自己的域名。绑定过程不复杂,在 Vercel 的控制台里点几下,再到 DNS 服务商那里加一条解析记录就行。注意解析生效需要一点时间,一般几分钟到几小时不等。
第三,数据库。如果你的项目用了数据库,本地开发时的数据和云端的数据是隔离的。别到上线的最后一刻才想起来,要先在云端把数据库建好,把连接串配置到环境变量里。我一般会在切片开发阶段就同步做这件事,避免上线前集中配置出问题。
5.3 上线之后,把用户反馈变成下一轮需求
我以为部署上线就万事大吉了,但真正做完之后才意识到,上线只是新循环的开始。产品一旦被人用了,你就会收到真实的反馈——某个功能不好用、某个页面加载慢、某个流程看不懂。这些反馈,就是你下一轮 Vibe Coding 迭代的需求来源。
我现在的做法是:产品上线后,维护一个 feedback.md 文件,记录用户反馈、Bug、改进点。新反馈进来,我先把它们整理成和 spec.md 里相同格式的需求描述,然后再开新的开发循环。这其实就是把第 1 步的需求管理延续到了产品生命周期里。
一个小技巧:上线之后的迭代,不要随便找一个反馈就开始改。我习惯把反馈合并同类项,区分主次,挑出真正影响核心体验的一两个点,作为下一批次的目标。这样 Vibe Coding 的迭代才不会变成一个乱改的流水线,而是真正在打磨产品。
5.4 从"能跑"到"好用"的产品化收尾
如果你想让这个项目不只是自己能用,而是能给别人用,那还需要多做三件事:补齐错误提示、做好空状态和加载状态、加一点新手引导。这三个往往是最容易被忽略的,但它们决定了别人愿不愿意继续用你的产品。
你回忆一下你第一次打开一个空列表的页面,那种"这东西是不是坏了"的疑惑感。如果 AI 生成的页面在你第一次使用、没有任何数据时,能给你一句"还没有记录,点右上角添加第一笔",而不是一个光秃秃的空白页面,体验会好很多。这些都是产品化的细节,不需要花太多时间,但对用户来说非常重要。
我在做记账工具的收尾阶段,就让 AI 专门做了一轮"空状态与错误处理"的优化:没有数据时的提示、删除记录时的确认框、网络异常时的报错信息。这些细节做完,整个产品给人的感觉从"一个实验品"变成了"一个正经小应用"。
我在实际做完这个流程之后,最大的感受是:Vibe Coding 真正考验的不是会不会写提示词,而是你对自己要做的东西有没有清晰的判断力。AI 是执行者,你是决策者。它帮你写代码,但你要负责想清楚做什么、验证它做没做对、以及决定怎么一步步走向上线。这套 5 步流程,本质上是把"想法"变成"产品"的一套工程化方法,AI 只是顺手把写代码这个累活接了而已。
最后再分享一个小技巧:在整个流程中,每完成一个阶段,就花五分钟做一次复盘——这次提示词哪里写得不好,下次怎么改;哪个问题 AI 反复犯,是不是需要在 spec.md 里加一条约定。我每次做完一个项目,都会更新一次自己的提示词模板和 spec 模板,下一轮的速度就会更快一步。Vibe Coding 不是一个固定答案,它会跟着你的使用习惯一起进化。
