发布于 2025 年 5 月 5 日,星期一
MDC(Material Design Components)中Cursor样式的规范与实践应用,包括交互状态下指针形态的设计原则、状态反馈逻辑及无障碍适配要点。核心涉及hover/focus/active等场景的视觉一致性处理,如何通过CSS变量和JavaScript动态控制光标类型以符合Material Design 3的交互标准,并对比默认浏览器行为与MDC定制方案的差异。本质是解析组件库对用户操作意图的视觉传达机制,强调光标变化与功能预期的语义关联性,例如拖拽操作中的grab光标或禁用状态的not-allowed实现细节。
创建 Project Rules 有两种方式,一种是 可视化方式,一种是 手动创建
进入 Cursor 设置页面,点击【General】找到【Project Rules】
点击【Add new rule】,输入规则文件名称
创建完成就可以看到在项目根目录多了一个 .cursor/rules 目录,目录是刚刚创建的 vue3-rules.mdc 文件
在项目根目录创建一个 .cursor/rules 目录(注意是两级目录)或者使用命令行创建
mkdir -p .cursor/rules
在 .cursor/rules 目录下新建 typescript-rules.mdc 文件,内容如下:
---description: TypeScript coding standardsglobs: **/*.ts,**/*.tsx
priority: 1
---
# TypeScript Coding Standards
## 基本规范
- 使用 `const` 而不是 `let` 来声明常量
- 使用 `const` 而不是 `let` 来声明变量
- 使用 2 个空格缩进
- 显式声明函数返回类型
- 使用单引号
- 使用箭头函数
- 使用解构赋值
- 避免使用 `any` 类型
新规则文件采用 .mdc 格式,主要由两部分组成:
常用的 glob 语法规则:
glob 的基本语法非常灵活可以任意组合,我们可以组合出更多满足日常需求的规则
# 多内容匹配\*_/_.{ts, tsx, js}
# 匹配所有 .ts 文件
\*_/_.ts# 排除测试文件!\*_/_.test.ts
# 排除构建目录
!**/dist/** !**/build/**
# 匹配特定目录
src/components/\*_/_.tsx 123456789101112
Project Rules 的规则继承、复用也很简单,就是在一个 .mdc 文件中通过 @file 引入其他规则作为上下文使用
Project Rules 支持根据环境变量设置规则:
---name: develop-rulesdescription: Development environment ruleswhen: ${NODE_ENV} === 'development'---12345
看到有小伙伴将 Project Rules 做了分类管理,如下:
.cursor/rules├─ common│ └─ base.mdc // 通用规则├─ frontend│ ├─ vue3-rules.mdc // 前端vue3规则│ └─ typescript-rules.mdc // 前端ts规则└─ styles └─ less.mdc // 样式less规则
经本人测试该方式不会被系统识别会导致 Project Rules 失效,Cursor 该版本不建议做 Project Rules 分类管理。
官网地址:https://cursor.directory/generatehttps://cursor.directory/generate
cursor.directory 提供了生成 Project Rules 的功能,只需按提示上传文件即可
---name: react-rulesdescription: React project best practices and coding standardsglobs: - 'src/**/*.tsx'
- 'src/**/*.jsx'
- 'src/**/*.ts'
priority: 2
---
# React 项目规范
## 组件规范
### 基础规则
- 使用函数组件 + Hooks 模式
- 组件文件使用 .tsx 扩展名
- 组件名使用 PascalCase 命名
- 文件名与组件名保持一致
### 目录结构
src/ ├── components/ # 通用组件 ├── pages/ # 页面组件 ├── hooks/ # 自定义 hooks ├── utils/ # 工具函数 ├── services/ # API 服务 ├── types/ # TypeScript 类型 └── styles/ # 样式文件
### Hooks 使用规范
- 自定义 Hook 以 `use` 开头
- 避免在循环/条件语句中使用 Hooks
- 合理使用 useMemo 和 useCallback
- 使用 useContext 管理全局状态
### 性能优化
- 合理拆分组件
- 使用 React.memo 避免不必要渲染
- 使用 React.lazy 实现代码分割
- 图片使用 next/image 优化
### TypeScript 集成
- 为 Props 定义接口
- 使用 FC 类型声明组件
- 避免使用 any
- 合理使用泛型
## 状态管理
- 小型项目使用 Context + useReducer
- 大型项目推荐使用 Redux Toolkit
- 遵循不可变数据原则
- 合理划分 state 结构
---name: vue-rulesdescription: Vue.js project best practices and coding standardsglobs: - 'src/**/*.vue'
- 'src/**/*.ts'
priority: 2
---
# Vue 项目规范
## 组件规范
### 基础规则
- 使用 Composition API
- 组件名使用 PascalCase
- Props 定义使用 defineProps
- 事件使用 defineEmits
### 目录结构
src/ ├── components/ # 通用组件 ├── views/ # 页面视图 ├── composables/ # 组合式函数 ├── utils/ # 工具函数 ├── api/ # API 接口 ├── types/ # TypeScript 类型 └── assets/ # 静态资源
### 组合式函数规范
- 以 `use` 开头命名
- 一个函数只做一件事
- 返回响应式数据
- 注意依赖收集
### 性能优化
- 合理使用 computed
- v-show vs v-if
- 使用 defineAsyncComponent
- keep-alive 缓存
### TypeScript 集成
- 使用 defineComponent
- Props 类型声明
- 组件实例类型
- 响应式类型
## 状态管理
- 小型项目使用 provide/inject
- 大型项目使用 Pinia
- 模块化状态管理
- 合理使用 storeToRefs
---name: style-rulesdescription: CSS/LESS/SCSS styling best practicesglobs: - 'src/**/*.css'
- 'src/**/*.less'
- 'src/**/*.scss'
- 'src/**/*.module.*'
priority: 1
---
# 样式规范
## 命名规范
### BEM 命名
- Block: 独立实体
- Element: 使用双下划线 \_\_
- Modifier: 使用双横线 -- .block {} .block\_\_element {} .block--modifier {}
### CSS Modules
- 文件名使用 .module.css
- 类名使用小驼峰
- 避免全局样式
- 合理使用组合
## 目录结构
styles/ ├── global/ # 全局样式 ├── themes/ # 主题文件 ├── variables/ # 变量定义 ├── mixins/ # 混入 └── components/ # 组件样式
## 响应式设计
- 使用相对单位
- 移动优先原则
- 合理使用媒体查询
- 避免固定宽度
### 断点设置
@screen-xs: 480px; @screen-sm: 576px; @screen-md: 768px; @screen-lg: 992px; @screen-xl: 1200px;
## 性能优化
- 避免深层嵌套
- 合理使用选择器
- 压缩和合并
- CSS 代码分割
## 主题定制
- 使用 CSS 变量
- 设计 Token 系统
- 暗黑模式支持
- 主题切换方案
## 最佳实践
- 避免 !important
- 模块化样式
- 注释规范
- 代码复用
首先需要在项目根目录创建规则文件夹:
# 创建规则目录mkdir -p .cursor/rules# 可选:将旧规则文件移动到新目录mv .cursorrules .cursor/rules/general.mdc
新的规则文件采用 .mdc
格式,由两部分组成:
一个完整的规则文件示例:
---name: typescript-rulesdescription: TypeScript coding standards and best practicesglobs: - 'src/**/*.ts'
- 'src/**/*.tsx'
- '!src/**/*.test.ts'
priority: 1
---
# TypeScript Coding Standards
## 基础规范
- 使用 2 空格缩进
- 优先使用 const 声明变量
- 显式声明函数返回类型
## 最佳实践
- 避免 any 类型
- 合理使用泛型
- 接口优于类型别名
## 参考文档
Read more from @common-rules.mdc
推荐按照以下方式组织规则文件:
.cursor/rules/├── common/│ ├── general.mdc # 通用规则│ └── git.mdc # Git 规范├── frontend/│ ├── javascript.mdc # JS 规则│ ├── typescript.mdc # TS 规则│ └── react.mdc # React 规则├── backend/│ ├── node.mdc # Node.js 规则│ └── database.mdc # 数据库规则└── style/ ├── css.mdc # CSS 规则 └── less.mdc # LESS 规则
新系统支持强大的 glob 匹配模式:
globs: # 匹配所有 .ts 文件 - '**/*.ts' # 排除测试文件 - '!**/*.test.ts' # 排除构建目录 - '!**/dist/**' - '!**/build/**' # 匹配特定目录 - 'src/components/**/*.tsx'
常用的 glob 语法:
*
: 匹配任意文件名**
: 匹配任意目录深度!
: 排除匹配{}
: 组合匹配使用 @file
语法引用其他规则:
# React 组件规范继承通用前端规范 @frontend/common.mdc## 特殊规则- 使用函数组件- 采用 Hooks 开发
创建个人专属规则:
# 创建个人规则目录mkdir -p .cursor/rules/personal# 添加到 .gitignoreecho ".cursor/rules/personal/" >> .gitignore
通过 priority
字段控制规则优先级:
---name: override-rulesdescription: Override default rulespriority: 100 # 高优先级规则---
优先级说明:
支持根据环境变量设置规则:
---name: dev-rulesdescription: Development environment ruleswhen: ${NODE_ENV} === 'development'---
创建规则模板便于复用:
---name: rule-templatedescription: Template for new rules
---# ${name} 规范## 基础规则${rules}## 最佳实践${practices}
适合大型团队的规则结构:
.cursor/rules/├── team/ # 团队通用规则├── projects/ # 项目特定规则└── members/ # 成员个性化规则
针对 monorepo 的规则配置:
---name: package-rulesdescription: Rules for specific packageglobs: ['packages/*/src/**/*.ts']---
为不同子应用设置规则:
.cursor/rules/├── main/ # 主应用规则└── sub-apps/ # 子应用规则 ├── app1.mdc └── app2.mdc
迁移时间
.cursorrules
将在未来版本废弃规则冲突
性能考虑
团队协作
---name: react-rulesdescription: React project best practices and coding standardsglobs: - 'src/**/*.tsx'
- 'src/**/*.jsx'
- 'src/**/*.ts'
priority: 2
---
# React 项目规范
## 组件规范
### 基础规则
- 使用函数组件 + Hooks 模式
- 组件文件使用 .tsx 扩展名
- 组件名使用 PascalCase 命名
- 文件名与组件名保持一致
### 目录结构
src/ ├── components/ # 通用组件 ├── pages/ # 页面组件 ├── hooks/ # 自定义 hooks ├── utils/ # 工具函数 ├── services/ # API 服务 ├── types/ # TypeScript 类型 └── styles/ # 样式文件
### Hooks 使用规范
- 自定义 Hook 以 `use` 开头
- 避免在循环/条件语句中使用 Hooks
- 合理使用 useMemo 和 useCallback
- 使用 useContext 管理全局状态
### 性能优化
- 合理拆分组件
- 使用 React.memo 避免不必要渲染
- 使用 React.lazy 实现代码分割
- 图片使用 next/image 优化
### TypeScript 集成
- 为 Props 定义接口
- 使用 FC 类型声明组件
- 避免使用 any
- 合理使用泛型
## 状态管理
- 小型项目使用 Context + useReducer
- 大型项目推荐使用 Redux Toolkit
- 遵循不可变数据原则
- 合理划分 state 结构
---name: vue-rulesdescription: Vue.js project best practices and coding standardsglobs: - 'src/**/*.vue'
- 'src/**/*.ts'
priority: 2
---
# Vue 项目规范
## 组件规范
### 基础规则
- 使用 Composition API
- 组件名使用 PascalCase
- Props 定义使用 defineProps
- 事件使用 defineEmits
### 目录结构
src/ ├── components/ # 通用组件 ├── views/ # 页面视图 ├── composables/ # 组合式函数 ├── utils/ # 工具函数 ├── api/ # API 接口 ├── types/ # TypeScript 类型 └── assets/ # 静态资源
### 组合式函数规范
- 以 `use` 开头命名
- 一个函数只做一件事
- 返回响应式数据
- 注意依赖收集
### 性能优化
- 合理使用 computed
- v-show vs v-if
- 使用 defineAsyncComponent
- keep-alive 缓存
### TypeScript 集成
- 使用 defineComponent
- Props 类型声明
- 组件实例类型
- 响应式类型
## 状态管理
- 小型项目使用 provide/inject
- 大型项目使用 Pinia
- 模块化状态管理
- 合理使用 storeToRefs
---name: style-rulesdescription: CSS/LESS/SCSS styling best practicesglobs: - 'src/**/*.css'
- 'src/**/*.less'
- 'src/**/*.scss'
- 'src/**/*.module.*'
priority: 1
---
# 样式规范
## 命名规范
### BEM 命名
- Block: 独立实体
- Element: 使用双下划线 \_\_
- Modifier: 使用双横线 --
.block {} .block\_\_element {} .block--modifier {}
### CSS Modules
- 文件名使用 .module.css
- 类名使用小驼峰
- 避免全局样式
- 合理使用组合
## 目录结构
styles/ ├── global/ # 全局样式 ├── themes/ # 主题文件 ├── variables/ # 变量定义 ├── mixins/ # 混入 └── components/ # 组件样式
## 响应式设计
- 使用相对单位
- 移动优先原则
- 合理使用媒体查询
- 避免固定宽度
### 断点设置
@screen-xs: 480px; @screen-sm: 576px; @screen-md: 768px; @screen-lg: 992px; @screen-xl: 1200px;
## 性能优化
- 避免深层嵌套
- 合理使用选择器
- 压缩和合并
- CSS 代码分割
## 主题定制
- 使用 CSS 变量
- 设计 Token 系统
- 暗黑模式支持
- 主题切换方案
## 最佳实践
- 避免 !important
- 模块化样式
- 注释规范
- 代码复用