# src 目录结构规范 本文档定义 `src` 目录下的文件组织方式与命名规范。**后续新增与修改的代码必须严格遵循本规范。** ## 目录总览 ``` src/ ├── pages/ # 页面组件 ├── components/ # 全局公共组件 ├── business-cmp/ # 业务组件(页面专用) ├── static/ # 静态资源 ├── api/ # 网络请求接口 ├── stores/ # 状态管理(Pinia) ├── utils/ # 工具函数 ├── types/ # TypeScript 类型定义 ├── hooks/ # Vue Composition API Hooks └── styles/ # 全局样式 ``` --- ## 各目录说明 ### pages — 页面组件 存放应用页面级组件,每个页面独立一个文件夹。 | 规则 | 说明 | |------|------| | 文件夹命名 | **kebab-case**(小写 + 连字符) | | 示例 | `user-login/`、`home-index/` | **推荐结构:** ``` pages/ ├── user-login/ │ ├── index.vue # 页面入口 │ └── components/ # 仅该页面使用的组件(可选) │ └── LoginForm.vue └── home-index/ └── index.vue ``` > 页面专属组件优先放在 `pages//components/` 下;若业务组件较多、需跨页面复用但又不属于全局公共组件,可使用 `business-cmp/`。 --- ### components — 全局公共组件 存放可在多个页面复用的通用 UI 组件。 | 规则 | 说明 | |------|------| | 文件命名 | **PascalCase**(大驼峰) | | 文件扩展名 | `.vue` | | 示例 | `AppFooter.vue`、`InputEntry.vue` | **适用场景:** - 按钮、输入框、弹窗等基础 UI 封装 - 布局类组件(Header、Footer、Sidebar 等) - 与具体业务无关、可在任意页面引用的组件 --- ### business-cmp — 业务组件 存放与特定业务逻辑绑定、**不对外全局复用**的组件。 | 规则 | 说明 | |------|------| | 组织方式 | 按业务模块或页面分子目录 | | 文件命名 | **PascalCase** | | 示例 | `business-cmp/order/OrderCard.vue` | **与 `components` 的区别:** | 目录 | 复用范围 | 示例 | |------|----------|------| | `components/` | 全局、跨业务复用 | `AppFooter.vue` | | `business-cmp/` | 特定业务/页面 | `OrderCard.vue` | | `pages/xxx/components/` | 仅单个页面 | `LoginForm.vue` | **选择原则:** 1. 仅一个页面使用 → `pages//components/` 2. 同一业务模块内多页面复用 → `business-cmp//` 3. 跨业务、通用 UI → `components/` --- ### static — 静态资源 存放图片、字体、图标等静态文件。 | 规则 | 说明 | |------|------| | 文件/文件夹命名 | **小写**(可用连字符分隔) | | 示例 | `logo.png`、`github.svg`、`icon-arrow.png` | **推荐结构:** ``` static/ ├── images/ │ └── banner.png ├── icons/ │ └── home.svg └── fonts/ └── custom-font.woff2 ``` --- ### api — 网络请求接口 封装所有后端 API 调用,按业务模块拆分文件。 | 规则 | 说明 | |------|------| | 文件命名 | **kebab-case** 或按模块命名 | | 文件扩展名 | `.ts` | | 示例 | `user.ts`、`order.ts` | **示例:** ```ts // api/user.ts export function login(data: LoginParams) { return request.post('/user/login', data) } ``` --- ### stores — 状态管理 使用 **Pinia** 管理全局状态,按功能模块拆分 Store。 | 规则 | 说明 | |------|------| | 文件命名 | **kebab-case** 或 `useXxxStore` 风格 | | 文件扩展名 | `.ts` | | 示例 | `user.ts`、`cart.ts` | **示例:** ```ts // stores/user.ts export const useUserStore = defineStore('user', () => { // ... }) ``` --- ### utils — 工具函数 存放与业务无关的纯函数工具。 | 规则 | 说明 | |------|------| | 文件命名 | **kebab-case** | | 文件扩展名 | `.ts` | | 示例 | `format-date.ts`、`storage.ts` | **适用场景:** - 日期/金额格式化 - 本地存储封装 - 通用校验、防抖节流等 --- ### types — TypeScript 类型定义 集中管理项目中的 TypeScript 类型与接口。 | 规则 | 说明 | |------|------| | 文件命名 | **kebab-case** | | 文件扩展名 | **`.ts`**(必须) | | 示例 | `user.ts`、`api-response.ts` | **示例:** ```ts // types/user.ts export interface UserInfo { id: number name: string } ``` --- ### hooks — Composition API Hooks 封装可复用的 Vue Composition API 逻辑。 | 规则 | 说明 | |------|------| | 文件命名 | **kebab-case**,以 `use` 开头 | | 文件扩展名 | `.ts` | | 示例 | `use-auth.ts`、`use-pagination.ts` | **示例:** ```ts // hooks/use-auth.ts export function useAuth() { // ... } ``` --- ### styles — 全局样式 存放全局样式、变量、混入等。 | 规则 | 说明 | |------|------| | 文件命名 | **kebab-case** | | 文件扩展名 | `.scss` / `.css` | | 示例 | `variables.scss`、`reset.scss` | --- ## 命名规范速查表 | 类型 | 命名风格 | 示例 | |------|----------|------| | 页面文件夹 | kebab-case | `user-login/` | | 全局组件文件 | PascalCase | `AppFooter.vue` | | 业务/页面组件文件 | PascalCase | `OrderCard.vue` | | 静态资源 | 小写 | `logo.png` | | API / Store / Utils / Types / Hooks | kebab-case | `user.ts`、`use-auth.ts` | | 样式文件 | kebab-case | `variables.scss` | --- ## 导入路径约定 - 全局组件:从 `@/components/` 引入 - 业务组件:从 `@/business-cmp/` 或页面相对路径引入 - API:从 `@/api/` 引入 - 类型:从 `@/types/` 引入 - 工具:从 `@/utils/` 引入 - Hooks:从 `@/hooks/` 引入 --- ## 注意事项 1. **禁止**在 `components/` 中放置与具体业务强耦合的组件。 2. **禁止**在页面目录外散落页面专属组件。 3. 新增目录或调整规范前,需同步更新本文档。 4. 所有 TypeScript 类型定义统一放在 `types/`,避免在业务文件中重复定义相同类型。 5. 网络请求逻辑统一通过 `api/` 层调用,页面与组件中不直接写请求 URL。