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/CSSNode.js、Python、Java + MySQL
看得见吗完全可见用户看不到,只通过 API 暴露

一个人(或一个 AI)同时写前端和后端,就叫全栈开发。Vibe Coding 项目大多是全栈项目,所以你两侧的概念都会遇到。

2.3客户端与服务器

一句话定义:客户端是发起请求的一方(你的浏览器/App),服务器是接收请求并返回结果的一方(远端那台 7×24 小时开机的电脑)。

你在浏览器输入网址,浏览器(客户端)把请求发给服务器;服务器查数据库、跑逻辑,把网页或数据送回来。这个"请求—响应"的一来一回,是第四章 HTTP 的全部基础。

常见坑:把后端逻辑写进前端

前端代码任何人都能在浏览器里看到(按 F12 即可)。API 密钥、数据库密码、核心算法如果出现在前端代码里,等于公开发布。务必提醒 AI:"敏感逻辑和密钥放在后端,前端只调用接口。"

2.4框架与库:站在别人的肩膀上

一句话定义:库(Library)是你拿来调用的现成工具集;框架(Framework)是一套搭好的骨架,你把代码填进它规定的位置。

生活类比:做饭。库像调料和半成品——想用就用;框架像火锅店的整套流程——锅底、配菜顺序、上菜节奏都已定好,你只负责往里下菜。

常见:前端框架 ReactVue;后端框架 Express(Node.js)、Django/Flask(Python)。AI 生成的项目几乎总是基于某个框架——项目根目录的 package.jsonrequirements.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"张三"必须用英文双引号包裹
数字 number25 或 3.14整数小数都行,不加引号
布尔 booleantrue / false全小写,不加引号
空值 nullnull表示"什么都没有"
数组 array[1, 2, 3]有序列表,方括号,可装任意类型
对象 object{"a": 1}键值对集合,花括号,key 必须是字符串

3.3六条铁律:为什么 AI 生成的 JSON 也会报错

  1. 所有键名和字符串必须用英文双引号,单引号、中文引号都不行。
  2. 最后一个元素后面不能多写逗号(尾随逗号在 JSON 里是非法的)。
  3. 不支持注释——配置里想写说明,只能加一个 "_note" 之类的键。
  4. 键值对之间用英文冒号,元素之间用英文逗号,一个中文标点就能让整个文件失效
  5. 数字不能加引号——"25" 是字符串,25 才是数字,排序和计算结果完全不同。
  6. 整个文档必须是一个完整的对象或数组,不能有第二份孤立的数据。

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 传输、配置文件,绝对主力
CSVname,age\n张三,25表格数据导出、Excel 交换
YAMLname: 张三(靠缩进分层)Docker、CI/CD 等运维配置
XML<name>张三</name>老系统接口、部分企业软件
Markdown# 标题、**加粗**文档、README、AI 输出排版
给 AI 的提示词
"请以 JSON 格式返回结果,结构为 { 字段A: 字符串, 字段B: 数字数组 },不要输出任何多余文字,不要加注释和尾随逗号。"

3.6Vibe Coding 场景速查

package.json 报错

八成是改依赖版本时留下了尾随逗号或中文逗号,用编辑器自带的 JSON 校验或让 AI"检查这个 JSON 的语法错误"即可定位。

API 返回 undefined

前端取不到字段,先检查是不是忘了 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 不会随便让人调用,需要你提供凭证:

API Key

一串随机字符(如 sk-abc123...),相当于密码,通常放在请求头里。AI 大模型、地图、支付等第三方服务都用它。

Token / JWT

登录后服务器签发的"临时通行证",有过期时间,前端之后每次请求都带上它证明自己已登录。

常见坑:密钥泄露

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 文本,要解析后才能用。以后看到 fetchaxios 开头的代码块,都知道它在干什么了。

给 AI 的提示词
"为这个功能写一个前端调用函数:POST 到 /api/orders,请求体为 { item, qty },需要在 header 携带 Bearer Token;请处理 401(跳转登录)和 500(提示稍后重试)两种情况。"
第五章

MySQL 与数据库:数据的仓库

5.1数据库是什么

一句话定义:数据库是有结构地持久存储数据、并支持高效查询的系统;MySQL 是其中最流行的开源关系型数据库之一。

生活类比:Excel 的工业加强版。一张表就像一张 Excel 表,但数据库能同时服务成千上万人的读写、保证数据不乱、支持毫秒级从百万行里找到你要的那一行。

5.2表、行、列:数据库的语法单位

关系型数据库的世界只有三个名词:表(Table)是一类事物的集合;列(Column)是这类事物的属性;行(Row)是一个具体的事物。

idnameemailcreated_at
1张三zhangsan@example.com2025-07-01
2李四lisi@example.com2025-07-15
3王五wangwu@example.com2025-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;
致命坑:没有 WHERE 的 UPDATE / DELETE

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内存键值库,速度极快缓存、验证码、排行榜
给 AI 的提示词
"帮我设计数据库表结构:这是一个【待办事项应用】,需要用户、清单、任务三类数据,任务属于清单、清单属于用户。请给出建表 SQL,包含主键、外键和必要的索引,并说明每个字段的类型选择理由。"
第六章

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:

  1. .env——里面是数据库密码和 API Key,传上 GitHub 等于全网公开。
  2. node_modules / venv——依赖文件夹,动辄几万文件,别人拿到项目后一条安装命令即可重建。
  3. 构建产物和系统垃圾文件,如 dist/、.DS_Store。
常见坑:先提交了 .env 才加 .gitignore

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 就能从开发切到生产。

常见坑:把 .env 提交进 Git 或写进前端

AI 有时会图省事把密钥直接写死在代码里(hardcode)。验收时全局搜索 sk-passwordsecret 等关键词,发现明文密钥立即要求改为环境变量读取。

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常见坑速查

Cannot find module 'xxx'

依赖没装,运行 npm install 或检查包名拼写。

版本不兼容

让 AI"检查依赖版本冲突并给出兼容的版本组合",不要让它盲目全升到最新。

Python 项目环境污染

用虚拟环境(venv)给每个项目隔出一套独立依赖,避免 A 项目要的库和 B 项目打架。

给 AI 的提示词
"请检查这个 package.json:哪些依赖应该放进 devDependencies?哪些版本约束过于激进(^ 可能导致意外升级)?请给出修正版并说明理由。"
第八章

部署上线:让全世界访问你的作品

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环境复杂、需要精确复现的项目中高
给 AI 的提示词
"我的项目结构是【React 前端 + Node.js 后端 + MySQL】,想部署给公网用户访问。请比较 Vercel+云数据库、Railway、云服务器+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 注入长什么样

假设代码把用户输入直接拼进 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 输出质量的上限,是你输入质量的上限。一个高质量需求描述包含四段:

1. 目标

要做什么、给谁用。"给团队内部用的请假审批小程序。"

2. 上下文

现有技术栈和约束。"已有 React 前端和 MySQL 数据库,后端用 Node.js + Express。"

3. 规则

明确的约束条件。"审批状态只有三种:待审/通过/驳回;任何人不能审批自己的申请。"

4. 示例

输入输出的样子。"提交请假返回 JSON:{ id, status: "pending" }。"

对比"帮我做个请假系统",四段式描述得到的代码可以直接用的概率高出一个数量级。

10.2小步快跑:一次只做一件事

让 AI 一次性生成整个应用,得到的往往是处处能跑、处处有坑的半成品。正确节奏是:

  1. 第一步:让 AI 搭出最小骨架(能启动、能显示一个页面),跑通就 git commit。
  2. 第二步:每次只加一个功能(登录、列表、提交……),每个功能验收通过就 commit。
  3. 第三步:某一步改崩了,git 回退到上一个存档,换个描述方式重来——成本几乎为零。

这就是为什么第六章说"勤提交"是 Vibe Coding 最重要的习惯:提交越频繁,试错成本越低。

10.3验收清单:AI 交活后必查五件事

  1. 跑起来了吗?——亲手操作一遍核心流程,不只看代码。
  2. 有明文密钥吗?——全局搜索 sk-、password、secret。
  3. 报错处理了吗?——故意输错、断网,看是友好提示还是白屏崩溃。
  4. 数据库操作带 WHERE 吗?——检查 UPDATE/DELETE 的影响范围。
  5. 该提交的提交了吗?——git add + commit,给这次进展存档。

10.4十个高频提示词模板

设计数据库
"为【业务】设计表结构,给出建表 SQL,含主键、外键、索引,并解释字段类型选择"
生成接口
"写一个【方法】【路径】接口,入参【字段】,返回 JSON 结构为【示例】,处理 400/401/500"
修报错
"这是完整报错:【粘贴】。相关代码:【粘贴】。先分析根因,再给最小改动方案"
查安全
"审计这段代码的安全问题:SQL 注入、明文密码、硬编码密钥、未校验输入,逐项列出"
读代码
"用三句话向非程序员解释这段代码做什么,再指出两个最可能出问题的地方"
生成 JSON
"严格按此结构返回 JSON:【示例】。不要注释、不要多余文字、不要尾随逗号"
写环境配置
"把代码中的密钥改为读取 .env,给出 .env 模板和 .gitignore 补充内容"
部署指导
"我的技术栈是【前端+后端+数据库】,推荐新手最省事的部署方案,给出逐步命令"
加测试
"为这个接口写三个测试用例:正常输入、非法输入、未登录调用"
优化性能
"这个查询在数据量大时变慢,分析是否缺索引,给出加索引的 SQL 和验证方法"
附录

核心术语速查表

按首字母排序,覆盖全书高频术语。看到眼生的词,先来这里查一句话解释,再回对应章节细读。

全部 HTTP/API 数据库 Git 环境依赖 部署 安全
API4.4
程序对外提供功能的标准入口
API Key4.5
调用第三方服务的身份凭证,等于密码
Commit6.2
Git 的一次存档,记录改动与说明
CORS9.5
浏览器限制跨域名读取数据的安全规则
CRUD4.2
增删改查:创建/读取/更新/删除的合称
DNS8.3
把域名翻译成 IP 地址的全球系统
Docker8.5
把代码+环境打包成标准镜像的工具
.env7.1
本地保存密钥与配置的文件,不进 Git
前端 / 后端2.2
界面部分 / 服务器上的逻辑与数据部分
Git / GitHub6.1/6.4
版本控制工具 / 基于 Git 的托管平台
HTTP / HTTPS4.1/8.4
网络通信协议 / 加密版通信协议
JSON3.1
互联网通用的结构化数据文本格式
localhost8.1
本机地址,只有自己能访问
MySQL5.1
最流行的开源关系型数据库
node_modules7.2
依赖包的实际存放文件夹,不进 Git
npm / pip7.2
JavaScript / Python 的包管理器
REST4.4
用 URL 表示资源、方法表示动作的 API 风格
SQL / 索引5.3/5.4
数据库查询语言 / 加速查询的目录结构
Token / JWT4.5
登录后签发的临时通行凭证
环境变量7.1
代码之外、随环境变化的配置值
端口(Port)8.1
区分同一台电脑上不同程序的编号
主键 / 外键5.4
行的唯一编号 / 指向他表主键的关联字段
状态码4.3
HTTP 响应的三位数字结果标识

理解概念,驾驭 AI

AI 写得越快,你越需要知道它在写什么

输入关键词开始搜索