---
name: frontend-dev
description: 前端开发规范,包含 Vue 3 编码规范、UI 风格约束、TypeScript 规范等
version: v3.0
paths:
- "**/*.vue"
- "**/*.tsx"
- "**/*.jsx"
- "**/*.ts"
- "**/*.js"
- "**/*.css"
- "**/*.scss"
- "**/*.less"
- "**/package.json"
- "**/vite.config.*"
---
# 前端开发规范
> 参考来源: Vue 官方风格指南、Element Plus 最佳实践
---
## UI 风格约束
### 严格禁止(常见 AI 风格)
- ❌ 蓝紫色霓虹渐变、发光描边、玻璃拟态
- ❌ 大面积渐变、过多装饰性几何图形
- ❌ 赛博风、暗黑科技风、AI 风格 UI
- ❌ UI 文案中使用 emoji
### 后台系统(默认风格)
| 要素 | 要求 |
|------|------|
| 主题 | 使用组件库默认主题 |
| 配色 | 黑白灰为主 + 1 个主色点缀 |
| 动效 | 克制,仅保留必要交互反馈 |
---
## 技术栈
| 层级 | Vue(首选) | React(备选) |
|------|------------|--------------|
| 框架 | Vue 3 + TypeScript | React 18 + TypeScript |
| 构建 | Vite | Vite |
| 路由 | Vue Router 4 | React Router 6 |
| 状态 | Pinia | Zustand |
| UI 库 | Element Plus | Ant Design |
---
## Vue 编码规范
### 组件基础
```vue
{{ displayName }}
```
### 命名约定
| 类型 | 约定 | 示例 |
|------|------|------|
| 组件文件 | PascalCase.vue | `UserCard.vue` |
| Composables | useXxx.ts | `useAuth.ts` |
| Store | useXxxStore.ts | `useUserStore.ts` |
---
## 状态管理(Pinia)
```typescript
// stores/user.ts
export const useUserStore = defineStore('user', () => {
const user = ref(null)
const token = ref('')
const isLoggedIn = computed(() => !!token.value)
async function login(username: string, password: string) {
const res = await api.login(username, password)
token.value = res.token
user.value = res.user
}
return { user, token, isLoggedIn, login }
})
```
---
## 交互状态处理
**必须处理的状态**: loading、empty、error、disabled、submitting
```vue
重试
```
---
## TypeScript 规范
```typescript
// types/user.ts
export interface User {
id: number
username: string
role: 'admin' | 'user'
}
export interface ApiResponse {
code: number
message: string
data: T
}
```
---
## 性能优化
| 场景 | 方案 |
|------|------|
| 大列表 | 虚拟滚动 |
| 路由 | 懒加载 `() => import()` |
| 计算 | 使用 `computed` 缓存 |
| 大数据 | 使用 `shallowRef` |
```typescript
// 路由懒加载
const routes = [
{ path: '/dashboard', component: () => import('@/views/Dashboard.vue') }
]
// 请求防抖
import { useDebounceFn } from '@vueuse/core'
const debouncedSearch = useDebounceFn((keyword) => api.search(keyword), 300)
```
---
## 目录结构
```
src/
├── assets/
│ └── styles/ # 全局/共享样式
├── api/ # API 请求
├── components/ # 通用组件
├── composables/ # 组合式函数
├── router/ # 路由配置
├── stores/ # Pinia stores
├── types/ # TypeScript 类型
├── utils/ # 工具函数
├── views/ # 页面组件
├── App.vue
└── main.ts
```
---
## 样式管理规范
| 规则 | 说明 |
|------|------|
| ❌ 禁止在 `.vue` 中写大段样式 | `