代码生成提示词最佳实践:让 AI 写出生产级代码

HTMLPAGE 团队
14 分钟阅读

系统讲解如何编写高质量的代码生成提示词,涵盖函数生成、组件开发、测试编写等常见场景

#提示词 #代码生成 #AI 编程 #最佳实践

代码生成的提示词困境

你是否经历过:

  • AI 生成的代码跑不起来
  • 风格和项目完全不搭
  • 缺少错误处理和边界情况
  • 类型不完整或者直接用 any

这些问题的根源往往不在 AI,而在提示词。本文分享我总结的代码生成提示词模板和技巧。

提示词结构框架

一个好的代码生成提示词包含以下要素:

[技术栈] + [功能描述] + [输入输出] + [约束条件] + [示例/参考]

基础模板

## 技术栈
- 语言: TypeScript
- 框架: Vue 3 Composition API
- 状态管理: Pinia
- UI 库: Element Plus

## 功能描述
实现一个 [具体功能]

## 输入参数
- param1: 类型 - 说明
- param2: 类型 - 说明

## 输出结果
- 返回值类型
- 副作用说明

## 约束条件
- 必须使用 async/await
- 需要完整的错误处理
- 遵循 ESLint 规范

## 参考示例
[提供类似功能的代码片段]

函数生成场景

场景 1:工具函数

## 需求
实现日期格式化函数

## 输入
- date: Date | string | number - 日期对象或时间戳
- format: string - 格式模板,如 'YYYY-MM-DD HH:mm:ss'

## 输出
- string - 格式化后的日期字符串

## 格式占位符
- YYYY: 四位年份
- MM: 两位月份(补零)
- DD: 两位日期(补零)
- HH: 24小时制(补零)
- mm: 分钟(补零)
- ss: 秒(补零)

## 边界情况
- 无效日期返回空字符串
- null/undefined 返回空字符串

## 示例
formatDate(new Date('2024-01-15'), 'YYYY年MM月DD日')
// => '2024年01月15日'

场景 2:异步数据处理

## 需求
实现带缓存和重试的请求函数

## 技术要求
- TypeScript 严格模式
- 使用泛型支持类型推断

## 功能点
1. 支持请求结果缓存(可配置过期时间)
2. 失败自动重试(可配置次数和间隔)
3. 支持请求取消
4. 并发请求去重(相同 URL 只发一次)

