Skip to content

命名规范

TIP

规定前端项目中文件、目录、变量、组件、接口等的命名方式,适用于 Vue 3 + TypeScript + Vite 技术栈,并与 目录规范 保持一致。

设计原则

原则说明
见名知意名称应准确表达用途,避免 datatemphandler 等模糊命名
风格统一同类事物使用同一种命名风格,全项目保持一致
英文优先代码标识符使用英文,中文仅用于注释与文案
避免缩写除通用缩写(如 idurlapi)外,不使用难懂缩写
禁止拼音不使用拼音或拼音缩写,如 yonghuList

命名风格

类型风格示例
目录 / 非组件文件camelCaseuserMng/tagsView.ts
Vue 组件文件PascalCaseGvUserInfo.vueGvNavBar.vue
功能首页文件PascalCase + 'Index' 后缀UserMngIndex.vueRoleMngIndex.vue
功能子页文件PascalCaseUserEdit.vueRoleEdit.vue
组件注册名PascalCase<GvUserInfo /><GvNavBar />
变量 / 函数camelCasesearchUserDatadialogVisible
功能模块页'name'PascalCasename: 'UserIndex'
组合式函数camelCase + use 前缀useStyleuseSecret
接口 / 类型PascalCaseFormItemMessageType
枚举PascalCase(枚举名)+ PascalCase(成员)UserStatus.ENABLE
常量UPPER_SNAKE_CASEICON_PREFIX
环境变量UPPER*SNAKE_CASE + VITE* 前缀VITE_API_BASE_URL
CSS 类名kebab-case / BEMuser-listuser-list__item
路由 pathcamelCase/sysMng/userMng/UserMngIndex
路由 namePascalCaseUserMngIndex
i18n keycamelCasetitle
API 名camelCase + 'Api' 后缀findUsersApi
GvForm 参数:refcamelCase + 'SearchFm' 后缀userSearchFm
GvForm 参数:ref-formcamelCase + 'SearchFm' 后缀userSearchFm
GvForm 参数:form-listcamelCase + 'SearchList' 后缀userSearchList
GvTable 参数: refcamelCase + 'TableList' 后缀userTableList
GvTable 参数: ref-tablecamelCase + 'TableList' 后缀userTableList
GvTable 参数: table-headcamelCase + 'TableHeadList' 后缀userTableHeadList
GvTable 参数: table-dataPascalCase + 'search' 前缀 + 'Data' 后缀searchUserData

目录与文件命名

目录

  • 使用 camelCase 小驼峰英文
  • 名称使用名词或名词短语,体现业务域
typescript
✅ userMng/
✅ companyMng/
❌ UserMng/
❌ user-mng/
❌ user_mng/
❌ yonghu/

文件

文件类型命名规则示例
Vue 页面/组件PascalCaseUserMngIndex.vue
TypeScript 模块camelCasebizConf.ts
类型定义/types/index.tsuserMng/types/index.ts
测试<name>.spec.ts / <name>.test.tsUserMng.spec.ts
样式(独立文件)kebab-caseelement-plus.scss

禁止

同一目录下不要混用 UserList.vueuser-list.vue 两种组件文件风格。

组件命名

单文件组件

  • 文件名:PascalCase,与组件名一致
  • 多词组合,避免与 HTML 原生标签冲突
vue
<!-- ✅ UserList.vue -->
<script setup lang="ts">
// 组件名与文件名一致
defineOptions({ name: 'UserMngIndex' });
</script>

组件层级语义

类型前缀/后缀建议示例
页面级业务 + 页面类型UserMngIndex.vueUserEdit.vue
布局PascalCaseLayout.vue
通用基础组件业务无关名词GvNavBar.vueGvEcharts.vue
业务组件模块 + 功能UserForm.vueUserTable.vue

Props / Emits / Slots

typescript
// props:camelCase
const props = defineProps({
  visible: propTypes.bool.def(false),
  rowData: propTypes.object,
  operateType: propTypes.string
});

// emits:camelCase 动词或动词短语
const emit = defineEmits(['update:visible', 'saved']);

// slots:camelCase(模板中使用)
// <slot #title />

TypeScript

变量与函数

typescript
// ✅ 变量:名词 / 名词短语
const searchUserData = ref<Recordable<any>>({});
const rowData = ref<Recordable<any>>({});

// ✅ 函数:动词开头,切记不要使用function关键字
const saveUser = async () => {}
const editUser = async () => {}
const updateUserStatus = async () => {}

// ✅ 布尔值:is / has / can / should 前缀
const isVisible = ref<boolean>(true)
const hasPermission = computed<boolean>(() => ...)

类型与接口

typescript
// 接口:PascalCase,不加 I 前缀
interface UserInfo {
  id: string;
  userName: string;
}

// 类型别名:PascalCase
type UserId = string;

// 枚举:PascalCase
enum OrderStatus {
  Pending = 'PENDING',
  Completed = 'COMPLETED'
}

