feat: 初始化提交
# Vite + Vue3 项目规范
## 目录
- [项目结构规范](/NewLife/cube-front/Blob/master/docs/#项目结构规范)
- [文件命名规范](/NewLife/cube-front/Blob/master/docs/#文件命名规范)
- [Vue组件规范](/NewLife/cube-front/Blob/master/docs/#Vue组件规范)
- [JavaScript/TypeScript规范](/NewLife/cube-front/Blob/master/docs/#JavaScriptTypeScript规范)
- [CSS/SCSS规范](/NewLife/cube-front/Blob/master/docs/#CSS/SCSS规范)
- [注释规范](/NewLife/cube-front/Blob/master/docs/#注释规范)
- [性能优化规范](/NewLife/cube-front/Blob/master/docs/#性能优化规范)
- [错误处理规范](/NewLife/cube-front/Blob/master/docs/#错误处理规范)
- [安全规范](/NewLife/cube-front/Blob/master/docs/#安全规范)
- [单元测试规范](/NewLife/cube-front/Blob/master/docs/#单元测试规范)
- [Git提交规范](/NewLife/cube-front/Blob/master/docs/#Git提交规范)
- [国际化规范](/NewLife/cube-front/Blob/master/docs/#国际化规范)
- [可访问性(A11y)规范](/NewLife/cube-front/Blob/master/docs/#可访问性A11y规范)
- [构建与部署规范](/NewLife/cube-front/Blob/master/docs/#构建与部署规范)
## 项目结构规范
```
cube-front/
├── public/ # 静态资源目录
├── src/
│ ├── api/ # API接口定义
│ ├── assets/ # 项目资源文件
│ │ ├── icons/ # 图标
│ │ ├── images/ # 图片
│ │ └── styles/ # 全局样式
│ ├── components/ # 公共组件
│ │ ├── base/ # 基础组件
│ │ └── business/ # 业务组件
│ ├── composables/ # 组合式函数
│ ├── config/ # 配置文件
│ ├── constants/ # 常量定义
│ ├── directives/ # 自定义指令
│ ├── hooks/ # 自定义钩子
│ ├── layouts/ # 布局组件
│ ├── plugins/ # 插件
│ ├── router/ # 路由配置
│ ├── store/ # 状态管理
│ ├── types/ # 类型定义
│ ├── utils/ # 工具函数
│ ├── views/ # 页面视图
│ ├── App.vue # 根组件
│ ├── main.ts # 入口文件
│ └── env.d.ts # 环境变量类型声明
├── tests/ # 测试文件
├── .env # 环境变量
├── .eslintrc.js # ESLint配置
├── .prettierrc.js # Prettier配置
├── tsconfig.json # TypeScript配置
├── vite.config.ts # Vite配置
└── package.json # 项目依赖
```
### 目录说明
- **api**: 按模块划分API请求
- **components**:
- **base**: 基础UI组件,不包含业务逻辑
- **business**: 包含业务逻辑的可复用组件
- **composables**: 可复用的组合式函数
- **views**: 按模块/功能划分的页面组件
## 文件命名规范
### 文件夹命名
- 使用kebab-case(短横线)命名法
- 例如:`user-management`,`data-analysis`
### 文件命名
1. **Vue组件文件**:
- 使用PascalCase(帕斯卡)命名法
- 例如:`UserProfile.vue`,`DataTable.vue`
- 基础组件以`Base`为前缀,如`BaseButton.vue`
- 单例组件以`The`为前缀,如`TheHeader.vue`
2. **TypeScript文件**:
- 普通工具类文件使用kebab-case,如`date-utils.ts`
- 类文件使用PascalCase,如`UserService.ts`
- 类型定义文件使用`.d.ts`后缀,且使用PascalCase,如`ApiResponse.d.ts`
3. **样式文件**:
- 使用kebab-case,如`main-theme.scss`
- 组件私有样式与组件同名,如`UserProfile.scss`
4. **测试文件**:
- 使用与被测试文件相同的命名方式,后缀`.spec.ts`或`.test.ts`
- 例如:`UserProfile.spec.ts`
## Vue组件规范
### 组件结构
```vue
<template>
<!-- 模板内容 -->
</template>
<script setup lang="ts">
// 导入
import { ref } from 'vue'
import type { PropType } from 'vue'
// 类型定义
// Props定义
const props = defineProps({
propName: {
type: String as PropType<string>,
required: true,
default: '',
},
})
// Emits定义
const emit = defineEmits<{
(e: 'update', value: string): void
(e: 'submit'): void
}>()
// 响应式状态
const count = ref(0)
// 计算属性
// 方法定义
// 生命周期钩子
// 侦听器
</script>
<style scoped lang="scss">
/* 组件样式 */
</style>
```
### Props规范
- 必须使用对象形式定义props,指定类型、默认值、是否必须等
- TypeScript项目中使用PropType指定复杂类型
- Props命名使用camelCase
### 事件命名
- 使用kebab-case命名事件
- 使用语义化名称,如`update:modelValue`、`item-click`
### 组件通信
- 父子组件:Props down, Events up
- 跨层级组件:Provide/Inject或状态管理
- 避免使用事件总线
## JavaScript/TypeScript规范
### TypeScript类型规范
- 使用TypeScript类型系统
- 对于复杂类型,使用TypeScript类型别名
- 对于函数参数和返回值,使用TypeScript类型定义
- 对于类型导入,使用type关键字,如`import { type User } from './types'`
### JavaScript/TypeScript命名规范
1. **变量命名**:
- 使用camelCase
- 布尔值类型变量使用`is`、`has`、`can`等前缀
- 例如:`userName`、`isVisible`、`hasPermission`
2. **常量命名**:
- 使用UPPER_SNAKE_CASE
- 例如:`MAX_COUNT`、`API_BASE_URL`
3. **函数命名**:
- 使用camelCase
- 动词开头,表明操作
- 例如:`getUserInfo()`、`handleSubmit()`
4. **类和接口命名**:
- 使用PascalCase
- 例如:`UserService`、`DataModel`
- 接口名不要使用`I`前缀,例如使用`User`而非`IUser`
5. **类型命名**:
- 使用PascalCase
- 例如:`UserInfo`、`ApiResponse`
### 函数规范
- 一个函数只做一件事
- 函数参数不超过3个,多参数使用对象传递
- 使用函数声明式而非函数表达式
- 为什么推荐使用函数声明式而非函数表达式
- 函数声明式和函数表达式是JavaScript中定义函数的两种主要方式:
```javascript
// 函数声明式
function doSomething() {
// 函数体
}
// 函数表达式
const doSomething = function() {
// 函数体
};
```
- 函数声明式的优势
1. **变量提升(Hoisting)** - 函数声明会被提升到当前作用域顶部,允许在代码中任何位置调用,而函数表达式必须先定义后使用
2. **代码可读性** - 函数声明在视觉上更容易识别为一个函数,开头的`function`关键字立即表明这是一个函数定义
3. **调试友好** - 在错误堆栈跟踪中,函数声明会显示函数名,而匿名函数表达式则不会
4. **语义明确** - 函数声明更清晰地表达"这是一个独立功能单元"的意图,而不是一个变量被赋予了函数值
5. **维护性** - 在大型项目中使用一致的函数定义方式有助于代码维护
6. **自文档化** - 函数声明总是强制命名,提高了代码的自解释性
- 避免副作用,保持函数纯净
### 异步处理
- 优先使用async/await代替Promise链
- 正确处理错误,使用try/catch
- 避免回调地狱
## CSS/SCSS规范
### CSS/SCSS命名规范
- 多个单词使用短横线(kebab-case)连接
- 例如:`.card`,`.card-title`,`.user-profile-section`
### 样式结构
- 避免深层次嵌套,最好不超过3层
- 组件样式使用`scoped`或CSS Module
- 全局样式放在assets/styles目录下
### 变量使用
- 颜色、字体、间距等使用CSS变量(变量文件放在styles/variables下)
- 避免硬编码值
## 注释规范
### 文件顶部注释
```typescript
/**
* 文件描述
* @author 作者名
* @date 2023-01-01
*/
```
### 函数注释
```typescript
/**
* 函数描述
* @param {string} param1 - 参数1描述
* @param {number} param2 - 参数2描述
* @returns {boolean} 返回值描述
*/
function example(param1: string, param2: number): boolean {
// 函数实现
}
```
### 复杂逻辑注释
- 对于复杂的业务逻辑,添加必要的注释
- 注释解释"为什么"这样做,而不是"做了什么"
## 性能优化规范
### Vue组件优化
- 合理使用`v-if`和`v-show`
- 使用`keep-alive`缓存组件状态
- 大型列表使用虚拟滚动
- 避免深层次的响应式对象
- 组件中使用`shallowRef`和`shallowReactive`来优化非递归监听场景
### 懒加载和代码分割
- 路由组件使用动态导入实现懒加载
```typescript
const routes = [
{
path: '/user',
component: () => import('./views/User.vue')
}
]
```
- 大型组件库按需导入
- 图片资源使用懒加载
### 构建优化
- 生产环境启用代码压缩和tree-shaking
- 使用现代模式构建(`modern mode`)
- 优化依赖大小,定期审查并移除未使用的依赖
## 错误处理规范
### 前端错误
- 实现全局错误处理
- 对可预见的错误进行优雅降级
- 使用`try/catch`捕获异步操作错误
### 错误监控
- 集成错误监控系统(如Sentry)
- 记录用户操作路径,便于复现问题
- 设置错误严重程度,区分处理
## 安全规范
### 数据处理
- 所有用户输入必须验证和消毒
- 使用`v-html`时必须确保内容安全
- 不在前端存储敏感信息
- API响应数据使用TypeScript类型限制,避免运行时错误
### 认证与授权
- 敏感操作必须二次验证
- 实现合理的RBAC权限控制
- 使用HTTPS,确保Cookie设置`Secure`和`HttpOnly`标志
## 单元测试规范
### 测试覆盖
- 业务组件的核心功能必须有单元测试
- 工具函数必须有单元测试
- 最低测试覆盖率要求:70%
### 测试内容
- 组件测试:渲染结果、事件交互、Props验证
- 工具函数测试:边界情况、异常处理
- 复杂逻辑:分支覆盖
### 测试技术
- 使用Vue Test Utils测试组件
- 使用Vitest进行单元测试
- 使用Cypress进行端到端(E2E)测试
- 使用JSDOM模拟浏览器环境进行组件测试
- 单元测试命令:`pnpm test:unit`
- E2E测试命令:
- 生产模式:`pnpm test:e2e`
- 开发模式:`pnpm test:e2e:dev`
### 测试最佳实践
- 单元测试应该快速且独立,不依赖外部服务
- 使用Mock函数模拟API调用和第三方服务
- 为异步组件编写测试时使用`flushPromises`
- 组件测试应聚焦于组件API而非实现细节
- E2E测试应覆盖关键用户流程和业务场景
- 使用测试驱动开发(TDD)方法开发核心功能
## Git提交规范
- 使用Angular提交规范
- 格式:`<type>(<scope>): <subject>`
- 类型(type):
- feat: 新功能
- fix: 修复bug
- docs: 文档更新
- style: 代码风格修改
- refactor: 重构
- test: 测试相关
- chore: 构建过程或辅助工具变更
### 示例
```
feat(user): 添加用户认证功能
fix(api): 修复数据请求超时问题
docs(readme): 更新安装说明
```
## 国际化规范
### 文本管理
- 所有用户可见的文本必须使用i18n
- 禁止在代码中硬编码文本
- 使用命名空间组织翻译键名
### 格式规范
- 翻译键名使用点符号层次结构,如`user.profile.title`
- 包含变量的文本使用命名参数,如`{name}已登录`
- 日期、数字、货币等使用i18n格式化函数
## 可访问性(A11y)规范
### 语义化HTML
- 使用正确的HTML标签表达内容含义
- 表单控件必须有关联的`label`
- 图片必须有`alt`属性
### 键盘导航
- 所有交互元素必须可通过键盘访问
- 合理使用`tabindex`属性
- 实现合适的焦点管理
### 颜色与对比度
- 确保文本与背景色对比度符合WCAG标准(最低4.5:1)
- 不仅使用颜色传达信息(考虑色盲用户)
## 构建与部署规范
### 环境配置
- 使用`.env`文件区分开发/测试/生产环境
- 环境变量必须以`VITE_`前缀
- 敏感配置不应提交到代码库
### 部署流程
- 使用CI/CD自动化部署
- 发布前必须通过所有测试
- 实现灰度发布或A/B测试机制
## 代码审查清单
- [ ] 代码是否符合项目规范
- [ ] 是否有重复代码可以优化
- [ ] 是否有潜在的性能问题
- [ ] 是否有适当的错误处理
- [ ] 是否有必要的注释
- [ ] 是否编写了测试
|