## 接口设计
\`\`\`typescript
interface RequestOptions<T> {
  url: string
  method?: 'GET' | 'POST'
  data?: unknown
  cache?: {
    enabled: boolean
    ttl: number // 毫秒
  }
  retry?: {
    times: number
    delay: number
  }
}

function request<T>(options: RequestOptions<T>): Promise<T>
\`\`\`

## 请给出完整实现,包含单元测试用例

组件生成场景

Vue 组件模板

## 组件名称
SearchSelect - 可搜索的下拉选择器

## 技术栈
- Vue 3.4+ <script setup> 语法
- TypeScript
- Element Plus 风格(但不依赖 Element Plus)
- Tailwind CSS

## Props
| 属性 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| modelValue | string \| number | - | 选中值,支持 v-model |
| options | Option[] | [] | 选项列表 |
| placeholder | string | '请选择' | 占位文字 |
| searchable | boolean | true | 是否可搜索 |
| clearable | boolean | true | 是否可清空 |
| disabled | boolean | false | 是否禁用 |
| loading | boolean | false | 加载状态 |

## Events
| 事件 | 参数 | 说明 |
|------|------|------|
| update:modelValue | value | 值变化 |
| search | keyword | 搜索输入 |
| change | value, option | 选中变化 |

## 类型定义
\`\`\`typescript
interface Option {
  label: string
  value: string | number
  disabled?: boolean
}
\`\`\`

## 功能要求
1. 点击展开下拉
2. 输入关键词实时过滤
3. 键盘上下选择,回车确认
4. 点击外部关闭
5. 过渡动画

## 样式要求
- 宽度自适应父容器
- 下拉最大高度 300px,超出滚动
- 搜索无结果显示"暂无数据"

React 组件模板

## 组件名称
DataTable - 数据表格

## 技术栈
- React 18+
- TypeScript
- Tailwind CSS
- 无第三方依赖

## Props 接口
\`\`\`typescript
interface Column<T> {
  key: keyof T | string
  title: string
  width?: number | string
  align?: 'left' | 'center' | 'right'
  sortable?: boolean
  render?: (value: unknown, record: T, index: number) => ReactNode
}

interface DataTableProps<T extends Record<string, unknown>> {
  columns: Column<T>[]
  data: T[]
  rowKey: keyof T
  loading?: boolean
  bordered?: boolean
  striped?: boolean
  onRowClick?: (record: T, index: number) => void
  onSort?: (key: string, order: 'asc' | 'desc' | null) => void
}
\`\`\`

## 功能要求
1. 列宽支持固定和自适应
2. 点击表头排序(升序/降序/无)
3. loading 时显示骨架屏
4. 空数据显示占位图
5. 行 hover 效果

## 性能要求
- 使用 React.memo 优化
- 大数据量考虑虚拟滚动

测试生成场景

单元测试模板

## 被测试函数
\`\`\`typescript
// 粘贴需要测试的函数代码
\`\`\`

## 测试框架
Vitest + @testing-library/vue

## 测试要求
1. 覆盖正常情况
2. 覆盖边界情况
3. 覆盖异常情况
4. 每个测试用例有清晰的描述

## 输出格式
\`\`\`typescript
describe('函数名', () => {
  describe('正常情况', () => {
    it('应该...当...', () => {})
  })
  
  describe('边界情况', () => {
    it('应该...当输入为空', () => {})
  })
  
  describe('异常情况', () => {
    it('应该抛出错误当...', () => {})
  })
})
\`\`\`

E2E 测试模板

## 测试页面
用户登录页面

## 测试框架
Playwright

## 测试场景

### 正常登录流程
1. 访问登录页
2. 输入正确的用户名和密码
3. 点击登录按钮
4. 验证跳转到首页
5. 验证用户信息显示正确

### 登录失败场景
1. 密码错误
2. 用户不存在
3. 账户被锁定

### 边界场景
1. 空用户名提交
2. 空密码提交
3. 表单验证提示

## 请生成完整的测试代码

重构提示词技巧

代码优化

## 原始代码
\`\`\`typescript
// 粘贴需要优化的代码
\`\`\`

## 优化目标
1. 减少嵌套层级
2. 提取复用逻辑
3. 改善可读性
4. 添加类型标注

## 约束条件
- 保持功能不变
- 保持接口兼容
- 不引入新依赖

## 请输出
1. 优化后的代码
2. 每处优化的说明

拆分大文件

## 原始文件
\`\`\`typescript
// 粘贴大文件内容
\`\`\`

## 拆分要求
将这个 500 行的组件拆分为:
1. 主组件(处理布局和组合)
2. 子组件(UI 展示)
3. composable(业务逻辑)
4. 工具函数(通用逻辑)
5. 类型定义(独立文件)

## 文件组织
\`\`\`
components/
├── UserProfile/
│   ├── index.vue         # 主组件
│   ├── UserAvatar.vue    # 子组件
│   ├── UserStats.vue     # 子组件
│   └── types.ts          # 类型定义
composables/
└── useUserProfile.ts     # 业务逻辑
utils/
└── userHelper.ts         # 工具函数
\`\`\`

避免常见错误

❌ 错误:描述太模糊

帮我写一个表格组件

✅ 正确:具体详细

实现一个数据表格组件:
- 支持 columns 和 data 两个必填 props
- columns 包含 key, title, width, render 字段
- 支持表头点击排序
- 使用 Tailwind CSS
- 包含 loading 和 empty 状态

❌ 错误:一次要求太多

写一个完整的后台管理系统,包含用户、权限、菜单、日志...

✅ 正确:分步推进

第一步:设计系统的路由结构和目录规范
(等待输出后再请求下一步)

❌ 错误:不说明技术栈

写一个下拉选择器

✅ 正确:明确技术选型

使用 Vue 3 Composition API + TypeScript 实现下拉选择器,
样式使用 Tailwind CSS,不依赖任何 UI 框架

高级技巧

1. 提供参考实现

## 需求
实现一个 useDebounce composable

## 参考实现
类似 VueUse 的 useDebounceFn,但需要:
- 支持取消
- 支持立即执行选项
- 返回 pending 状态

## VueUse 用法参考
\`\`\`typescript
const debouncedFn = useDebounceFn(() => {
  // ...
}, 1000)
\`\`\`

2. 错误示例反向约束

## 需求
实现用户表单验证

## 不要这样做
\`\`\`typescript
// 不要用 any
const validate = (form: any) => {...}

// 不要硬编码错误信息
if (!form.name) return '名称不能为空'
\`\`\`

## 应该这样做
- 使用泛型保证类型安全
- 错误信息支持 i18n
- 验证规则可配置

3. 版本约束

## 环境要求
- Node.js: >= 18
- Vue: 3.4+
- TypeScript: 5.x
- Vite: 5.x

## 注意事项
- 使用 Vue 3.4 的 defineModel 宏
- 不使用已废弃的 API
- 兼容 ESM 和 CommonJS

总结

好的代码生成提示词 = 精准的需求描述 + 完整的上下文 + 明确的约束条件

核心原则:

  1. 具体化:避免模糊表述
  2. 结构化:使用模板组织信息
  3. 示例化:提供参考代码或输入输出
  4. 约束化:说明边界和限制
  5. 迭代化:复杂任务分步完成

相关文章推荐: