Files
portal-mini-front/.codebuddy/rules/01-code-style.md
T
2026-10-25 23:14:53 +08:00

2.9 KiB
Raw Blame History

description, globs, alwaysApply
description globs alwaysApply
TypeScript / Vue3 通用编码规范,适用于所有 .ts / .vue / .scss 文件
src/**/*.{ts,vue,js,scss,css}
true

编码规范

TypeScript

  1. 禁止 any。不确定类型用 unknown 后收窄,或定义显式类型;实在无法确定的第三方数据用 Record<string, unknown>。
  2. 业务数据结构必须有 显式 interface,统一放在 src/types/,命名 XxxVO / XxxForm / XxxQuery,不内联在组件里。
  3. 使用 import type { Xxx } from '@/types/xxx' 导入纯类型,避免运行时冗余引入。
  4. 枚举统一定义在 src/enums/,使用 const 对象 + as const 或 enum,禁止散落的魔法字符串/数字。
  5. 空值处理优先用可选链 ?. 与空值合并 ??,避免多层 && 嵌套。
  6. 不允许使用 // @ts-ignore、eslint-disable 掩盖问题;确有必要的必须写清原因。

Vue 组件

  1. 组件一律 <script setup lang="ts">,禁止 Options API。
  2. defineProps / defineEmits 必须带类型:
    const props = defineProps<{ modelValue: string; disabled?: boolean }>()
    const emit = defineEmits<{ (e: 'update:modelValue', v: string): void }>()
    
  3. Props 命名 camelCase,模板中绑定用 kebab-case;禁止在子组件内直接修改 props。
  4. 单向数据流:子组件通过 emit 或 defineExpose 暴露方法,父组件通过 ref 调用。
  5. 响应式选择:基础数据用 ref,对象表单用 reactive;禁止对 reactive 整体重新赋值,需要重置时用 Object.assign。
  6. 副作用统一写在 watch / watchEffect / onMounted,并注意在 onUnmounted 清理定时器与事件监听。
  7. 计算属性必须无副作用;有副作用的逻辑放到方法或 watch。
  8. v-if 与 v-for 不得同处一个元素;v-for 必须提供稳定 :key(禁止用 index)。
  9. 组件文件超过 300 行必须拆分;表单弹窗拆成独立子组件。

模板与样式

  1. 模板保持简洁,复杂判断抽成 computed,禁止在模板里写长表达式。
  2. 样式必须 <style scoped lang="scss">;覆盖 Element Plus 内部样式用 :deep(),且必须限定父级作用域,禁止全局裸写。
  3. 颜色、圆角、间距等使用 src/styles/variables.scss 中的变量,禁止硬编码色值。
  4. 布局优先使用 Element Plus 的 el-row/el-col 与 flex 工具类,不写魔法 margin-top: 17px。

注释与命名

  1. 注释只解释"为什么",不解释"做了什么"。禁止无意义注释、禁止注释掉的代码块。
  2. 函数/变量命名见名知意,布尔值用 is/has/can 前缀,事件处理用 handleXxx,接口调用用 fetchXxx / createXxx / updateXxx / deleteXxx。
  3. 代码中不得出现 console.log、调试代码与 TODO 之外的临时标记。

Git 提交

使用 Conventional Commits:feat|fix|refactor|perf|style|docs|chore|test(scope): subject,一次提交只做一件事。