36e - 第5周:测试与打磨
本文是《AI Agent 实战手册》第 36 章第 5 节。 上一节:第3-4周:Spec-Driven开发 | 下一节:第6周:上线与运营启动
概述
第 5 周是一人公司全流程中从”能用”到”好用”的关键转折点。经过第 3-4 周的密集开发,你手上已经有了功能完整的 MVP——但”功能完整”不等于”可以发布”。这一周的任务是通过全面测试发现隐藏的 Bug、通过性能优化确保用户体验流畅、通过发布准备让产品以最佳状态面世。2026 年的 AI 工具让一个人也能完成专业团队级别的测试和打磨工作:AI 辅助生成测试用例、自动分析性能瓶颈、批量生成发布材料。本节详细覆盖 Day 1-2 的全面测试策略、Day 3 的性能优化方法、Day 4-5 的发布准备流程,确保你的产品在上线时经得起真实用户的考验。
1. Day 1-2:全面测试
1.1 测试策略总览
第 3-4 周的开发过程中,你已经为每个任务编写了基础的单元测试。但那些测试主要覆盖”正常路径”——现在需要系统性地补充边界测试、集成测试、E2E 测试和手动测试,形成完整的质量保障网。
第 5 周测试策略金字塔:
┌───────────────┐
│ 手动测试 │ ← 关键用户流程(5-8 个场景)
│ (Day 2 下午) │ 真实设备 + 真实网络
├───────────────┤
│ E2E 测试 │ ← 核心用户旅程(3-5 个流程)
│ (Day 2 上午) │ Playwright 自动化
├───────────────┤
│ 集成测试 │ ← API + 数据流(每模块 2-3 个)
│ (Day 1 下午) │ 真实数据库 + 真实 API
├───────────────┤
│ 单元测试补充 │ ← 边界条件 + 错误路径
│ (Day 1 上午) │ 补充 Week 3-4 遗漏的测试
├───────────────┤
│ PBT 属性测试 │ ← 数据转换 + 计算逻辑
│ (Day 1 上午) │ 自动发现边界情况
└───────────────┘
│ 类型检查 │ ← TypeScript strict 模式
│ (持续) │ 编译时自动检查
└───────────────┘
质量门标准(Quality Gates):
├── 单元测试覆盖率 > 70%(核心逻辑 > 90%)
├── 所有 PBT 属性测试通过
├── E2E 测试覆盖所有关键用户流程
├── 手动测试通过所有验收标准
├── TypeScript 编译零错误
├── ESLint/Biome 零警告
├── 构建成功且无警告
└── 所有已知 Bug 修复或标记为"已知问题"1.2 测试工具推荐
| 工具 | 用途 | 价格 | 适用场景 |
|---|---|---|---|
| Vitest | 单元测试 + 集成测试 | 免费 | TypeScript/JavaScript 项目首选,兼容 Jest API |
| fast-check | 属性基测试(PBT) | 免费 | 自动发现边界情况,数据转换/计算逻辑 |
| Playwright | E2E 测试 | 免费 | 跨浏览器端到端测试,支持移动端模拟 |
| Testing Library | 组件测试 | 免费 | React/Vue/Svelte 组件行为测试 |
| Qodo(原 CodiumAI) | AI 测试生成 | 免费(基础)/ $19/月 Pro | 自动分析代码生成测试用例 |
| TestSprite | AI 自动化测试 | 免费试用 / $49/月 | 自主 E2E 测试生成和执行 |
| Kiro Spec Testing | Spec 驱动测试 | 免费(50 次/月)/ $19/月 | 从 requirements 自动生成验收测试 |
| MSW(Mock Service Worker) | API Mock | 免费 | 前端测试中模拟后端 API |
| Faker.js | 测试数据生成 | 免费 | 生成逼真的测试数据 |
| c8 / istanbul | 覆盖率报告 | 免费 | 测试覆盖率统计和可视化 |
| Lighthouse CI | 性能测试 | 免费 | CI 中自动运行性能审计 |
| BrowserStack | 跨浏览器测试 | 免费(开源)/ $29/月 | 真实设备和浏览器测试 |
1.3 操作步骤:Day 1 上午——单元测试补充与 PBT
步骤 1:评估当前测试覆盖率(15 分钟)
# 运行覆盖率报告
pnpm test:run --coverage
# 查看覆盖率摘要
# 重点关注:
# - 核心业务逻辑文件的覆盖率
# - 未覆盖的分支(branches)
# - 未覆盖的函数(functions)覆盖率分析清单:
□ 哪些核心文件覆盖率低于 70%?
├── 列出所有低覆盖率的核心文件
├── 优先补充业务逻辑文件的测试
└── UI 组件覆盖率可以较低(50% 即可)
□ 哪些分支未覆盖?
├── 错误处理分支(catch 块)
├── 边界条件分支(空值、零值)
├── 权限检查分支
└── 这些往往是 Bug 最多的地方
□ 哪些函数完全没有测试?
├── 工具函数(utils)
├── 数据转换函数
├── 验证函数
└── 这些是最容易补充测试的步骤 2:用 AI 批量生成缺失的单元测试(1.5 小时)
AI 辅助测试生成的工作流:
1. 识别低覆盖率文件
$ pnpm test:run --coverage 2>&1 | grep "< 70"
2. 对每个低覆盖率文件,让 AI 生成测试
├── 提供文件代码 + 对应的 requirements
├── 要求覆盖错误路径和边界条件
└── 审查生成的测试,确保断言有意义
3. 运行测试,修复失败的用例
├── 测试失败 = 可能发现了 Bug!
├── 分析失败原因:是测试写错了还是代码有 Bug?
└── 修复 Bug 或调整测试
4. 重新检查覆盖率
└── 目标:核心逻辑 > 90%,整体 > 70%步骤 3:编写 PBT 属性测试(1 小时)
PBT 重点覆盖的逻辑:
1. 数据转换函数
├── 属性:往返一致性 decode(encode(x)) === x
├── 属性:输出格式始终有效
└── 属性:特殊字符不会破坏转换
2. 计算逻辑
├── 属性:结果在预期范围内
├── 属性:单调性(输入增大,输出不减小)
└── 属性:幂等性(重复操作结果不变)
3. 验证规则
├── 属性:有效输入始终通过验证
├── 属性:无效输入始终被拒绝
└── 属性:验证错误消息始终有意义
4. 搜索和筛选
├── 属性:筛选结果是原集合的子集
├── 属性:空筛选条件返回全部结果
└── 属性:结果数量 <= 原集合数量// 示例:用 fast-check 测试用户输入验证逻辑
import { describe, it, expect } from 'vitest'
import * as fc from 'fast-check'
import { validateEmail, sanitizeInput } from './validation'
describe('validateEmail - PBT', () => {
// 属性 1:有效邮箱格式始终通过验证
it('有效邮箱格式始终通过', () => {
fc.assert(
fc.property(
fc.emailAddress(),
(email) => {
const result = validateEmail(email)
return result.valid === true
}
)
)
})
// 属性 2:不含 @ 的字符串始终不通过
it('不含 @ 的字符串始终被拒绝', () => {
fc.assert(
fc.property(
fc.string().filter(s => !s.includes('@') && s.length > 0),
(notEmail) => {
const result = validateEmail(notEmail)
return result.valid === false
}
)
)
})
})
describe('sanitizeInput - PBT', () => {
// 属性 3:清理后的输出不包含 HTML 标签
it('清理后不包含 HTML 标签', () => {
fc.assert(
fc.property(
fc.string(),
(input) => {
const sanitized = sanitizeInput(input)
return !/<[^>]*>/.test(sanitized)
}
)
)
})
// 属性 4:清理是幂等的
it('重复清理结果不变', () => {
fc.assert(
fc.property(
fc.string(),
(input) => {
const once = sanitizeInput(input)
const twice = sanitizeInput(once)
return once === twice
}
)
)
})
})1.4 操作步骤:Day 1 下午——集成测试
步骤 4:编写核心 API 集成测试(2 小时)
集成测试验证多个模块协同工作的正确性。与单元测试不同,集成测试使用真实的数据库和 API(或接近真实的模拟)。
集成测试重点场景:
1. 用户认证流程
├── 注册 → 验证邮箱 → 登录 → 获取 session
├── 无效凭证 → 错误响应
├── Token 过期 → 自动刷新
└── 权限不足 → 403 响应
2. 核心业务流程
├── 创建资源 → 读取 → 更新 → 删除(CRUD 完整链路)
├── 并发操作 → 数据一致性
├── 大数据量 → 分页正确性
└── 关联数据 → 级联操作正确性
3. 第三方服务集成
├── 支付流程(Stripe Webhook 模拟)
├── 邮件发送(Resend API 模拟)
├── OAuth 回调处理
└── 文件上传和处理
4. 错误恢复
├── 数据库连接断开 → 重连
├── 第三方 API 超时 → 重试
├── 无效数据 → 优雅降级
└── 并发冲突 → 正确处理// 示例:核心业务流程集成测试
import { describe, it, expect, beforeAll, afterAll } from 'vitest'
import { createTestClient, cleanupTestData } from './test-utils'
describe('Review CRUD 集成测试', () => {
let client: TestClient
let testUserId: string
beforeAll(async () => {
client = await createTestClient()
testUserId = await client.createTestUser()
})
afterAll(async () => {
await cleanupTestData(testUserId)
})
it('完整的创建→读取→更新→删除流程', async () => {
// 创建
const created = await client.createReview({
title: 'Test Review',
content: 'Test content',
userId: testUserId,
})
expect(created.id).toBeDefined()
expect(created.title).toBe('Test Review')
// 读取
const fetched = await client.getReview(created.id)
expect(fetched.title).toBe('Test Review')
// 更新
const updated = await client.updateReview(created.id, {
title: 'Updated Review',
})
expect(updated.title).toBe('Updated Review')
// 删除
await client.deleteReview(created.id)
const deleted = await client.getReview(created.id)
expect(deleted).toBeNull()
})
it('未认证用户无法创建资源', async () => {
const unauthClient = createTestClient({ authenticated: false })
await expect(
unauthClient.createReview({ title: 'Test', content: 'Test' })
).rejects.toThrow('Unauthorized')
})
it('用户只能访问自己的资源', async () => {
const otherUserId = await client.createTestUser()
const review = await client.createReview({
title: 'Private Review',
userId: testUserId,
})
const otherClient = createTestClient({ userId: otherUserId })
await expect(
otherClient.updateReview(review.id, { title: 'Hacked' })
).rejects.toThrow('Forbidden')
await cleanupTestData(otherUserId)
})
})1.5 操作步骤:Day 2 上午——E2E 测试
步骤 5:编写关键用户流程的 E2E 测试(2 小时)
E2E 测试模拟真实用户在浏览器中的操作,验证整个系统从前端到后端的完整链路。
E2E 测试覆盖的关键流程(3-5 个):
1. 新用户注册和首次使用流程
├── 访问首页 → 点击注册 → 填写表单 → 验证邮箱
├── 首次登录 → 引导页面 → 完成设置
└── 验证:用户能成功完成首次体验
2. 核心功能的完整使用流程
├── 登录 → 创建资源 → 编辑 → 保存 → 查看结果
├── 搜索 → 筛选 → 排序 → 分页
└── 验证:核心功能正常工作
3. 支付流程(如果有)
├── 查看定价 → 选择方案 → 进入支付 → 完成支付
├── 验证订阅状态更新
└── 验证:支付流程无阻塞
4. 错误恢复流程
├── 提交无效数据 → 显示错误提示 → 修正 → 成功提交
├── 网络断开 → 显示离线提示 → 恢复后自动重试
└── 验证:错误处理对用户友好
5. 移动端关键流程(响应式)
├── 在移动端视口下完成核心操作
├── 导航菜单正常工作
└── 验证:移动端体验可用// 示例:Playwright E2E 测试
import { test, expect } from '@playwright/test'
test.describe('新用户注册流程', () => {
test('完整的注册→登录→首次使用流程', async ({ page }) => {
// 1. 访问首页
await page.goto('/')
await expect(page.getByRole('heading', { level: 1 })).toBeVisible()
// 2. 点击注册
await page.getByRole('link', { name: '开始使用' }).click()
await expect(page).toHaveURL('/auth/signup')
// 3. 填写注册表单
await page.getByLabel('邮箱').fill('test@example.com')
await page.getByLabel('密码').fill('SecurePass123!')
await page.getByLabel('确认密码').fill('SecurePass123!')
await page.getByRole('button', { name: '注册' }).click()
// 4. 验证跳转到引导页
await expect(page).toHaveURL('/onboarding')
await expect(page.getByText('欢迎')).toBeVisible()
// 5. 完成引导设置
await page.getByRole('button', { name: '下一步' }).click()
await page.getByRole('button', { name: '完成设置' }).click()
// 6. 验证进入主界面
await expect(page).toHaveURL('/dashboard')
await expect(page.getByText('仪表板')).toBeVisible()
})
test('无效邮箱显示错误提示', async ({ page }) => {
await page.goto('/auth/signup')
await page.getByLabel('邮箱').fill('invalid-email')
await page.getByLabel('密码').fill('SecurePass123!')
await page.getByRole('button', { name: '注册' }).click()
await expect(page.getByText('请输入有效的邮箱地址')).toBeVisible()
})
})
test.describe('核心功能流程', () => {
test.beforeEach(async ({ page }) => {
// 使用测试账号登录
await page.goto('/auth/login')
await page.getByLabel('邮箱').fill('test@example.com')
await page.getByLabel('密码').fill('SecurePass123!')
await page.getByRole('button', { name: '登录' }).click()
await expect(page).toHaveURL('/dashboard')
})
test('创建→编辑→删除资源的完整流程', async ({ page }) => {
// 创建
await page.getByRole('button', { name: '新建' }).click()
await page.getByLabel('标题').fill('测试项目')
await page.getByRole('button', { name: '保存' }).click()
await expect(page.getByText('创建成功')).toBeVisible()
// 编辑
await page.getByText('测试项目').click()
await page.getByRole('button', { name: '编辑' }).click()
await page.getByLabel('标题').fill('更新后的项目')
await page.getByRole('button', { name: '保存' }).click()
await expect(page.getByText('更新成功')).toBeVisible()
// 删除
await page.getByRole('button', { name: '删除' }).click()
await page.getByRole('button', { name: '确认删除' }).click()
await expect(page.getByText('删除成功')).toBeVisible()
})
})
// 移动端测试
test.describe('移动端响应式', () => {
test.use({ viewport: { width: 375, height: 812 } }) // iPhone X
test('移动端导航正常工作', async ({ page }) => {
await page.goto('/')
// 汉堡菜单
await page.getByRole('button', { name: '菜单' }).click()
await expect(page.getByRole('navigation')).toBeVisible()
await page.getByRole('link', { name: '功能' }).click()
await expect(page).toHaveURL('/#features')
})
})1.6 操作步骤:Day 2 下午——手动测试
步骤 6:执行手动测试清单(2 小时)
自动化测试无法覆盖所有场景——视觉一致性、交互流畅度、文案准确性等需要人眼验证。
手动测试清单:
□ 视觉检查
├── 所有页面在桌面端(1920×1080)显示正常
├── 所有页面在平板端(768×1024)显示正常
├── 所有页面在手机端(375×812)显示正常
├── 暗色模式(如果支持)显示正常
├── 字体加载正确,无 FOUT/FOIT
├── 图片加载正确,无破图
├── 动画流畅,无卡顿
└── 表单元素对齐正确
□ 交互检查
├── 所有按钮可点击,有 hover/active 反馈
├── 所有表单可提交,有加载状态
├── 所有链接指向正确页面
├── 键盘导航正常(Tab 顺序合理)
├── 错误提示清晰且位置正确
├── 成功提示出现且自动消失
├── 模态框可正常打开和关闭
└── 下拉菜单正常工作
□ 内容检查
├── 所有文案无错别字
├── 空状态有友好提示
├── 加载状态有骨架屏或 spinner
├── 错误页面(404、500)有友好提示
├── 邮件模板在主流邮件客户端显示正常
└── SEO meta 标签正确(title、description、og:image)
□ 安全检查
├── 未登录用户无法访问受保护页面
├── 普通用户无法访问管理员页面
├── 直接访问 API 端点需要认证
├── 敏感操作有确认对话框
├── 密码输入框有遮挡
└── 环境变量未暴露到前端
□ 边界情况
├── 超长文本是否正确截断或换行
├── 特殊字符(emoji、中文、日文)显示正常
├── 大量数据(100+ 条)列表性能可接受
├── 快速连续点击不会重复提交
├── 浏览器前进/后退按钮正常工作
└── 刷新页面不丢失状态1.7 AI 辅助测试生成与 Bug 修复
AI 测试生成工作流
2026 年的 AI 工具已经能够高效地辅助测试生成。关键是提供足够的上下文——包括代码、需求和已有测试。
AI 辅助测试的三步法:
Step 1:让 AI 分析测试覆盖缺口
├── 提供源代码文件
├── 提供已有测试文件
├── 提供覆盖率报告
└── 让 AI 识别未覆盖的分支和路径
Step 2:让 AI 生成缺失的测试
├── 针对每个缺口生成测试用例
├── 包含正常路径和错误路径
├── 包含边界条件
└── 使用项目已有的测试风格和工具
Step 3:审查和运行
├── 审查生成的测试是否有意义
├── 删除冗余或无价值的测试
├── 运行测试,分析失败原因
└── 修复 Bug 或调整测试AI 辅助 Bug 修复工作流
当测试发现 Bug 时的处理流程:
1. 复现 Bug
├── 记录触发条件(输入、状态、环境)
├── 确认 Bug 可稳定复现
└── 如果是偶发 Bug,增加测试运行次数
2. 让 AI 分析根因
├── 提供失败的测试代码和错误信息
├── 提供相关的源代码
├── 让 AI 分析可能的根本原因
└── AI 通常能快速定位逻辑错误
3. 修复并验证
├── 让 AI 提供修复方案
├── 审查修复是否引入新问题
├── 运行所有相关测试
└── 确认 Bug 已修复且无回归
4. 添加回归测试
├── 为这个 Bug 添加专门的测试用例
├── 确保未来不会再次出现
└── 在 commit message 中引用 Bug 描述1.8 质量门验收
Day 2 结束时,执行质量门检查:
# 质量门检查脚本
echo "=== 质量门检查 ==="
# 1. TypeScript 编译
echo "1. TypeScript 编译检查..."
pnpm tsc --noEmit
echo "✅ TypeScript 编译通过"
# 2. Lint 检查
echo "2. Lint 检查..."
pnpm lint
echo "✅ Lint 检查通过"
# 3. 单元测试
echo "3. 运行单元测试..."
pnpm test:run
echo "✅ 单元测试通过"
# 4. 覆盖率检查
echo "4. 覆盖率检查..."
pnpm test:run --coverage
echo "✅ 覆盖率报告已生成"
# 5. E2E 测试
echo "5. 运行 E2E 测试..."
pnpm test:e2e
echo "✅ E2E 测试通过"
# 6. 构建检查
echo "6. 构建检查..."
pnpm build
echo "✅ 构建成功"
echo "=== 所有质量门通过 ✅ ==="1.9 提示词模板
模板 1:测试覆盖缺口分析
请分析以下代码的测试覆盖情况:
源代码文件:
[粘贴源代码]
已有测试文件:
[粘贴已有测试]
覆盖率报告摘要:
- 行覆盖率:[N]%
- 分支覆盖率:[N]%
- 函数覆盖率:[N]%
请:
1. 识别未覆盖的代码路径和分支
2. 按优先级排序(高风险路径优先)
3. 为每个缺口生成测试用例
4. 特别关注:错误处理、边界条件、安全相关逻辑
5. 使用 Vitest 框架,保持与已有测试一致的风格模板 2:AI 辅助 Bug 分析
测试发现了一个 Bug,请帮我分析:
失败的测试:
[粘贴测试代码]
错误信息:
[粘贴完整错误输出]
相关源代码:
[粘贴相关代码]
对应的需求(requirements.md):
[粘贴验收标准]
请:
1. 分析 Bug 的根本原因
2. 判断是代码 Bug 还是测试写错了
3. 如果是代码 Bug,提供修复方案
4. 如果是测试问题,提供修正后的测试
5. 建议是否需要添加额外的回归测试模板 3:E2E 测试生成
请为以下用户流程生成 Playwright E2E 测试:
用户流程描述:
[描述完整的用户操作步骤]
页面 URL 结构:
[列出涉及的页面 URL]
关键 UI 元素:
[列出按钮、表单、文本等关键元素]
验收标准:
[粘贴 requirements.md 中的验收标准]
要求:
1. 使用 Playwright Test 框架
2. 使用 getByRole、getByLabel、getByText 等语义化选择器
3. 包含等待和断言
4. 覆盖正常流程和至少一个错误流程
5. 添加移动端视口的测试变体2. Day 3:性能优化
2.1 性能优化策略总览
性能优化遵循”测量→分析→优化→验证”的循环。不要凭直觉优化——先用数据找到真正的瓶颈。
性能优化的优先级矩阵:
高影响 + 低成本(立即做):
├── 图片优化(WebP/AVIF 格式、懒加载、响应式尺寸)
├── 代码分割(动态 import、路由级分割)
├── 字体优化(font-display: swap、子集化)
├── 缓存策略(静态资源长期缓存、API 响应缓存)
└── 压缩(Gzip/Brotli)
高影响 + 中成本(优先做):
├── 数据库查询优化(索引、N+1 修复)
├── API 响应优化(字段筛选、分页)
├── 首屏渲染优化(SSR/SSG、关键 CSS 内联)
├── 第三方脚本优化(延迟加载、异步加载)
└── Bundle 体积优化(tree-shaking、依赖替换)
低影响 + 高成本(延后做):
├── 微前端架构
├── CDN 边缘计算
├── 数据库分片
└── 自定义缓存层2.2 性能优化工具推荐
| 工具 | 用途 | 价格 | 适用场景 |
|---|---|---|---|
| Lighthouse | 综合性能审计 | 免费 | Chrome DevTools 内置,首选审计工具 |
| PageSpeed Insights | 真实用户数据分析 | 免费 | 基于 CrUX 数据的真实性能评估 |
| WebPageTest | 深度性能分析 | 免费 | 瀑布图分析、多地点测试 |
| Unlighthouse | 全站批量审计 | 免费 | 一次扫描所有页面的 Lighthouse 分数 |
| Bundle Analyzer | 包体积分析 | 免费 | 可视化 JavaScript bundle 组成 |
| DebugBear | 持续性能监控 | $12/月起 | 自动追踪 Core Web Vitals 变化 |
| Vercel Analytics | 真实用户性能 | 免费(基础)/ $10/月 | Vercel 部署项目的 RUM 数据 |
| Sentry Performance | 后端性能追踪 | 免费(5K 事件)/ $26/月 | API 响应时间、数据库查询追踪 |
| SpeedCurve | 竞品性能对比 | $12/月起 | 与竞品的性能对比分析 |
2.3 操作步骤:Core Web Vitals 优化
2026 年 Google 的 Core Web Vitals 包含三个核心指标,直接影响 SEO 排名和用户体验:
Core Web Vitals 2026 标准:
1. LCP(Largest Contentful Paint)— 加载性能
├── 好:< 2.5 秒
├── 需改进:2.5-4 秒
├── 差:> 4 秒
└── 目标:< 2 秒
2. INP(Interaction to Next Paint)— 交互响应
├── 好:< 200ms
├── 需改进:200-500ms
├── 差:> 500ms
└── 目标:< 150ms(2026 年竞争性阈值)
3. CLS(Cumulative Layout Shift)— 视觉稳定性
├── 好:< 0.1
├── 需改进:0.1-0.25
├── 差:> 0.25
└── 目标:< 0.05步骤 1:基线测量(30 分钟)
# 1. 本地 Lighthouse 审计
# 在 Chrome DevTools → Lighthouse 面板运行审计
# 记录:Performance 分数、LCP、INP、CLS
# 2. PageSpeed Insights 在线测试
# 访问 https://pagespeed.web.dev/
# 测试你的生产 URL(或 Vercel Preview URL)
# 记录:移动端和桌面端分数
# 3. 全站批量审计(使用 Unlighthouse)
npx unlighthouse --site https://your-app.vercel.app
# 生成所有页面的 Lighthouse 报告
# 4. Bundle 体积分析
# Next.js
ANALYZE=true pnpm build
# Vite
pnpm build --report基线记录模板:
页面 | LCP | INP | CLS | 分数 | 备注
首页 | 2.1s | 180ms | 0.02 | 85 | LCP 需优化
Dashboard | 3.5s | 250ms | 0.15 | 62 | 需重点优化
定价页 | 1.8s | 120ms | 0.01 | 92 | 良好
登录页 | 1.5s | 100ms | 0.00 | 95 | 良好
Bundle 体积:
├── 总体积:450KB(gzip 后)
├── 最大 chunk:vendor.js 280KB
├── 首屏 JS:180KB
└── 目标:首屏 JS < 150KB步骤 2:LCP 优化(1 小时)
LCP 优化清单:
□ 图片优化
├── 使用 next/image 或 <picture> 标签
├── 格式:WebP(兼容性好)或 AVIF(体积更小)
├── 响应式尺寸:srcset + sizes
├── 首屏图片:priority / fetchpriority="high"
├── 非首屏图片:loading="lazy"
└── 使用 CDN 提供图片(Cloudflare Images / imgix)
□ 字体优化
├── font-display: swap(避免 FOIT)
├── 预加载关键字体:<link rel="preload">
├── 字体子集化(只包含使用的字符)
└── 使用系统字体栈作为 fallback
□ 服务端渲染优化
├── 关键页面使用 SSR 或 SSG
├── 避免客户端数据获取阻塞渲染
├── 使用 streaming SSR(React 18+)
└── 预渲染静态内容
□ 资源加载优化
├── 关键 CSS 内联(< 14KB)
├── 非关键 CSS 异步加载
├── 预连接关键域名:<link rel="preconnect">
├── DNS 预解析:<link rel="dns-prefetch">
└── 减少重定向链// Next.js 图片优化示例
import Image from 'next/image'
// ✅ 正确:首屏图片使用 priority
export function HeroSection() {
return (
<Image
src="/hero-image.webp"
alt="产品截图"
width={1200}
height={630}
priority // 首屏图片预加载
sizes="(max-width: 768px) 100vw, 1200px"
quality={85}
/>
)
}
// ✅ 正确:非首屏图片使用懒加载
export function FeatureCard({ image }: { image: string }) {
return (
<Image
src={image}
alt="功能截图"
width={600}
height={400}
loading="lazy" // 默认行为,非首屏懒加载
sizes="(max-width: 768px) 100vw, 600px"
/>
)
}步骤 3:INP 优化(30 分钟)
INP 优化清单:
□ 减少主线程阻塞
├── 长任务拆分:使用 scheduler.yield()
├── 使用 Web Worker 处理计算密集型任务
├── 避免同步 DOM 操作
└── 使用 requestAnimationFrame 处理动画
□ React 特定优化
├── 使用 useTransition 处理非紧急更新
├── 使用 useDeferredValue 延迟渲染
├── 使用 React.memo 避免不必要的重渲染
├── 使用 useCallback/useMemo 缓存计算
└── 虚拟列表(react-window / tanstack-virtual)
□ 事件处理优化
├── 输入框使用 debounce(300ms)
├── 滚动事件使用 throttle
├── 避免在事件处理器中做重计算
└── 使用 passive event listeners// React INP 优化示例
import { useTransition, useDeferredValue } from 'react'
function SearchResults({ query }: { query: string }) {
// 使用 useTransition 标记非紧急更新
const [isPending, startTransition] = useTransition()
const [results, setResults] = useState([])
const handleSearch = (value: string) => {
// 输入框立即响应(紧急更新)
setQuery(value)
// 搜索结果延迟更新(非紧急更新)
startTransition(() => {
const filtered = filterResults(allData, value)
setResults(filtered)
})
}
return (
<div>
<input onChange={(e) => handleSearch(e.target.value)} />
{isPending ? <Spinner /> : <ResultList results={results} />}
</div>
)
}步骤 4:CLS 优化(30 分钟)
CLS 优化清单:
□ 图片和视频
├── 始终指定 width 和 height 属性
├── 使用 aspect-ratio CSS 属性
├── 使用占位符(blur placeholder / skeleton)
└── 避免图片加载后改变布局
□ 字体
├── font-display: optional(最佳 CLS)或 swap
├── 预加载字体文件
├── 使用 size-adjust 匹配 fallback 字体尺寸
└── 避免 FOUT 导致的布局偏移
□ 动态内容
├── 为动态加载的内容预留空间
├── 避免在已有内容上方插入新内容
├── 使用 min-height 为容器预留空间
├── 广告/嵌入内容使用固定尺寸容器
└── Toast/通知不影响页面布局(使用 fixed 定位)
□ 动画
├── 只使用 transform 和 opacity 做动画
├── 避免动画改变元素尺寸
└── 使用 will-change 提示浏览器2.4 操作步骤:API 响应时间优化
API 性能优化清单:
□ 数据库查询优化
├── 添加缺失的索引(WHERE、JOIN、ORDER BY 字段)
├── 修复 N+1 查询(使用 eager loading / join)
├── 使用 EXPLAIN ANALYZE 分析慢查询
├── 限制返回字段(SELECT 具体字段而非 *)
└── 大数据集使用游标分页(cursor-based pagination)
□ 缓存策略
├── 静态数据:Redis / 内存缓存(TTL 5-60 分钟)
├── 用户数据:短期缓存(TTL 1-5 分钟)
├── API 响应:HTTP 缓存头(Cache-Control、ETag)
├── 计算结果:Memoization
└── 全页缓存:ISR(Incremental Static Regeneration)
□ API 设计优化
├── 批量 API(一次请求获取多个资源)
├── 字段筛选(只返回客户端需要的字段)
├── 压缩响应(Gzip/Brotli)
├── 连接池(数据库连接复用)
└── 超时设置(避免长时间挂起)// 数据库查询优化示例(Prisma)
// ❌ N+1 查询问题
const users = await prisma.user.findMany()
for (const user of users) {
const posts = await prisma.post.findMany({
where: { authorId: user.id }
})
}
// ✅ 使用 include 一次查询
const users = await prisma.user.findMany({
include: {
posts: {
select: { id: true, title: true, createdAt: true },
orderBy: { createdAt: 'desc' },
take: 10,
}
}
})
// ✅ 游标分页(大数据集)
const nextPage = await prisma.post.findMany({
take: 20,
skip: 1,
cursor: { id: lastPostId },
orderBy: { createdAt: 'desc' },
select: {
id: true,
title: true,
createdAt: true,
author: { select: { name: true, avatar: true } }
}
})2.5 AI 辅助性能分析
AI 辅助性能优化的工作流:
1. 收集性能数据
├── Lighthouse 报告(JSON 格式)
├── Bundle 分析报告
├── 慢查询日志
└── API 响应时间统计
2. 让 AI 分析瓶颈
├── 提供性能数据
├── 让 AI 识别最大的性能瓶颈
├── 让 AI 按影响程度排序
└── 让 AI 提供具体的优化建议
3. 执行优化
├── 按优先级逐个优化
├── 每次优化后重新测量
├── 记录优化前后的数据对比
└── 确保优化不引入新问题
4. 验证结果
├── 重新运行 Lighthouse
├── 对比优化前后的分数
├── 确认 Core Web Vitals 达标
└── 在真实设备上验证2.6 提示词模板
模板 4:性能瓶颈分析
请分析以下性能数据,找出最大的瓶颈:
Lighthouse 报告摘要:
- Performance 分数:[N]
- LCP:[N]s(目标 < 2s)
- INP:[N]ms(目标 < 150ms)
- CLS:[N](目标 < 0.05)
- Total Blocking Time:[N]ms
- Speed Index:[N]s
Bundle 体积:
- 总体积:[N]KB(gzip 后)
- 最大 chunk:[名称] [N]KB
- 首屏 JS:[N]KB
已知的慢操作:
[列出已知的慢 API 或慢页面]
技术栈:[Next.js / Vite / etc.]
请:
1. 识别 Top 3 性能瓶颈
2. 为每个瓶颈提供具体的优化方案
3. 预估每个优化的影响程度
4. 按"投入产出比"排序优化建议
5. 提供可直接使用的代码修改模板 5:数据库查询优化
请优化以下数据库查询:
当前查询代码:
[粘贴 Prisma/Drizzle/SQL 查询代码]
查询执行时间:[N]ms
数据量:约 [N] 条记录
使用场景:[描述这个查询在哪里使用]
当前索引:
[列出相关表的索引]
请:
1. 分析查询的性能问题
2. 建议需要添加的索引
3. 提供优化后的查询代码
4. 如果适合,建议缓存策略
5. 预估优化后的执行时间3. Day 4-5:发布准备
3.1 发布准备总览
发布准备不仅仅是”写个 README”——它是你的产品给世界的第一印象。好的发布准备能让你的 ProductHunt 排名更高、Hacker News 讨论更热烈、早期用户转化率更高。
发布准备清单总览:
Day 4 上午:文档准备
├── README.md(项目说明)
├── CHANGELOG.md(版本记录)
├── LICENSE(开源许可证,如适用)
├── CONTRIBUTING.md(贡献指南,如适用)
└── 隐私政策 + 服务条款
Day 4 下午:视觉资产
├── 产品截图(桌面端 + 移动端)
├── 演示视频(60-90 秒)
├── Logo 和品牌资产
├── Open Graph 图片(社交分享预览)
└── Favicon 和 App Icon
Day 5 上午:Landing Page 最终优化
├── 文案打磨
├── CTA 优化
├── SEO 优化
├── 性能验证
└── 社交分享预览测试
Day 5 下午:发布平台准备
├── ProductHunt 页面准备
├── Hacker News 帖子草稿
├── Twitter/X 发布线程
├── Reddit 帖子草稿
└── 邮件通知模板3.2 发布准备工具推荐
| 工具 | 用途 | 价格 | 适用场景 |
|---|---|---|---|
| v0.dev | Landing Page 生成 | 免费(基础)/ $20/月 | AI 生成 React Landing Page |
| OBS Studio | 屏幕录制 | 免费 | 录制产品演示视频 |
| Screen Studio | Mac 屏幕录制 | $89 一次性 | 高质量产品演示(自动缩放、动效) |
| Tella | 产品演示录制 | 免费(基础)/ $15/月 | 浏览器内录制,自动美化 |
| Canva | 图片设计 | 免费(基础)/ $13/月 Pro | 社交媒体图片、OG 图片 |
| Figma | 设计资产 | 免费(基础)/ $15/月 | Logo、截图美化、品牌资产 |
| CleanShot X | Mac 截图工具 | $29 一次性 | 高质量产品截图(带背景、阴影) |
| Typefully | Twitter 线程编辑 | 免费(基础)/ $12/月 | 编写和排期 Twitter 发布线程 |
| Beehiiv | 邮件营销 | 免费(2500 订阅者) | 发送产品发布邮件通知 |
| Ship(ProductHunt) | PH 预发布页 | 免费 | 在 ProductHunt 上收集早期关注 |
3.3 操作步骤:Day 4 上午——文档准备
步骤 1:编写 README.md(1 小时)
README 是你的产品在 GitHub 上的”门面”。一个好的 README 能在 30 秒内让访客理解你的产品是什么、为什么有用、如何开始使用。
# README.md 模板
## [产品名] — [一句话描述]
[一段话描述产品解决什么问题,为谁解决]
[](ph-url)
[](license-url)
### ✨ 核心功能
- 🚀 **功能 1**:一句话描述
- 🎯 **功能 2**:一句话描述
- 🔒 **功能 3**:一句话描述
### 📸 截图
[产品截图,桌面端 + 移动端]
### 🚀 快速开始
#### 前置条件
- Node.js 20+
- pnpm 9+
#### 安装
```bash
git clone https://github.com/you/project.git
cd project
pnpm install
cp .env.example .env.local
pnpm dev环境变量
| 变量 | 描述 | 必需 |
|---|---|---|
| DATABASE_URL | 数据库连接字符串 | ✅ |
| NEXT_PUBLIC_APP_URL | 应用 URL | ✅ |
🏗️ 技术栈
- 前端:Next.js 15 + TypeScript + Tailwind CSS
- 后端:Next.js Server Actions + Prisma
- 数据库:PostgreSQL(Supabase)
- 部署:Vercel
- AI:Claude API
📄 License
MIT License - 详见 LICENSE
README 编写原则:
- 30 秒规则:访客在 30 秒内能理解产品是什么
- 截图优先:一张好截图胜过千言万语
- 快速开始:3 步以内能跑起来
- 不要过度:MVP 阶段不需要详尽的 API 文档
- 保持更新:README 要与产品同步
#### 步骤 2:编写 CHANGELOG.md(30 分钟)
```markdown
# CHANGELOG.md 模板
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/),
and this project adheres to [Semantic Versioning](https://semver.org/).
## [1.0.0] - 2026-XX-XX
### Added
- 用户注册和登录(GitHub OAuth + 邮箱密码)
- Dashboard 仪表板(统计卡片 + 最近活动)
- 核心功能 A(简要描述)
- 核心功能 B(简要描述)
- 支付集成(Stripe,支持月付/年付)
- 邮件通知(审查完成通知 + 每周摘要)
- 响应式设计(桌面端 + 移动端)
- 暗色模式支持
### Security
- 所有 API 端点需要认证
- 输入验证(Zod schema)
- CSRF 保护
- Rate limiting# 用 AI 从 Git 历史生成 CHANGELOG
# 提供 git log 给 AI,让它整理成 CHANGELOG 格式
git log --oneline --since="4 weeks ago" > /tmp/git-log.txt
# 然后将内容提供给 AI 整理3.4 操作步骤:Day 4 下午——视觉资产准备
步骤 3:产品截图(1 小时)
产品截图清单:
必需截图(5-8 张):
├── 1. Hero 截图:产品最核心的界面(桌面端全屏)
├── 2. Dashboard 截图:数据展示界面
├── 3. 核心功能截图 1:最重要的功能在使用中
├── 4. 核心功能截图 2:第二重要的功能
├── 5. 移动端截图:手机上的界面
├── 6. 设置页面截图:展示可配置性
└── 7. 暗色模式截图(如果支持)
截图规格:
├── 桌面端:1920×1080 或 2560×1440
├── 移动端:375×812(iPhone)或 390×844
├── 格式:PNG(清晰)或 WebP(体积小)
├── 背景:使用渐变背景或 mockup 框架
└── 标注:可以添加简短的功能说明文字
截图美化技巧:
├── 使用 CleanShot X 或 Screenshot.rocks 添加设备框架
├── 使用 Canva 添加渐变背景和文字标注
├── 确保截图中有真实的示例数据(不是空状态)
├── 避免截图中出现个人信息或敏感数据
└── 保持截图风格一致(相同的背景色、字体、间距)用 AI 生成截图中的示例数据:
提示词:
"请为一个 [产品类型] 生成逼真的示例数据,用于产品截图。
需要:
- 5 个用户名(英文,看起来真实)
- 10 条示例记录(与产品功能相关)
- 统计数据(看起来合理的数字)
- 避免使用 'test'、'example'、'demo' 等词
- 数据要看起来像真实使用中的产品"步骤 4:录制演示视频(1.5 小时)
演示视频是 ProductHunt 和 Landing Page 上转化率最高的元素。一个好的 60-90 秒演示视频能让用户快速理解产品价值。
演示视频制作流程:
1. 写脚本(15 分钟)
├── 开头(10 秒):一句话说明产品解决什么问题
├── 演示(50-60 秒):展示 3-4 个核心功能
├── 结尾(10 秒):CTA("立即试用")
└── 总时长:60-90 秒
2. 准备环境(10 分钟)
├── 清理浏览器(关闭无关标签、隐藏书签栏)
├── 设置分辨率(1920×1080)
├── 使用示例数据填充产品
├── 关闭通知(勿扰模式)
└── 准备好要展示的操作流程
3. 录制(30 分钟,多次尝试)
├── 使用 Screen Studio(Mac)或 OBS(跨平台)
├── 录制 2-3 次,选最好的
├── 操作要流畅,不要犹豫
├── 鼠标移动要平滑
└── 每个功能展示后短暂停顿
4. 后期处理(30 分钟)
├── 剪掉多余的等待时间
├── 添加文字标注(功能名称)
├── 添加背景音乐(可选,使用免版税音乐)
├── 添加片头和片尾
├── 导出:MP4,1080p,30fps
└── 压缩到 < 50MB(ProductHunt 限制)
视频脚本模板:
"[产品名] 让你 [核心价值]。
看看它是怎么工作的:
首先,[操作 1]...
然后,[操作 2]...
最后,[操作 3]...
就这么简单。立即在 [网址] 开始使用。"步骤 5:准备 Open Graph 图片和品牌资产(30 分钟)
品牌资产清单:
□ Open Graph 图片(社交分享预览)
├── 尺寸:1200×630px
├── 内容:产品名 + 一句话描述 + 截图
├── 用于:Twitter/X、Facebook、LinkedIn 分享预览
└── 工具:Canva / Figma
□ Favicon
├── favicon.ico(16×16, 32×32)
├── apple-touch-icon.png(180×180)
├── android-chrome-192x192.png
├── android-chrome-512x512.png
└── 工具:realfavicongenerator.net
□ Logo 变体
├── 全彩 Logo(SVG + PNG)
├── 白色 Logo(用于深色背景)
├── 图标版 Logo(正方形,用于头像)
└── 工具:Figma / Canva
□ ProductHunt 资产
├── Gallery 图片:最多 8 张(1270×760px 推荐)
├── Thumbnail:240×240px
├── Maker 头像:清晰的个人照片
└── 视频:MP4,< 50MB3.5 操作步骤:Day 5 上午——Landing Page 最终优化
步骤 6:Landing Page 文案打磨(1 小时)
Landing Page 结构(2026 高转化模板):
1. Hero Section
├── 标题:一句话说明产品价值(不超过 10 个词)
├── 副标题:解释如何实现(1-2 句话)
├── CTA 按钮:明确的行动号召("免费开始" / "立即试用")
├── 社交证明:用户数、评分、知名客户 Logo
└── Hero 图片/视频:产品截图或演示视频
2. Problem Section
├── 描述目标用户的痛点(3 个)
├── 让用户产生共鸣:"你是否也遇到过..."
└── 过渡到解决方案
3. Solution / Features Section
├── 3-5 个核心功能
├── 每个功能:图标 + 标题 + 一句话描述 + 截图
└── 强调差异化优势
4. Social Proof Section
├── 用户评价(如果有)
├── 使用数据("已有 X 用户使用")
├── 媒体报道(如果有)
└── 集成伙伴 Logo
5. Pricing Section
├── 2-3 个定价方案
├── 突出推荐方案
├── 免费试用 CTA
└── FAQ(常见问题)
6. Final CTA Section
├── 重复核心价值主张
├── 大按钮 CTA
└── 降低风险:"免费试用,无需信用卡"
7. Footer
├── 链接:隐私政策、服务条款、联系方式
├── 社交媒体链接
└── 版权信息Landing Page 文案优化原则:
1. 标题要具体,不要模糊
❌ "更好的工作方式"
✅ "用 AI 在 5 分钟内完成代码审查"
2. 用数字说话
❌ "节省大量时间"
✅ "平均节省 3 小时/周的代码审查时间"
3. 面向用户利益,不是功能
❌ "支持 15 种编程语言"
✅ "无论你用什么语言,都能立即开始"
4. CTA 要明确
❌ "了解更多"
✅ "免费开始 — 无需信用卡"
5. 减少摩擦
├── "30 秒注册"
├── "无需信用卡"
├── "随时取消"
└── "免费方案永久可用"步骤 7:SEO 基础优化(30 分钟)
SEO 优化清单:
□ Meta 标签
├── <title>:包含核心关键词,< 60 字符
├── <meta name="description">:包含价值主张,< 160 字符
├── <meta property="og:title">:社交分享标题
├── <meta property="og:description">:社交分享描述
├── <meta property="og:image">:社交分享图片(1200×630)
├── <meta name="twitter:card">:summary_large_image
└── <link rel="canonical">:规范 URL
□ 结构化数据
├── Organization schema
├── Product schema(如果是 SaaS)
├── FAQ schema(如果有 FAQ 部分)
└── 使用 JSON-LD 格式
□ 技术 SEO
├── sitemap.xml 已生成
├── robots.txt 配置正确
├── 所有页面可被爬虫访问
├── 移动端友好(响应式设计)
├── HTTPS 已启用
├── 页面加载速度 < 2 秒
└── 无死链(404 页面)
□ 内容 SEO
├── H1 标签包含核心关键词
├── 图片有 alt 属性
├── 内部链接结构合理
└── URL 结构清晰(/pricing, /features, /docs)// Next.js SEO 配置示例
// app/layout.tsx
import type { Metadata } from 'next'
export const metadata: Metadata = {
title: 'CodeLens — AI 代码审查,5 分钟搞定',
description:
'用 AI 自动审查 Pull Request,发现 Bug、安全漏洞和代码异味。支持 15+ 语言,零配置开始。',
openGraph: {
title: 'CodeLens — AI 代码审查',
description: '用 AI 自动审查 Pull Request,5 分钟搞定。',
url: 'https://codelens.dev',
siteName: 'CodeLens',
images: [
{
url: 'https://codelens.dev/og-image.png',
width: 1200,
height: 630,
alt: 'CodeLens 产品截图',
},
],
locale: 'zh_CN',
type: 'website',
},
twitter: {
card: 'summary_large_image',
title: 'CodeLens — AI 代码审查',
description: '用 AI 自动审查 Pull Request,5 分钟搞定。',
images: ['https://codelens.dev/og-image.png'],
},
robots: {
index: true,
follow: true,
},
}3.6 操作步骤:Day 5 下午——发布平台准备
步骤 8:ProductHunt 发布准备(1.5 小时)
ProductHunt 是开发者工具和 SaaS 产品最重要的发布平台之一。2026 年,一次成功的 ProductHunt 发布仍然能带来数千名早期用户和大量高质量反馈。
ProductHunt 发布准备清单:
□ 提前 2 周
├── 创建 ProductHunt Maker 账号
├── 创建 Ship 预发布页面(收集关注者)
├── 在社交媒体预告即将发布
└── 联系 5-10 个可能支持你的人
□ 发布前 1 天
├── 准备 ProductHunt 页面内容:
│ ├── Tagline:一句话描述(< 60 字符)
│ ├── Description:详细描述(2-3 段)
│ ├── Gallery:5-8 张截图 + 演示视频
│ ├── Topics:选择 3-5 个相关话题
│ ├── Links:产品 URL、GitHub(如开源)
│ └── Maker Comment:第一条评论(你的故事)
├── 准备 Maker Comment 草稿
├── 准备社交媒体发布内容
└── 设置闹钟(太平洋时间 12:01 AM 发布)
□ 发布日
├── 太平洋时间 12:01 AM 发布
├── 立即发布 Maker Comment
├── 通知邮件列表和社交媒体
├── 全天回复评论和问题
├── 监控产品状态和错误日志
└── 记录数据:访问量、注册数、反馈
□ 发布后
├── 感谢所有支持者
├── 整理用户反馈
├── 修复紧急 Bug
└── 写发布复盘ProductHunt Tagline 示例:
❌ 差的 Tagline:
├── "一个很棒的工具"(太模糊)
├── "AI 驱动的解决方案"(没有具体价值)
└── "下一代平台"(空洞)
✅ 好的 Tagline:
├── "AI code reviews in 5 minutes, not 5 hours"
├── "Ship faster with automated PR feedback"
└── "Zero-config code review for small teams"
公式:[动词] + [具体结果] + [差异化]Maker Comment 模板:
"Hi Product Hunt! 👋
I'm [你的名字], the solo founder of [产品名].
**Why I built this:**
[1-2 句话描述你遇到的问题]
**What it does:**
[2-3 句话描述产品如何解决问题]
**What makes it different:**
- [差异化 1]
- [差异化 2]
- [差异化 3]
**Built with:**
[技术栈简述]
**Special offer for PH:**
[ProductHunt 专属优惠,如果有]
I'd love to hear your feedback! Happy to answer any questions. 🙏"步骤 9:Hacker News 发布准备(30 分钟)
Hacker News Show HN 准备:
帖子格式:
Show HN: [产品名] – [一句话描述]
帖子内容(简洁!HN 用户不喜欢营销语言):
"[产品名] 是 [简短描述]。
我做这个是因为 [真实的动机/痛点]。
技术栈:[列出关键技术]
[产品 URL]
欢迎反馈和建议。"
HN 发布技巧:
├── 时间:美东时间上午 8-10 点(工作日)
├── 标题:技术性、具体、不夸张
├── 内容:简洁、真诚、技术导向
├── 回复:快速、详细、谦虚地回复每条评论
├── 避免:营销语言、求赞、过度推销
└── 关键:HN 社区重视技术深度和真诚度
Show HN 帖子存活数据(2025 研究):
├── 51% 的帖子在 30 分钟内从首页消失
├── 只有 1% 的帖子能在首页停留一周
├── 关键:前 1-2 小时的互动决定帖子命运
└── 策略:发布后全力回复评论,保持活跃度步骤 10:社交媒体发布准备(30 分钟)
Twitter/X 发布线程模板:
Tweet 1(Hook):
"我用 6 周时间,一个人做了 [产品名]。
从想法到上线,全程用 AI 辅助。
这是我的故事 🧵"
Tweet 2(问题):
"[描述你遇到的问题]
现有的解决方案要么太贵,要么太复杂。
我决定自己做一个。"
Tweet 3(解决方案):
"[产品名] 可以 [核心功能]。
✅ [优势 1]
✅ [优势 2]
✅ [优势 3]
[产品截图]"
Tweet 4(技术栈):
"技术栈:
- [前端]
- [后端]
- [数据库]
- [AI 工具]
全程 Spec-Driven 开发,AI 辅助编码。"
Tweet 5(数据):
"一些数据:
- 开发时间:6 周
- 代码行数:~[N]K 行
- 测试覆盖率:[N]%
- 月成本:$[N]"
Tweet 6(CTA):
"现在可以免费试用 👇
[产品 URL]
如果觉得有用,转发让更多人看到 🙏
#buildinpublic #indiehacker"Reddit 发布策略:
适合的 Subreddit:
├── r/SideProject — 展示个人项目
├── r/startups — 创业相关讨论
├── r/webdev — Web 开发相关
├── r/programming — 编程相关(技术深度要求高)
├── r/[你的垂直领域] — 目标用户聚集的社区
└── r/indiehackers — 独立开发者社区
Reddit 帖子原则:
├── 先贡献价值,再推广产品
├── 分享你的构建过程和学到的经验
├── 真诚地寻求反馈,不是单纯推销
├── 回复每一条评论
└── 遵守每个 subreddit 的规则步骤 11:邮件通知准备(30 分钟)
发布通知邮件模板:
主题:[产品名] 正式上线了!🚀
正文:
Hi [名字],
感谢你之前的关注![产品名] 今天正式上线了。
[产品名] 可以帮你 [核心价值]:
✅ [功能 1]
✅ [功能 2]
✅ [功能 3]
🎁 作为早期关注者,你可以享受 [专属优惠]。
👉 立即试用:[产品 URL]
如果你觉得有用,希望你能:
- 在 ProductHunt 上给我们投票:[PH URL]
- 分享给可能需要的朋友
有任何问题或建议,直接回复这封邮件即可。
谢谢!
[你的名字]3.7 提示词模板
模板 6:README 生成
请为我的项目生成一个高质量的 README.md:
项目名称:[名称]
一句话描述:[描述]
核心功能:
1. [功能 1]
2. [功能 2]
3. [功能 3]
技术栈:[列出技术栈]
安装步骤:[列出安装命令]
环境变量:[列出需要的环境变量]
许可证:[MIT / Apache 2.0 / etc.]
要求:
1. 简洁但完整
2. 包含 badge(如果适用)
3. 包含截图占位符
4. 快速开始部分 3 步以内
5. 使用 emoji 增加可读性
6. 英文编写(面向国际用户)模板 7:ProductHunt 发布内容生成
请为我的产品生成 ProductHunt 发布内容:
产品名称:[名称]
核心价值:[一句话]
目标用户:[描述]
核心功能:
1. [功能 1]
2. [功能 2]
3. [功能 3]
差异化优势:[与竞品的区别]
技术栈:[简述]
我的背景:[简述]
请生成:
1. Tagline(< 60 字符,英文)
2. Description(2-3 段,英文)
3. Maker Comment(第一条评论,英文,真诚不营销)
4. 5 个 Topic 建议
5. Twitter 发布线程(6 条推文)模板 8:Landing Page 文案优化
请优化我的 Landing Page 文案:
当前文案:
[粘贴当前文案]
产品信息:
- 产品名:[名称]
- 目标用户:[描述]
- 核心价值:[一句话]
- 竞品:[列出 2-3 个竞品]
- 差异化:[与竞品的区别]
优化要求:
1. 标题要具体,包含数字或具体结果
2. 副标题解释"如何实现"
3. CTA 按钮文案要有行动力
4. 功能描述面向用户利益而非技术特性
5. 添加社交证明元素
6. 减少摩擦("免费"、"无需信用卡"、"30 秒注册")
7. 保持简洁,每段不超过 3 句话实战案例:CodeLens AI 代码审查工具的第 5 周
案例背景
延续前几周的案例——全栈开发者正在构建 CodeLens,一个面向中小团队的 AI 代码审查工具。第 3-4 周已完成全部核心功能(GitHub 集成、AI 审查引擎、Dashboard、设置、支付、邮件通知)。现在进入第 5 周的测试与打磨。
Day 1:单元测试补充 + PBT
09:00-09:15 评估测试覆盖率
├── 运行 pnpm test:run --coverage
├── 结果:整体覆盖率 58%,核心逻辑 65%
├── 识别低覆盖率文件:
│ ├── review-engine.ts:45%(AI 审查核心逻辑)
│ ├── webhook-handler.ts:52%(GitHub Webhook 处理)
│ ├── billing.ts:48%(Stripe 支付逻辑)
│ └── diff-parser.ts:60%(代码 diff 解析)
└── 制定补充计划:优先补充核心逻辑测试
09:15-11:00 补充单元测试
├── review-engine.ts:
│ ├── 测试 AI 响应解析的各种格式
│ ├── 测试超时和重试逻辑
│ ├── 测试 token 限制处理
│ └── 覆盖率提升到 88%
├── webhook-handler.ts:
│ ├── 测试签名验证(有效/无效/缺失)
│ ├── 测试各种 GitHub 事件类型
│ ├── 测试并发 Webhook 处理
│ └── 覆盖率提升到 85%
└── 发现 1 个 Bug:Webhook 签名验证在 payload 包含
Unicode 字符时失败 → 立即修复
11:00-12:00 PBT 属性测试
├── diff-parser.ts:
│ ├── 属性:解析后的行数 = 原始 diff 的行数
│ ├── 属性:所有解析结果的文件路径非空
│ ├── 属性:添加行数 + 删除行数 = 总变更行数
│ └── 发现 Bug:空 diff 导致解析器崩溃 → 修复
├── billing.ts:
│ ├── 属性:折扣后价格 <= 原价
│ ├── 属性:年付价格 < 12 × 月付价格
│ └── 属性:免费方案的价格始终为 0
└── 所有 PBT 通过,覆盖率提升到 72%Day 2:集成测试 + E2E + 手动测试
09:00-11:00 集成测试
├── 完整的 PR 审查流程测试:
│ ├── 模拟 GitHub Webhook → 触发审查 → 生成评论 → 回写 GitHub
│ ├── 测试大 PR(100+ 文件)的处理
│ ├── 测试审查失败时的错误恢复
│ └── 测试并发审查请求
├── 支付流程集成测试:
│ ├── 模拟 Stripe Webhook → 更新订阅状态
│ ├── 测试订阅过期 → 降级到免费方案
│ └── 测试支付失败 → 重试通知
└── 发现 2 个 Bug:
├── Bug 1:并发审查时数据库死锁 → 添加重试逻辑
└── Bug 2:订阅过期后仍能发起审查 → 添加权限检查
11:00-12:00 E2E 测试
├── 流程 1:新用户注册 → 连接 GitHub → 首次审查
├── 流程 2:查看审查结果 → 标记已解决 → 查看统计
├── 流程 3:升级到付费方案 → 验证配额增加
├── 流程 4:移动端完整操作流程
└── 所有 E2E 测试通过
13:00-15:00 手动测试
├── 视觉检查:发现 3 个 UI 问题
│ ├── 暗色模式下代码高亮颜色对比度不足
│ ├── 移动端侧边栏关闭按钮太小
│ └── 长文件名在审查列表中溢出
├── 交互检查:发现 1 个问题
│ └── 快速连续点击"开始审查"会重复提交
├── 内容检查:发现 2 个问题
│ ├── 404 页面缺少返回首页链接
│ └── 邮件模板中的 Logo 在 Outlook 中不显示
└── 全部修复完成
15:00-16:00 质量门检查
├── TypeScript 编译:✅ 零错误
├── ESLint:✅ 零警告
├── 单元测试:✅ 156 个测试全部通过
├── PBT:✅ 12 个属性测试全部通过
├── E2E:✅ 4 个流程全部通过
├── 覆盖率:✅ 整体 76%,核心逻辑 91%
├── 构建:✅ 成功,无警告
└── 结论:所有质量门通过 ✅Day 3:性能优化
09:00-09:30 基线测量
├── Lighthouse 分数:
│ ├── 首页:82(LCP 2.8s,INP 190ms,CLS 0.03)
│ ├── Dashboard:65(LCP 4.2s,INP 280ms,CLS 0.18)
│ └── 定价页:91(LCP 1.6s,INP 110ms,CLS 0.01)
├── Bundle 体积:520KB(gzip 后)
│ ├── 最大 chunk:vendor.js 310KB
│ └── 首屏 JS:210KB
└── API 响应时间:
├── 审查列表:450ms(慢!)
├── 审查详情:280ms
└── Dashboard 统计:380ms
09:30-11:00 前端性能优化
├── 图片优化:
│ ├── Hero 图片转 WebP,体积减少 60%
│ ├── 添加 priority 属性到首屏图片
│ └── LCP 改善:2.8s → 1.9s ✅
├── 代码分割:
│ ├── 代码编辑器组件动态 import
│ ├── 图表库动态 import
│ └── 首屏 JS:210KB → 140KB ✅
├── CLS 修复:
│ ├── Dashboard 统计卡片添加 skeleton
│ ├── 审查列表添加固定高度占位
│ └── CLS:0.18 → 0.04 ✅
└── 字体优化:
├── 添加 font-display: swap
├── 预加载关键字体
└── LCP 进一步改善
11:00-12:00 后端性能优化
├── 审查列表 API:
│ ├── 添加数据库索引(user_id + created_at)
│ ├── 限制返回字段(去掉 review_content 大字段)
│ ├── 添加 Redis 缓存(TTL 2 分钟)
│ └── 响应时间:450ms → 85ms ✅
├── Dashboard 统计 API:
│ ├── 预计算统计数据(每小时更新)
│ ├── 添加缓存
│ └── 响应时间:380ms → 45ms ✅
└── 审查详情 API:
├── 使用 select 限制返回字段
└── 响应时间:280ms → 120ms ✅
13:00-14:00 优化后验证
├── Lighthouse 分数(优化后):
│ ├── 首页:95(LCP 1.6s,INP 130ms,CLS 0.01)✅
│ ├── Dashboard:88(LCP 2.1s,INP 160ms,CLS 0.04)✅
│ └── 定价页:97(LCP 1.2s,INP 90ms,CLS 0.00)✅
├── Bundle 体积:380KB(gzip 后)→ 减少 27% ✅
└── 所有 API 响应时间 < 200ms ✅Day 4-5:发布准备
Day 4 上午:文档
├── README.md:用 AI 生成初稿 → 手动打磨 → 添加截图
├── CHANGELOG.md:从 Git 历史生成 → 整理格式
├── 隐私政策 + 服务条款:用 AI 生成模板 → 法律审查
└── API 文档:自动生成(从 TypeScript 类型)
Day 4 下午:视觉资产
├── 产品截图:8 张(桌面 5 + 移动 3)
│ ├── 使用 CleanShot X 截图
│ ├── 使用 Canva 添加背景和标注
│ └── 填充逼真的示例数据
├── 演示视频:75 秒
│ ├── 用 Screen Studio 录制
│ ├── 展示:连接 GitHub → 自动审查 → 查看结果
│ └── 添加文字标注和背景音乐
├── OG 图片:1200×630px
└── Favicon 和 App Icon
Day 5 上午:Landing Page
├── 文案优化:
│ ├── 标题:"AI Code Reviews in 5 Minutes, Not 5 Hours"
│ ├── 副标题:"Automated PR feedback that catches bugs,
│ │ security issues, and code smells. Zero config."
│ └── CTA:"Start Free — No Credit Card Required"
├── SEO 优化:meta 标签、结构化数据、sitemap
├── 性能验证:Lighthouse 97 分
└── 社交分享预览测试:Twitter、LinkedIn、Slack
Day 5 下午:发布平台
├── ProductHunt 页面:
│ ├── Tagline:"AI code reviews in 5 min, not 5 hours"
│ ├── Description:3 段描述
│ ├── Gallery:8 张截图 + 演示视频
│ ├── Maker Comment:草稿完成
│ └── 发布时间:下周二太平洋时间 12:01 AM
├── Hacker News Show HN 帖子草稿
├── Twitter 发布线程(6 条推文)
├── Reddit 帖子草稿(r/webdev, r/SideProject)
├── 邮件通知模板(给 127 个早期关注者)
└── 所有发布材料准备完毕 ✅案例分析
第 5 周成果总结:
测试成果:
├── 发现并修复 8 个 Bug(3 个严重、5 个轻微)
├── 测试覆盖率:58% → 76%(核心逻辑 91%)
├── 156 个单元测试 + 12 个 PBT + 4 个 E2E
└── 所有质量门通过
性能优化成果:
├── Lighthouse 分数:65-82 → 88-97
├── LCP:2.8-4.2s → 1.2-2.1s
├── Bundle 体积:520KB → 380KB(-27%)
├── API 响应时间:280-450ms → 45-120ms
└── 所有 Core Web Vitals 达标
发布准备成果:
├── README.md + CHANGELOG.md
├── 8 张产品截图 + 75 秒演示视频
├── Landing Page 优化完成(Lighthouse 97)
├── ProductHunt + HN + Twitter + Reddit 材料就绪
├── 127 个早期关注者的邮件通知就绪
└── 准备好下周发布
关键经验:
├── PBT 发现了 2 个手动测试不会发现的边界 Bug
├── 性能优化的 80% 收益来自 20% 的改动(图片 + 索引 + 缓存)
├── AI 辅助生成发布材料节省了约 4 小时
├── 手动测试仍然不可替代(发现了 6 个 UI/UX 问题)
└── 质量门机制确保了发布信心避坑指南
❌ 常见错误
-
跳过测试直接发布
- 问题:上线后用户发现严重 Bug,第一印象被毁。ProductHunt 发布只有一次机会,带着 Bug 发布等于浪费了最重要的曝光窗口。研究表明,51% 的 Show HN 帖子在 30 分钟内从首页消失——你没有第二次机会修复后重新发布
- 正确做法:至少花 2 天做系统性测试。建立质量门标准,所有门通过才能发布。宁可延迟一周发布,也不要带着已知的严重 Bug 上线
-
过度追求 100% 测试覆盖率
- 问题:花 3 天写测试,只剩 2 天做其他事。为 getter/setter、简单的 UI 组件、配置文件写测试是浪费时间。100% 覆盖率不等于零 Bug
- 正确做法:核心业务逻辑 > 90%,整体 > 70% 即可。把时间花在高风险代码的测试上:支付逻辑、权限检查、数据转换。用 PBT 自动发现边界情况,比手写 100 个用例更高效
-
凭直觉优化性能
- 问题:花 2 小时优化一个只有 50ms 的 API,而忽略了 4 秒的首屏加载。没有数据支撑的优化往往是在错误的地方花时间
- 正确做法:先测量,再优化。用 Lighthouse 和 Bundle Analyzer 找到真正的瓶颈。按”影响程度 × 修复成本”排序,优先做高影响低成本的优化
-
忽略移动端测试
- 问题:桌面端完美,移动端一塌糊涂。2026 年超过 60% 的 Web 流量来自移动设备,Google 也以移动端 Core Web Vitals 作为主要排名信号
- 正确做法:在真实手机上测试(不只是 Chrome DevTools 的模拟器)。至少测试 iPhone Safari 和 Android Chrome。确保触摸目标 > 44px,文字可读,表单可用
-
发布材料草率准备
- 问题:截图模糊、演示视频卡顿、文案空洞。ProductHunt 上的竞争非常激烈,粗糙的展示会让你的产品淹没在众多发布中
- 正确做法:截图要用真实数据、专业背景。演示视频要流畅、有节奏、60-90 秒。文案要具体、有数字、面向用户利益。花 1 天时间准备视觉资产是值得的投资
-
Landing Page 只关注设计不关注转化
- 问题:页面很漂亮但没有明确的 CTA,用户不知道下一步该做什么。或者 CTA 太多,用户选择困难
- 正确做法:每个页面只有一个主要 CTA。CTA 按钮要醒目、文案要有行动力(“免费开始”而非”了解更多”)。减少摩擦(“无需信用卡”、“30 秒注册”)。在首屏就展示 CTA
-
不做社交分享预览测试
- 问题:在 Twitter 上分享链接,预览图是空白或者裁剪错误。OG 图片尺寸不对,描述被截断
- 正确做法:在发布前用 Twitter Card Validator、Facebook Sharing Debugger、LinkedIn Post Inspector 测试分享预览。确保 OG 图片 1200×630px,标题 < 60 字符,描述 < 160 字符
✅ 最佳实践
-
测试优先级:核心逻辑 > 集成点 > UI
- 核心业务逻辑(支付、权限、数据处理)必须有完整测试
- API 集成点(第三方服务、Webhook)需要集成测试
- UI 组件只测试关键交互,不测试样式
-
PBT 是 Solo Developer 的秘密武器
- 一个人没有 QA 团队帮你找边界 Bug
- PBT 自动生成数百个测试用例,发现你想不到的边界情况
- 特别适合数据转换、计算逻辑、验证规则
-
性能优化遵循 80/20 法则
- 80% 的性能提升来自 20% 的改动
- 图片优化、代码分割、数据库索引——这三项通常能解决大部分问题
- 不要过早优化,先让功能正确,再让它快
-
发布准备是营销的一部分
- 好的截图和演示视频能让转化率翻倍
- ProductHunt 的 Maker Comment 是你讲故事的机会
- Build in Public 的内容(开发过程、数据、经验)比产品介绍更吸引人
-
质量门机制保证发布信心
- 定义明确的质量标准(覆盖率、性能分数、零错误)
- 所有门通过才能发布
- 这不是官僚主义,是给自己的信心保障
-
AI 辅助但不替代人工判断
- AI 生成测试用例 → 你审查测试是否有意义
- AI 分析性能瓶颈 → 你决定优化优先级
- AI 生成发布文案 → 你打磨语气和准确性
- AI 是加速器,不是自动驾驶
相关资源与延伸阅读
- Vitest 官方文档 — TypeScript 测试框架完整指南,包含配置、API 参考和最佳实践
- Playwright 官方文档 — E2E 测试框架,支持跨浏览器和移动端模拟
- fast-check 官方文档 — JavaScript/TypeScript 属性基测试库,包含丰富的生成器和示例
- web.dev Core Web Vitals — Google 官方的 Core Web Vitals 优化指南和最新标准
- Product Hunt Launch Checklist (2026) — 最新的 ProductHunt 发布清单和策略指南(2026 年更新)
- Show HN Survival Study — 基于 605 个 Show HN 帖子的数据分析,揭示前页存活规律
- Keep a Changelog — CHANGELOG 编写规范和最佳实践
- Unlighthouse — 全站批量 Lighthouse 审计工具,一次扫描所有页面
- SaaS Landing Page Trends 2026 — 2026 年 SaaS Landing Page 设计趋势和真实案例
- Qodo(原 CodiumAI) — AI 驱动的代码测试生成工具,自动分析代码行为生成测试用例
参考来源
- Radical.fm - Top 10 Automation Testing Tools 2026 (2026 年 1 月)
- WeTest - AI Testing Tools That Save QA Time in 2026 (2026 年 1 月)
- ACCELQ - Best AI Testing Frameworks 2026 (2025 年 12 月)
- Digital Applied - Core Web Vitals AI Optimization 2026 (2026 年 1 月)
- DebugBear - 2025 In Review: Web Performance (2025 年 12 月)
- DoWhatMatter - Product Hunt Launch Checklist 2026 (2026 年 1 月)
- Asof.app - Show HN Survival Study (2025 年 12 月)
- SaaSFrame - SaaS Landing Page Trends 2026 (2026 年 1 月)
- Upskillist - Best AI Coding Assistant Tools 2026 (2025 年 12 月)
- Endor Labs - Test-First Prompting for Secure AI Code (2025 年 12 月)
Content was rephrased for compliance with licensing restrictions.
📖 返回 总览与导航 | 上一节:第3-4周:Spec-Driven开发 | 下一节:第6周:上线与运营启动