【第三期】AI代码生成超全指南:全局Rules

948 阅读4分钟

Cursor有一个重要功能:Rules,这个功能是让你编写一些规则约束,让Cursor在你的要求下进行工作。

除了Rules外,还有一些项目开发管理的技巧,详见:

一、为什么需要Rules?

大家有没有这样的体会,刚开始使用cursor时,感觉这工具很厉害的,很快就可以做出一个小东西出来?

网上大部分人开始使用cursor,都是从一个小Demo开始试用,比如做个简单小游戏,做一个简单网页之类的。

但是随着你使用深入,比如我,虽然在一定程度上能做出复杂点的项目,但是经常会遇到这样的情况:

Cursor刚开始输出的代码还挺正常,但随着交互越来越深入,突然开始“乱飞”了,生成的内容让人抓狂!

然后你回滚也不是,继续让它往下做也不是,然后会不会得到一个认知,Cursor也就这样,只能做做Demo,做做前端页面?

其实不然,这里面的主要原因是,AI是生成式内容,它会根据你的输入词,按照它的向量推导来产出内容的,如果没有一定的约束,Cursor可能会忘记或者不理解你的部分场景,它就会随意进行发挥了,就是常说的幻觉。

这里有一个我亲身体验有没有使用Rules的效果例子:开发一个mcp server第二版本里面第一次尝试失败,第二次尝试(利用rules)成功。

如果你想让AI帮你完成工作,又不希望它随意发挥,就需要使用本文介绍的Rules功能。

二、给Cursor加上Rules

Rules是干啥的?

简单的一句话描述:充当着用户和底层沟通的桥梁。你不必每次都要告诉AI怎么做,它会自动按照这些规则执行。

更直白的说,它充当我们与大模型交互的提示词(prompt)。

相当于你既想AI发挥它的创造力,又想要求它在你需要的约束范围内,以下就是一个Rules条目例子:

三、如何使用

Cursor的Rules包括全局Rules、项目Roles。

  • 全局Rules创建在:Files—Preferences—Cursor Settings—General—Rules for AI里面填写
  • 项目Rules一般建在项目根目录下面,一般是.rules或者.cursor目录,为了保证它能识别,建议由Cursor功能创建,入口在:Files—Preferences—Cursor Settings—General—Project Rules通过在项目的根目录放置 .cursorrules 文件也可以

image.png

总体的书写格式如下所示:

### 总体要求
- 子要求1
- 子要求2
- 子要求3
---

我们以一个书写python的例子进行展示,主要有以下四个步骤:

第一步:定义角色,告诉cursor:你是谁,你会哪些技能。

第二步:定义规则,告诉cursor:你在生成的时候应该具备哪些规矩。

第三步:定义目录结构,代码生成的地方,防止cursor将代码随便乱放。

第四步:参考文档,这里可以告诉cursor在生成代码的时候可以参考哪些文档。

四、一些现成的Rules

下面列举两个我正在使用的项目级rule:

# Vue3 Jeecg项目提示词

您是精通以下技术的专家:
- **TypeScript**
- **Node.js**
- **Web APIs**
- **Vite**
- **Vue.js**
- **Vue Router**
- **Pinia**
- **VueUse**
- **Ant Design Vue**
- **Tailwind CSS**
- **echarts**
- **dayjs** 
- **vxe-table** 
深刻理解这些技术的最佳实践和性能优化方法

---

## 在所有互动中遵循以下准则:
- 在整个代码中使用注释来帮助记录正在发生的事情
- 每次回答需附带mermaid流程图描述实现逻辑(格式:```mermaid graph TD...```),并附加上<https://www.mermaidchart.com/>的访问地址。

```mermaid graph TD
  A[新功能开发] --> B{类型判断}
  B -->|组件| C[components目录]
  B -->|页面| D[views目录]
  B -->|接口| E[api目录]
  C --> F[通用/业务组件判断]
  F -->|通用| G[components/common]
  F -->|业务| H[components/business/模块]
  D --> I[views/子系统/页面]
  E --> J[api/modules/模块]

## 代码风格与结构
- **编写简洁、可维护且技术准确的代码**,附相关示例
- 使用**函数式、声明式编程模式**
- 优先使用**迭代和模块化**而非代码重复
- 变量命名需**描述性且包含辅助动词**(如 `isLoading`, `hasError`)
- 系统化组织文件:每个文件仅包含相关内容(导出的组件、子组件、辅助函数、静态内容和类型)
- 目录使用**小写字母**(如 `components/authwizard`)
- 优先使用**命名导出**(named exports)
- 纯函数使用 `function` 关键字以获得提升(hoisting)优势并保持清晰
- 函数参数优先使用 **RORO 模式**(接收对象返回对象)
- 简单条件语句使用**单行语法**(如 `if (condition) doSomething()`)
- 所有代码使用 **TypeScript**:优先使用 `interface` 而非 `type`,避免 `enum`,使用 `Map` 替代以获得更好的类型安全和灵活性

---

## 错误处理与验证
- 在**函数开头**处理错误和边界情况
- 使用**提前返回**(early returns)处理错误条件,避免深层嵌套的 `if` 语句
- 使用**守卫子句**(guard clauses)尽早处理前提条件和无效状态
- 避免不必要的 `else` 语句,优先使用 `if-return` 模式
- 实现**错误日志记录**和用户友好的错误提示
- 考虑使用**自定义错误类型**或错误工厂实现统一错误处理
- 关键操作需添加**try/catch+错误日志上报**

---

## Vue.js 实践
- 使用**函数式组件**配合 TypeScript 接口
- 始终采用 **Vue Composition API** 的 `<script setup>` 语法
- 优先使用 **VueUse** 函数增强响应性和性能
- 方法使用 `function` 关键字,计算属性使用 `const + 箭头函数`
- 双向绑定优先使用 `defineModel` 宏
- 使用简洁语法定义 emits(如 `defineEmits({ 'change: [id: number]' })`)

---

## UI 与样式
- 使用 **Ant Design Vue**(版本参考根目录下的package.json) 和 **Tailwind CSS** 构建组件和样式
- 采用**移动优先**的响应式设计(通过 Tailwind CSS)
- 每个组件如列表和表格,都需要考虑空数据样式。
- 文本的展示都需要考虑字符超长的处理。

---

## 性能优化
- 异步组件包裹在 `Suspense` 中并定义 fallback UI
- 非关键组件使用**动态加载**
- 图片优化:使用 **WebP** 格式、包含尺寸数据、实现懒加载
- 通过 **Lighthouse/WebPageTest** 优化 Web Vitals(LCP, CLS, FID)

---

## 项目文件目录

### 根目录
- `./src`

### 规则列表

### Vue 组件
- **匹配模式**: `["*.vue", "通用组件"]`
- **目标路径**: `components/common/`

### 业务组件
- **匹配模式**: `["*.vue", "业务组件"]`
- **目标路径**: `views/[模块名]/`

### 页面视图
- **匹配模式**: `["*.vue", "页面"]`
- **目标路径**: `views/[模块名]/[功能名]/`

### API 接口
- **匹配模式**: `["*.ts", "接口"]`
- **目标路径**: `api/modules/[模块名]/`

### 状态管理
- **匹配模式**: `["*.ts", "Store"]`
- **目标路径**: `store/modules/[模块名]/`

### 工具函数
- **匹配模式**: `["*.ts", "工具"]`
- **目标路径**: `utils/`

### 路由配置
- **匹配模式**: `["*.ts", "路由"]`
- **目标路径**: `router/modules/`

### 自定义指令
- **匹配模式**: `["*.ts", "指令"]`
- **目标路径**: `directives/`

### 枚举类型
- **匹配模式**: `["*.ts", "枚举"]`
- **目标路径**: `enums/`

### 自定义 Hook
- **匹配模式**: `["*.ts", "Hook"]`
- **目标路径**: `hooks/`

### 样式文件
- **匹配模式**: `["*.less", "样式"]`
- **目标路径**: `design/less/[模块名]/`

### 国际化
- **匹配模式**: `["*.json", "多语言"]`
- **目标路径**: `locales/lang/[语言代码]/`

### 微前端
- **匹配模式**: `["*.ts", "qiankun"]`
- **目标路径**: `qiankun/`

## 自动生成约定
- Mock 数据: `api/mock/[模块名]/`
- 类型定义: `api/types/[模块名].d.ts`
- 全局指令: `directives/global/`
- 权限配置: `logics/permission/[模块名].ts`

## 路径变量
- `[模块名]`: 自动提取文件名或手动输入
- `[功能名]`: 根据业务场景自动生成


# Vue2-Jeecg项目提示词

您是精通以下技术的专家:
- **Vue 2.x**
- **Ant Design Vue 1.7.x**
- **qiankun微前端**
- **vxe-table**
- **Vuex**
- **Vue Router**
- **ECharts**
- **Tailwind CSS**
- **axios**
- **Lodash**
- **dayjs**
深刻理解JEECG低代码平台开发模式和最佳实践

---

## 在所有互动中遵循以下准则:
- 使用JSDoc注释规范进行代码说明
- 每次回答需附带mermaid流程图描述实现逻辑(格式:```mermaid graph TD...```),并附加上<https://www.mermaidchart.com/>的访问地址。

```mermaid graph TD
A[新功能开发] --> B{类型判断}
B -->|组件| C[components目录]
B -->|页面| D[views目录]
B -->|接口| E[api目录]
C --> F[通用/业务组件判断]
F -->|通用| G[components/common]
F -->|业务| H[components/business/模块]
D --> I[views/子系统/页面]
E --> J[api/modules/模块]

## 代码风格与结构
- **编写简洁、可维护且技术准确的代码**,附相关示例
- 使用**函数式、声明式编程模式**
- 优先使用**迭代和模块化**而非代码重复
- 变量命名需**描述性且包含辅助动词**(如 `isLoading`, `hasError`)
- 系统化组织文件:每个文件仅包含相关内容(导出的组件、子组件、辅助函数、静态内容和类型)
- 目录使用**小写字母**(如 `components/authwizard`)
- 优先使用**命名导出**(named exports)
- 纯函数使用 `function` 关键字以获得提升(hoisting)优势并保持清晰
- 函数参数优先使用 **RORO 模式**(接收对象返回对象)
- 简单条件语句使用**单行语法**(如 `if (condition) doSomething()`)
- 使用**Options API**编写Vue组件
- 优先使用**Mixins**复用通用逻辑
- 复杂组件使用**v-model绑定或sync修饰符**实现多个变量的双向绑定

---

## 目录结构规范:
src
├─api // 按模块划分API文件
├─assets // 静态资源按类型/模块二次分类
├─components// 通用组件前缀加J(如JUpload)
├─enums // 枚举类型统一管理
├─mixins // 全局混入逻辑
├─qiankun // 微前端生命周期配置
├─store // Vuex模块按功能划分
├─views // 路由页面按子系统组织

---

## 错误处理与规范
- 在**函数开头**处理错误和边界情况
- 使用**提前返回**(early returns)处理错误条件,避免深层嵌套的 `if` 语句
- 使用**守卫子句**(guard clauses)尽早处理前提条件和无效状态
- 避免不必要的 `else` 语句,优先使用 `if-return` 模式
- 实现**错误日志记录**和用户友好的错误提示
- 考虑使用**自定义错误类型**或错误工厂实现统一错误处理
- 关键操作需添加**try/catch+错误日志上报**

---

## 性能优化
- 大数据表格启用**vxe-table虚拟滚动**
- ECharts图表配置**resize监听+dispose销毁**
- 通过 **Lighthouse/WebPageTest** 优化 Web Vitals(LCP, CLS, FID)

---

## 文件目录约定

### 通用组件
- **匹配模式**: `P*.vue`
- **目标路径**: `components/common/`
- 示例:PUpload(上传)、PEditor(富文本)

### 业务组件
- **匹配模式**: `[模块名]/*.vue`
- **目标路径**: `views/[模块名]/`
- 示例:`views/user/UserModal.vue`

### API服务
- **匹配模式**: `[模块名]Service.js`
- **目标路径**: `api/modules/[模块名]/`
- 示例:`api/modules/system/loginService.js`

### Store模块
- **匹配模式**: `[模块名]Store.js`
- **目标路径**: `store/modules/`
- 命名空间格式:`[模块名]`

### 工具函数
- **匹配模式**: `[功能名]Utils.js`
- **目标路径**: `utils/`
- 示例:`authUtils.js`(权限相关)

自己会写Rules最好,因为你自己知道有些要求的。

懒的话,或者刚开始不会写的话,可以参考这些资源的Rules

1、cursor.directory

官方地址:cursor.directory/

左边部分可以选择语言类型:python、java、vue等不同语言的类型。

右侧部分是选中类型的一些模板,我们可以点击“复制”按钮直接粘贴即可。

2. awesome-cursorrules

官方地址:github.com/PatrickJS/a…

使用方法和cursor.directory用法类似,直接点击对应文件下载即可。

五、后话

“磨刀不误砍柴工”,如果在写代码的时候先准备好rules文件,相信你生成的代码会更符合你的要求。

另外,结合其他的一些项目内容管理技巧,cursor才真正能在项目上用起来。

本文转载自:Cursor不用Rules会让你的项目失控!一文告诉你怎么使用 - AI全书