Vibe Coder 手册
写给 Vibe Coder 的通关指南
JSON · HTTP/API · MySQL · Git · 环境配置 · 部署 · 调试安全 · AI 协作心法
写给 Vibe Coder:为什么需要这本手册
1.1什么是 Vibe Coding
Vibe Coding(氛围编程)指的是一种以自然语言描述需求、由 AI 生成代码的开发方式。你告诉 AI"帮我做一个能记录待办事项的网页",AI 就写出几十上百行代码;你再说"加一个删除按钮",它继续修改。整个过程中,你更像产品经理和验收员,而不是传统意义上的程序员。
这种方式极大地降低了创造软件的门槛:不会语法也能做出能跑的应用。但它带来一个新的问题——当代码报错、接口连不上、数据库查不出数据时,如果你完全看不懂 AI 在写什么,就会陷入"改一句、坏三处"的循环。
1.2为什么"能跑"还不够
AI 生成代码的速度,往往超过你理解代码的速度。短期看这很爽,长期看有三个隐患:
出错时无法自救。报错信息里全是术语——端口占用、CORS、外键约束——看不懂就只能反复把报错丢回给 AI,碰运气式修复。
无法判断 AI 的答案对不对。AI 可能写出有安全漏洞的代码(比如把密码明文存进数据库),看不懂概念就识别不了风险。
需求描述不到位。懂概念的人会说"给 users 表的 email 字段加唯一索引",不懂的人只能说"邮箱别重复注册"——前者得到的代码质量明显更好。
你不需要会写代码,但需要能"读懂地图"。本手册讲的就是那张地图:每个概念是什么、为什么存在、在 AI 生成的项目里长什么样、出问题时光看报错能想到它。
1.3本手册的使用方法
每个概念统一按五个维度讲解,方便快速查阅:一句话定义、生活类比、实例演示、常见坑、AI 提示词。
建议第一遍通读第一、二章建立全景认知,其余章节按需查阅:AI 生成的项目里出现了什么,就翻对应章节。
1.4一张概念地图
一个典型的 AI 生成 Web 应用,几乎必然涉及以下层次。本手册的章节顺序与此对应:
| 层次 | 章节 | 负责什么 |
|---|---|---|
| 代码本身 | 第二章 | 语言、前端、后端、框架——代码的组织方式 |
| 数据格式 | 第三章 | JSON 等格式——数据在程序间的通用写法 |
| 网络通信 | 第四章 | HTTP 与 API——前端和后端如何对话 |
| 数据存储 | 第五章 | MySQL 等数据库——数据存在哪里、怎么查 |
| 工程管理 | 第六、七章 | Git 版本控制、环境变量、依赖管理 |
| 发布上线 | 第八章 | 服务器、域名、HTTPS——让别人能访问 |
| 排错安全 | 第九章 | 读报错、日志、常见安全坑 |
| 协作心法 | 第十章 | 如何向 AI 准确描述需求、拆解任务 |
编程世界的地图:语言、前端与后端
2.1编程语言:给计算机看的"菜谱"
一句话定义:编程语言是一套人与计算机约定的语法,用来精确描述"一步步该做什么"。
生活类比:菜谱。自然语言的菜谱写"盐适量",人看得懂,计算机却会崩溃——它要求每一步都精确无歧义。编程语言就是没有歧义的菜谱语言。
| 语言 | 典型用途 | 在 AI 项目里长什么样 |
|---|---|---|
| JavaScript / TypeScript | 网页前端、Node.js 后端 | .js / .ts 文件,React 项目的主流 |
| Python | 脚本、数据处理、AI 应用 | .py 文件,缩进代替大括号 |
| Java | 大型企业后端、安卓 | .java 文件,结构严谨偏冗长 |
| Go / Rust | 高性能服务、系统工具 | 新兴后端项目的常见选择 |
| SQL | 数据库查询(第五章) | SELECT ... FROM ... 的语句 |
| HTML / CSS | 网页结构与样式 | 标签和样式规则 |
编译与解释:有的语言需要先"翻译"成机器码再运行(编译型,如 Java、Go),改代码要重新构建(build);有的边翻译边执行(解释型,如 Python、JavaScript),通常保存即生效。
2.2前端、后端与全栈
一句话定义:前端是用户看得见、摸得着的界面部分;后端是躲在服务器上处理数据和逻辑的部分。
生活类比:餐厅。前端是装修、菜单和服务员——你直接打交道的部分;后端是后厨——你点完菜,真正切菜、开火、装盘的地方。
| 对比项 | 前端(Frontend) | 后端(Backend) |
|---|---|---|
| 运行位置 | 用户的浏览器或手机 App | 远程服务器 |
| 负责什么 | 界面、交互、展示数据 | 业务逻辑、数据库读写、鉴权 |
| 常见技术 | React、Vue、HTML/CSS | Node.js、Python、Java + MySQL |
| 看得见吗 | 完全可见 | 用户看不到,只通过 API 暴露 |
一个人(或一个 AI)同时写前端和后端,就叫全栈开发。Vibe Coding 项目大多是全栈项目,所以你两侧的概念都会遇到。
2.3客户端与服务器
一句话定义:客户端是发起请求的一方(你的浏览器/App),服务器是接收请求并返回结果的一方(远端那台 7×24 小时开机的电脑)。
你在浏览器输入网址,浏览器(客户端)把请求发给服务器;服务器查数据库、跑逻辑,把网页或数据送回来。这个"请求—响应"的一来一回,是第四章 HTTP 的全部基础。
前端代码任何人都能在浏览器里看到(按 F12 即可)。API 密钥、数据库密码、核心算法如果出现在前端代码里,等于公开发布。务必提醒 AI:"敏感逻辑和密钥放在后端,前端只调用接口。"
2.4框架与库:站在别人的肩膀上
一句话定义:库(Library)是你拿来调用的现成工具集;框架(Framework)是一套搭好的骨架,你把代码填进它规定的位置。
生活类比:做饭。库像调料和半成品——想用就用;框架像火锅店的整套流程——锅底、配菜顺序、上菜节奏都已定好,你只负责往里下菜。
常见:前端框架 React、Vue;后端框架 Express(Node.js)、Django/Flask(Python)。AI 生成的项目几乎总是基于某个框架——项目根目录的 package.json 或 requirements.txt 里会写明。
2.5运行时与环境
运行时(Runtime):让代码跑起来的执行环境。JavaScript 原本只能在浏览器里跑,Node.js 让它也能在服务器上跑——所以你会看到"后端用 Node.js"这种说法。
开发环境与生产环境:开发环境是你自己电脑上"边改边试"的版本(常叫 dev 或 local);生产环境是部署上线、给真实用户用的版本(常叫 prod)。两者的数据库、域名、密钥通常完全不同。AI 经常默认帮你连开发环境——上线前务必确认配置切换正确。
JSON:互联网的通用数据语言
3.1JSON 是什么
一句话定义:JSON(JavaScript Object Notation)是一种用纯文本表示结构化数据的格式,是当今互联网上传输数据的事实标准。
生活类比:标准快递面单。不管寄什么,面单的栏目格式统一,任何分拣中心都能看懂。JSON 就是程序之间的"标准面单"——前端、后端、数据库、第三方服务,全都认它。
你在 Vibe Coding 中会在三个地方密集遇到 JSON:API 请求和返回数据、配置文件(如 package.json)、以及让 AI 生成结构化内容时的输出格式。
3.2六种数据类型
| 类型 | 写法示例 | 说明 |
|---|---|---|
| 字符串 string | "张三" | 必须用英文双引号包裹 |
| 数字 number | 25 或 3.14 | 整数小数都行,不加引号 |
| 布尔 boolean | true / false | 全小写,不加引号 |
| 空值 null | null | 表示"什么都没有" |
| 数组 array | [1, 2, 3] | 有序列表,方括号,可装任意类型 |
| 对象 object | {"a": 1} | 键值对集合,花括号,key 必须是字符串 |
3.3六条铁律:为什么 AI 生成的 JSON 也会报错
- 所有键名和字符串必须用英文双引号,单引号、中文引号都不行。
- 最后一个元素后面不能多写逗号(尾随逗号在 JSON 里是非法的)。
- 不支持注释——配置里想写说明,只能加一个 "_note" 之类的键。
- 键值对之间用英文冒号,元素之间用英文逗号,一个中文标点就能让整个文件失效。
- 数字不能加引号——"25" 是字符串,25 才是数字,排序和计算结果完全不同。
- 整个文档必须是一个完整的对象或数组,不能有第二份孤立的数据。
3.4实例:一个嵌套的订单数据
{
"orderId": "A20250727001",
"user": {
"name": "张三",
"vip": true
},
"items": [
{ "sku": "B-101", "title": "机械键盘", "price": 399 },
{ "sku": "M-205", "title": "无线鼠标", "price": 99 }
],
"coupon": null,
"total": 498
}读法:最外层是一个对象;user 是嵌套对象;items 是数组,里面装了两个对象;coupon 是空值。取"第一个商品的价格",路径就是 items[0].price——这个"点+下标"的取值路径写法在大多数语言里通用。
3.5JSON 与其他常见格式
| 格式 | 长什么样 | 典型场景 |
|---|---|---|
| JSON | {"name": "张三"} | API 传输、配置文件,绝对主力 |
| CSV | name,age\n张三,25 | 表格数据导出、Excel 交换 |
| YAML | name: 张三(靠缩进分层) | Docker、CI/CD 等运维配置 |
| XML | <name>张三</name> | 老系统接口、部分企业软件 |
| Markdown | # 标题、**加粗** | 文档、README、AI 输出排版 |
3.6Vibe Coding 场景速查
八成是改依赖版本时留下了尾随逗号或中文逗号,用编辑器自带的 JSON 校验或让 AI"检查这个 JSON 的语法错误"即可定位。
前端取不到字段,先检查是不是忘了 JSON.parse(),或者字段名大小写写错(userName 和 username 是两个东西)。
JSON 没有日期类型,业界惯例是存成 ISO 8601 字符串(如 "2025-07-27T08:00:00Z"),AI 生成代码时可直接这样要求。
HTTP 与 API:程序之间如何对话
4.1HTTP:一问一答的通信规则
一句话定义:HTTP 是客户端与服务器之间传输数据的协议,规定了"请求怎么写、响应怎么回"的格式。
生活类比:写信。你按格式写好信封(地址、邮编)和信纸(正文),邮局才收;对方回信也同样按格式来。HTTP 里,信封叫请求头(Header),信纸叫请求体(Body)。
一次 HTTP 通信包含四个要素:URL(地址)、Method(方法,要干什么)、Header(元信息,如身份凭证)、Body(真正要传的数据,通常就是 JSON)。
4.2四种常用方法:对应增删改查
| 方法 | 动作 | 典型例子 |
|---|---|---|
| GET | 读取数据(查) | 获取商品列表、查询某用户资料 |
| POST | 提交新数据(增) | 注册账号、提交表单、上传文件 |
| PUT / PATCH | 修改已有数据(改) | 更新头像、修改订单地址 |
| DELETE | 删除数据(删) | 删除一条动态、注销账号 |
这四个方法恰好对应数据库的增删改查(CRUD),是连接第四章和第五章的桥梁。
4.3状态码:服务器回复的"表情"
每次响应都有一个三位数字的状态码。看到报错先找状态码,问题就定位了一半:
| 状态码 | 含义与排查方向 |
|---|---|
| 200 / 201 | 成功 / 创建成功。一切正常。 |
| 301 / 302 | 重定向。地址搬家了,浏览器一般会自动跳。 |
| 400 | 请求格式错误。检查提交的 JSON 是否缺字段、类型对不对。 |
| 401 | 未登录或凭证失效。检查 API Key、Token 是否过期或没带。 |
| 403 | 已登录但没权限。检查账号角色、接口权限设置。 |
| 404 | 资源不存在。检查 URL 是否拼错、ID 是否有效。 |
| 429 | 请求太频繁被限流。放缓调用节奏或升级套餐。 |
| 500 | 服务器内部错误。后端代码崩了,去看服务器日志(第九章)。 |
| 502 / 503 | 网关或服务不可用。后端没启动、崩溃或正在重启。 |
4.4API:程序的"服务窗口"
一句话定义:API(应用程序接口)是程序对外提供功能的标准入口——你按约定发请求,它按约定返回结果,不用关心内部实现。
生活类比:银行柜台。你不需要知道金库在哪里、账目怎么记,只需填对单子递进去,柜员按流程给你结果。API 文档就是"填单说明"。
REST API:目前最流行的 API 设计风格,核心思想是"URL 表示资源,方法表示动作"。例如 GET /users/42 表示"读取 42 号用户",DELETE /users/42 表示"删除 42 号用户"——看 URL 和方法就能猜到功能。
4.5API Key 与鉴权
大多数 API 不会随便让人调用,需要你提供凭证:
一串随机字符(如 sk-abc123...),相当于密码,通常放在请求头里。AI 大模型、地图、支付等第三方服务都用它。
登录后服务器签发的"临时通行证",有过期时间,前端之后每次请求都带上它证明自己已登录。
API Key 就是钱——泄露后别人用你的额度、花你的钱。三条铁律:永远不要写进前端代码;永远用 .env 文件管理(第七章);永远不要提交到 Git 仓库(第六章)。万一泄露,第一时间去服务商后台作废并重新生成。
4.6实例:读懂一段 API 调用代码
AI 生成的项目里,前端调用后端接口通常长这样(JavaScript):
const res = await fetch("https://api.example.com/orders", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer " + token
},
body: JSON.stringify({ item: "B-101", qty: 1 })
});
const data = await res.json(); // 把响应解析成 JSON 对象逐行对照:method 是 POST;headers 里既有内容类型又有身份凭证;body 是把 JSON 对象转成字符串再发送;最后一行对应第三章——服务器返回的是 JSON 文本,要解析后才能用。以后看到 fetch 或 axios 开头的代码块,都知道它在干什么了。
MySQL 与数据库:数据的仓库
5.1数据库是什么
一句话定义:数据库是有结构地持久存储数据、并支持高效查询的系统;MySQL 是其中最流行的开源关系型数据库之一。
生活类比:Excel 的工业加强版。一张表就像一张 Excel 表,但数据库能同时服务成千上万人的读写、保证数据不乱、支持毫秒级从百万行里找到你要的那一行。
5.2表、行、列:数据库的语法单位
关系型数据库的世界只有三个名词:表(Table)是一类事物的集合;列(Column)是这类事物的属性;行(Row)是一个具体的事物。
| id | name | created_at | |
|---|---|---|---|
| 1 | 张三 | zhangsan@example.com | 2025-07-01 |
| 2 | 李四 | lisi@example.com | 2025-07-15 |
| 3 | 王五 | wangwu@example.com | 2025-07-26 |
5.3SQL:和数据库对话的语言
一句话定义:SQL 是查询和操作数据库的标准语言。你写一句 SELECT,数据库执行后把结果返回给你。最常用的四句对应增删改查(CRUD):
-- 查:找出 vip 为 true 的用户,按注册时间倒序,取前 10 个
SELECT * FROM users WHERE vip = 1 ORDER BY created_at DESC LIMIT 10;
-- 增:插入一个新用户
INSERT INTO users (name, email) VALUES ("赵六", "zhaoliu@example.com");
-- 改:把 2 号用户的名字改掉
UPDATE users SET name = "李四(已改名)" WHERE id = 2;
-- 删:删除 3 号用户
DELETE FROM users WHERE id = 3;UPDATE users SET vip = 0(没带 WHERE)会把全表所有人的 vip 都改成 0,且不可撤销。让 AI 写 UPDATE 或 DELETE 语句时,永远追问一句"WHERE 条件加了吗、影响范围是多少行",并先在测试库执行。
5.4主键、索引与多表关联
主键(Primary Key):每行数据的唯一编号,通常是自增的 id。有了它,"第 42 号订单"这种说法才有意义。
索引(Index):类比书的目录。没有索引,按 email 查用户要一行行翻完全表(全表扫描);给 email 建了索引,就像翻目录直达页码。数据量大后,慢查询十有八九是缺索引——直接告诉 AI"给这个查询字段加索引"即可。
关联(JOIN):订单表只存 user_id 而不是用户全名,查询时通过 JOIN 把两张表拼起来。这就是"关系型"的含义——表与表通过 id 建立关系,避免同一份信息重复存储。
5.5连接数据库:看懂连接配置
程序连数据库需要五样信息,它们通常出现在 .env 文件中:
| 配置项 | 含义 |
|---|---|
| HOST | 数据库服务器地址,本地开发通常是 localhost 或 127.0.0.1 |
| PORT | 端口,MySQL 默认 3306,PostgreSQL 默认 5432 |
| USER / PASSWORD | 数据库账号密码(与应用登录密码是两回事) |
| DATABASE | 具体用哪个库,一个 MySQL 实例里可以有多个库 |
报错 Connection refused 多半是数据库没启动或端口不对;报错 Access denied 多半是账号密码错。
5.6MySQL 和它的兄弟们
| 数据库 | 一句话特点 | 什么时候会遇到 |
|---|---|---|
| MySQL | 最流行的开源关系型数据库 | 网站、应用后端的主力 |
| PostgreSQL | 功能更强的关系型数据库 | 新项目、需要复杂查询时 |
| SQLite | 单文件、零安装的轻量库 | 小工具、原型、移动端 |
| MongoDB | 文档型 NoSQL,直接存 JSON | 结构多变的数据、快速迭代 |
| Redis | 内存键值库,速度极快 | 缓存、验证码、排行榜 |
Git:代码的时光机
6.1为什么需要版本控制
一句话定义:Git 是记录代码每一次修改历史的工具,可以随时查看、对比、回退到任何一个历史版本。
生活类比:游戏的存档系统。每过一关存个档,后面打砸了随时读档重来;还能开多个平行存档尝试不同打法,打得好再合并回主线。
Vibe Coding 尤其需要 Git:AI 一次大改可能动几十个文件,改得好提交存档,改崩了一键回退——没有 Git,一次失败的 AI 修改就可能毁掉整个项目。
6.2五个核心概念
| 概念 | 大白话解释 |
|---|---|
| 仓库 Repository | 一个项目的全部代码 + 全部历史记录,简称 repo |
| 提交 Commit | 一次存档:记录"改了哪些文件、改成什么样",附一句说明 |
| 分支 Branch | 平行存档线:在 feature 分支上大胆试,不影响 main 主线的稳定版本 |
| 合并 Merge | 把分支上的成果并回主线 |
| 远程 Remote | 服务器上的仓库副本(如 GitHub),用于备份和协作 |
6.3最常用的八条命令
# 在当前文件夹初始化仓库
git init
# 看看哪些文件被改动了
git status
# 把所有改动放入"待提交区"
git add .
# 存档,写一句本次改了什么
git commit -m "说明"
# 查看历史存档列表
git log --oneline
# 新建并切换到 feature 分支
git checkout -b feature
# 把 feature 分支合并进当前分支
git merge feature
# 把本地存档推送到 GitHub 备份
git push日常 90% 的场景就是 add → commit → push 三连。每次让 AI 做完一个可运行的小功能,就提交一次——这是 Vibe Coding 最重要的习惯。
6.4GitHub:代码的云盘 + 社交网
Git 是工具,GitHub 是基于 Git 的在线托管平台(类似的还有 Gitee、GitLab)。把仓库 push 到 GitHub 有三重价值:异地备份不怕电脑坏;随时随地继续开发;大多数一键部署平台都直接对接 GitHub 仓库,push 代码即自动上线。
6.5.gitignore:告诉 Git"这些别管"
一句话定义:.gitignore 是一个清单文件,列在其中的文件/文件夹 Git 一律不追踪、不上传。三类东西必须进 .gitignore:
- .env——里面是数据库密码和 API Key,传上 GitHub 等于全网公开。
- node_modules / venv——依赖文件夹,动辄几万文件,别人拿到项目后一条安装命令即可重建。
- 构建产物和系统垃圾文件,如 dist/、.DS_Store。
Git 记的是历史——即使后来加了 .gitignore 并删除文件,旧提交里依然能翻出密钥。正确做法:去 GitHub 删除泄露的提交历史(或重建仓库),并立刻作废换新的密钥。
环境变量与依赖管理:项目的"水电煤"
7.1环境变量与 .env 文件
一句话定义:环境变量是存在于代码之外、随环境(开发/生产)变化的配置值;.env 文件是项目在本地保存这些值的常用方式。
生活类比:租房时不该刻在墙上的信息。房子(代码)可以给别人看,但 Wi-Fi 密码、门禁卡号(密钥)写在小本子上随身带,换房子换一套。.env 就是这个小本子。
DATABASE_URL=mysql://root:123456@localhost:3306/todo_app
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxx
JWT_SECRET=a-very-long-random-string
NODE_ENV=development代码里通过 process.env.OPENAI_API_KEY(Node.js)或 os.getenv(...)(Python)读取这些值。好处:密钥不进代码、不进 Git;同一套代码换一份 .env 就能从开发切到生产。
AI 有时会图省事把密钥直接写死在代码里(hardcode)。验收时全局搜索 sk-、password、secret 等关键词,发现明文密钥立即要求改为环境变量读取。
7.2包与包管理器
一句话定义:包(Package)是别人写好发布的可复用代码;包管理器负责帮你下载、安装、记录版本——JavaScript 用 npm,Python 用 pip。
生活类比:应用商店。你的项目不重复造轮子,需要的功能(日期处理、图表、支付)都"下载 App"装进来。
项目通过两个文件记录依赖:package.json(Node.js)记录项目名字、脚本命令和依赖清单;requirements.txt(Python)一行一个"包名==版本号"。node_modules 文件夹是依赖的实际存放地,体积巨大,永远不进 Git。
7.3版本号:1.2.3 是什么意思
语义化版本:主流包采用 主版本.次版本.修订号 的三段式。修订号变化=修 bug;次版本变化=加功能但兼容;主版本变化=有不兼容的大改动。
package.json 里的 ^1.2.3 表示"自动升级到 1.x 的最新版"。省心但也可能某次升级引入新问题——这就是为什么还会有 package-lock.json:它锁定每个依赖的精确版本,保证所有人和服务器装出的依赖一模一样。lock 文件要提交进 Git,和代码同进退。
7.4常见坑速查
依赖没装,运行 npm install 或检查包名拼写。
让 AI"检查依赖版本冲突并给出兼容的版本组合",不要让它盲目全升到最新。
用虚拟环境(venv)给每个项目隔出一套独立依赖,避免 A 项目要的库和 B 项目打架。
部署上线:让全世界访问你的作品
8.1localhost 与端口
localhost:指"本机"。开发时浏览器访问 localhost:3000,意思是"访问我自己电脑上 3000 端口跑着的程序"——只有你自己能访问。
端口(Port):一台电脑上同时跑着很多程序,端口号用来区分谁来接待这次访问,类比办公楼里的房间号。常见端口:网页 80(HTTP)/443(HTTPS),MySQL 3306,前端开发服务器常用 3000/5173。
报错"端口被占用(EADDRINUSE)",就是 3000 房间已经有人了:要么关掉旧进程,要么让新程序换个端口。
8.2服务器:一台永远不关机的电脑
一句话定义:部署就是把你的代码从自己的电脑搬到一台 7×24 小时运行、有公网地址的服务器上,让任何人随时能访问。
今天的"服务器"通常指云服务器:向云厂商(阿里云、腾讯云、AWS 等)按量租用一台虚拟电脑,装好运行环境,把代码放上去跑起来。
8.3域名与 DNS
一句话定义:域名是服务器的好记名字(如 myapp.com);DNS 是把域名翻译成服务器 IP 地址的全球查询系统。
生活类比:手机通讯录。你记的是"妈妈""快递站",真正拨出去的是电话号码。DNS 就是互联网那本巨大的通讯录。
上线流程里你会做一件事:在域名服务商后台加一条 DNS 记录(常见 A 记录指向服务器 IP,或 CNAME 记录指向托管平台给的地址)。DNS 生效有缓存延迟,等几分钟到几小时都正常。
8.4HTTPS:给通信加把锁
一句话定义:HTTPS 是加密版的 HTTP,地址栏的小锁标志。它保证数据在传输途中不会被偷看、篡改。
现在 HTTPS 已是标配:不加密,浏览器直接警告"不安全",搜索引擎降权,调用方甚至直接拒绝请求。好消息是,主流托管平台都自动签发免费的 HTTPS 证书;自建服务器可用 Let's Encrypt 免费证书。让 AI 帮你配 Nginx 时,记得加一句"配置 HTTPS 并把 HTTP 自动跳转 HTTPS"。
8.5Docker:把环境打包带走
一句话定义:Docker 把"代码 + 运行环境 + 依赖"整体打包成一个镜像(Image),在任何装了 Docker 的机器上都能原样跑起来。
生活类比:集装箱。以前码头装卸货要看货物形状一个个折腾;有了标准集装箱,船、火车、卡车通用。Docker 之于软件部署,就是集装箱之于航运——"在我电脑上能跑"终于等于"在你电脑上也能跑"。
AI 生成项目根目录里的 Dockerfile 就是打包说明书,docker-compose.yml 则描述"一键同时启动应用+数据库"等多容器组合。初次接触不必深究命令,能认出文件、知道作用即可。
8.6部署方式怎么选
| 方式 | 适合什么 | 上手难度 |
|---|---|---|
| Vercel / Netlify | 前端、全栈 Web 应用,连 GitHub 自动部署 | 极低,新手首选 |
| Railway / Render | 带数据库的后端应用 | 低 |
| 云服务器 + 宝塔面板 | 想要完全控制权的传统部署 | 中 |
| 云服务器 + Docker | 环境复杂、需要精确复现的项目 | 中高 |
调试与安全:少踩坑指南
9.1读懂报错信息:三段式定位法
报错不是天书。无论哪种语言,报错信息都有三段:
错误类型。如 TypeError(类型用错了)、ReferenceError(变量不存在)、SyntaxError(语法写错,多半是括号引号没配对)。
文件路径 + 行号。如 at App.tsx:42:18——直接跳到那个位置看。
错误描述。如 Cannot read property 'name' of undefined——你想读一个不存在的数据的 name 字段,多半是 API 没返回数据或字段名写错。
一长串报错(堆栈信息 Stack Trace)从下往上读,找到第一个属于你自己项目的路径,那里就是事发现场。
9.2日志:程序的黑匣子
一句话定义:日志是程序运行时写下的流水账——什么时候、做了什么、结果如何。线上问题无法复现时,日志是唯一线索。
前端的日志在浏览器控制台(按 F12 打开 Console 面板);后端的日志在服务器上。给 AI 描述问题时,把控制台的红色报错和服务器日志的对应片段一起贴给它,修复成功率会显著提高。
9.3浏览器开发者工具:Vibe Coder 的显微镜
| 面板 | 用途 |
|---|---|
| Console(控制台) | 看前端报错和 console.log 输出 |
| Network(网络) | 看每一次 API 请求——发了什么、返回什么、状态码多少。接口没数据时先看这里 |
| Elements(元素) | 看网页结构,改样式时实时预览 |
| Application(应用) | 看浏览器存的数据——登录 Token、缓存,登录态异常时来这清理 |
9.4安全五不要
| 禁忌 | 后果与正确做法 |
|---|---|
| 不要硬编码密钥 | 密钥进代码=进 Git=全网公开。一律用 .env + 环境变量 |
| 不要拼接 SQL | 用户输入直接拼进 SQL 会导致注入攻击,数据可被拖库。让 AI 用参数化查询或 ORM |
| 不要明文存密码 | 数据库泄露则所有用户密码裸奔。必须用 bcrypt 等哈希算法存储 |
| 不要信任用户输入 | 所有输入都校验:长度、类型、危险字符。前端校验只是体验,后端校验才是安全 |
| 不要裸奔 HTTP | 涉及登录、支付必须 HTTPS,否则密码在网络里明文传输 |
假设代码把用户输入直接拼进 SQL:"SELECT * FROM users WHERE name = '" + 输入 + "'"。攻击者输入 ' OR '1'='1 就能查出全表。修复只需一句话:告诉 AI"把所有 SQL 改成参数化查询(prepared statement)"。
9.5CORS:浏览器的门卫
一句话定义:CORS(跨域资源共享)是浏览器的安全规则——网页不能随便读取别的域名的数据,除非对方服务器明确许可。
生活类比:小区门禁。你的网页(a.com)想调另一个域名(api.b.com)的接口,就像访客进小区——对方门卫(服务器的 CORS 响应头)点头才放行。
前端报错 blocked by CORS policy,问题几乎都在后端:后端没配 Access-Control-Allow-Origin。把报错贴给 AI 并说明前端域名和后端框架,它会给你对应的放行配置。注意:只允许自己的域名,不要图省事配成允许所有人(*),尤其是带登录态的接口。
Vibe Coding 实战心法:如何与 AI 高效协作
10.1描述需求的黄金结构
AI 输出质量的上限,是你输入质量的上限。一个高质量需求描述包含四段:
要做什么、给谁用。"给团队内部用的请假审批小程序。"
现有技术栈和约束。"已有 React 前端和 MySQL 数据库,后端用 Node.js + Express。"
明确的约束条件。"审批状态只有三种:待审/通过/驳回;任何人不能审批自己的申请。"
输入输出的样子。"提交请假返回 JSON:{ id, status: "pending" }。"
对比"帮我做个请假系统",四段式描述得到的代码可以直接用的概率高出一个数量级。
10.2小步快跑:一次只做一件事
让 AI 一次性生成整个应用,得到的往往是处处能跑、处处有坑的半成品。正确节奏是:
- 第一步:让 AI 搭出最小骨架(能启动、能显示一个页面),跑通就 git commit。
- 第二步:每次只加一个功能(登录、列表、提交……),每个功能验收通过就 commit。
- 第三步:某一步改崩了,git 回退到上一个存档,换个描述方式重来——成本几乎为零。
这就是为什么第六章说"勤提交"是 Vibe Coding 最重要的习惯:提交越频繁,试错成本越低。
10.3验收清单:AI 交活后必查五件事
- 跑起来了吗?——亲手操作一遍核心流程,不只看代码。
- 有明文密钥吗?——全局搜索 sk-、password、secret。
- 报错处理了吗?——故意输错、断网,看是友好提示还是白屏崩溃。
- 数据库操作带 WHERE 吗?——检查 UPDATE/DELETE 的影响范围。
- 该提交的提交了吗?——git add + commit,给这次进展存档。
10.4十个高频提示词模板
核心术语速查表
按首字母排序,覆盖全书高频术语。看到眼生的词,先来这里查一句话解释,再回对应章节细读。
理解概念,驾驭 AI
AI 写得越快,你越需要知道它在写什么