常量

typescript
// 真正不可变、全局共享的使用 UPPER_SNAKE_CASE
export const MAX_PAGE_SIZE = 100;
export const DEFAULT_LOCALE = 'zh-CN';

hook

  • 文件名:use + PascalCase 语义 → useEcharts.ts
  • 导出函数:与文件名一致
typescript
// useEcharts.ts
export function useEcharts<T>(options: EchartsOptions<T>) {
  // ...
}

常见前缀约定:

前缀用途示例
use组合式逻辑useUtiluseI18n
on事件监听封装onClick
create工厂函数createMessage
to转换类toUserDTO

Store

typescript
// 文件名:kebab-case 或 camelCase
// stores/modules/user.ts

export const useUserStore = defineStore('user', () => {
  state: (): UserState => ({
    userInfo: undefined,
  }),
  getters: {
    getUserInfo(): UserInfo | undefined {
      return this.userInfo;
    }
  },
  actions: {
    setUserInfo() {
      // ...
    }
  }
});
规则示例
Store IDcamelCase'user''order'
Store 函数use + PascalCase + StoreuseUserStore
StatecamelCase 名词userInfo
ActioncamelCase 动词setUserInfo

路由

typescript
// path:camelCase,体现层级
{ path: '/sysMng/userMng', name: 'UserMngIndex' }

// 动态参数:camelCase
{ path: '/user/:userId' }
规则示例
pathcamelCaseuserMngIndex
namePascalCase,与页面组件对应UserMngIndex
paramscamelCase:userId:orderId
querycamelCase?pageSize=20&currentPage=1

API

typescript
// 函数:动词 + 业务对象 + Api后缀
export const findUsersApi = (datas: Recordable<any>) => {};
函数前缀示例
接口名称 + ApifindUserApi
TypeScript
export const findUsersApi = (datas: Recordable<any>) => {
  const { fetch } = useFetch();
  if (import.meta.env.VITE_NODE_ENV !== 'production') fetch.getInstance().defaults.baseURL = baseUrl;
  return fetch.post(`${server.gateway_admin}/sysuser/findUsers`, datas);
};

CSS

优先使用 BEMkebab-case,组件内样式加 scoped

scss
<style scoped lang="scss">
  // 块__元素--修饰符
  .user-list {
  }
  .user-list__header {
  }
  .user-list__item--active {
  }

  // 状态类:is- / has- 前缀
  .is-disabled {
  }
  .has-error {
  }
</style>
类型规则示例
类名kebab-casesearch-bar
BEM 块kebab-caseuser-form
修饰符-- 连接user-form__input--error
全局工具类简短语义text-centerflex-between

Guava UI

使用 Guava UI 组件时,优先沿用组件库提供的 class 与 token,减少自定义类名冲突。

多语言

详见 多语言规范,基本约定如下:

typescript
<功能模块>.<文案标识>
export default {
  common: {                 → 通用功能
    homePage: 'HomePage',   → 首页文案
    login: 'Login',         → 登录文案
  },
  // more ...
}
  • key使用 camelCase
  • value: 如无特殊情况,第一个单词首字母大写,其余单词均小写
  • 层级 2 级

表格/表单

通常我们的表格与表单是动态配置的,在业务模块中占用的行数太多,导致代码的可读性不好,因此将这部分代码抽离,使业务模块的代码更简洁。

变量函数命名示例
table-headcreateTableHeadList(单表头) | create<功能模块>TableHeadList(多表头)createTableHeadList({editUser,adduser}) \| createUserTableHeadList({editUser,adduser})
form-listcreateSearchList(单表单) | create<功能模块>SearchList(多表单)createSearchList({handleBlur, dicSelectedCB}) | createUserSearchList({handleBlur, dicSelectedCB})

变量与函数

typescript
// ❌
const d = ref([]);
const fn = () => {};
function getData() {}

// ✅
const searchUserData = ref<Recordable<any>>({});
const searchUserList = async () => {};

组件

vue
<!-- ❌ list.vue -->
<!-- ❌ userlist.vue -->
<!-- ✅ UserList.vue -->

类型

typescript
// ❌
interface IUser {}
type userInfo = {};
interface getUserListRequest {}

// ✅
interface UserInfo {}
type UserDTO = {};
interface GetUserListReq {}

命名 Checklist

提交代码前自查:

  • 目录与 TS 文件使用 camelCase,组件文件使用 PascalCase
  • 变量、函数使用 camelCase,常量使用 UPPER_SNAKE_CASE
  • 组件名、类型名使用 PascalCase,且为多词组合
  • hook 以 use 开头,Store 以 useXxxStore 命名
  • API 函数以Api后缀结尾,语义需尽量与 HTTP 动作一致
  • 无拼音、无无意义缩写、无 data1 / temp / test1 类临时命名
  • GvTable 与 GvForm 组件的参数是否完全按照 【命名风格速查】进行命名

相关规范