vue项目的项目结构
1. 标准的 Vue 3 + Vite 项目结构
这是目前(2024年)最主流和推荐的新项目结构。
text
my-vue-app/ ├── node_modules/ # 项目依赖的第三方包(自动生成,不要手动修改) ├── public/ # 纯静态资源,会被直接复制到输出目录 │ └── favicon.ico # 网站图标 ├── src/ # 项目主要的源代码目录 │ ├── assets/ # 需要经过构建工具处理的静态资源(如图片、样式、字体) │ │ ├── css/ │ │ ├── images/ │ │ └── fonts/ │ ├── components/ # 可复用的 Vue 组件 │ │ ├── ui/ # 通用的基础UI组件(如Button, Modal) │ │ └── features/ # 与业务功能相关的组件 │ ├── composables/ # Vue 组合式函数 (Composables) │ ├── layouts/ # 页面布局组件(如Header, Footer, Sidebar) │ ├── pages/ # 页面级组件(通常与Vue Router的路由对应) │ ├── router/ # Vue Router 路由配置 │ │ └── index.js │ ├── stores/ # Pinia 状态管理 │ │ ├── index.js # 主入口文件 │ │ └── user.js # 用户相关的store │ ├── utils/ # 通用的工具函数 │ ├── App.vue # 应用根组件 │ └── main.js # 应用入口文件,创建Vue实例 ├── .gitignore # Git 忽略文件配置 ├── index.html # HTML 模板文件 ├── package.json # 项目配置文件(依赖、脚本等) ├── package-lock.json # 锁定依赖版本(npm) ├── vite.config.js # Vite 构建工具配置文件 └── README.md # 项目说明文档
关键文件和目录详解:
public/: 这里的文件不会被Vite处理,引用时使用绝对路径(例如/favicon.ico)。src/assets/: 这里的文件会被Vite视为模块依赖。在JavaScript或CSS中通过相对路径引入,可能会被处理(如压缩、哈希重命名)。src/components/: 存放所有可复用的Vue组件。建议使用 PascalCase 命名组件文件(如MyComponent.vue)。src/composables/: 这是Vue 3组合式API的“最佳实践”目录,用于存放可复用的业务逻辑函数(如useUser,useApi)。src/layouts/和src/pages/: 清晰的分离了布局和页面内容。layouts/定义整体结构,pages/定义路由对应的具体内容。这通常与vue-router配合使用。src/stores/: 如果使用 Pinia(Vue官方推荐的状态管理库),store定义文件放在这里。src/router/: 存放所有路由配置。src/utils/: 存放与业务无关的纯函数,如日期格式化、HTTP请求封装等。App.vue: 应用的根组件,通常包含路由出口 (<router-view>) 和全局布局。main.js: 应用的入口。在这里创建Vue应用实例,并注册全局插件(路由、状态库等)。index.html: Vite的入口文件,其中会有一个<div id="app"></div>用于挂载Vue应用。vite.config.js: 配置Vite构建工具,例如设置代理、别名(alias)、插件等。
2. 传统的 Vue 2 + Vue CLI 项目结构
Vue CLI创建的项目结构与Vite类似,但有一些细微差别,并且通常与Options API和Vuex配合。
text
my-vue-cli-app/ ├── node_modules/ ├── public/ │ ├── index.html │ └── favicon.ico ├── src/ │ ├── assets/ │ ├── components/ │ ├── views/ # 等同于 Vue 3 项目中的 `pages/` │ ├── router/ # 路由 │ │ └── index.js │ ├── store/ # Vuex 状态管理 (注意是单数 ‘store‘) │ │ └── index.js │ ├── App.vue │ └── main.js ├── .gitignore ├── babel.config.js # Babel 配置文件 (Vue CLI 使用 Babel) ├── package.json ├── package-lock.json └── README.md
主要区别:
src/views/: 功能等同于Vue 3项目中的src/pages/。src/store/: 通常使用 Vuex,并且目录名常用单数store。babel.config.js: Vue CLI基于Babel,所以有这个配置文件。缺少
composables/目录,因为这是Vue 3组合式API的产物。
3. 根据项目规模演进的目录结构
对于小型、中型和大型项目,结构需要灵活调整。
小型项目(简单页面)
保持基本结构即可,components 目录可以很扁平,不需要细分 ui 和 features。
中大型项目(需要模块化)
推荐使用 “功能模块” 或 “领域驱动设计(DDD)” 的思想来组织。
text
src/ ├── modules/ # 按功能模块划分 │ ├── auth/ # 认证授权模块 │ │ ├── components/ # 该模块专用的组件 │ │ ├── composables/ # 该模块专用的组合式函数 │ │ ├── pages/ # 该模块相关的页面 │ │ ├── services/ # 该模块的API请求 │ │ ├── stores/ # 该模块的Pinia store │ │ └── utils/ # 该模块的工具函数 │ └── dashboard/ # 仪表盘模块 │ ├── components/ │ ├── composables/ │ └── ... ├── core/ # 核心、与业务无关的代码 │ ├── ui/ # 最基础的UI组件库 │ ├── utils/ # 全局工具函数 │ ├── constants/ # 全局常量 │ ├── http/ # 全局axios实例和请求拦截器 │ └── router/ # 全局路由配置 └── shared/ # 跨模块共享的代码├── composables/└── utils/
这种结构的优点是:
高内聚,低耦合:一个功能模块的所有相关代码都在一起,便于开发和维护。
职责清晰:
core、shared、modules分工明确。易于团队协作:不同团队或开发者可以负责不同的模块,减少冲突。
总结与最佳实践
从简单开始:不要一开始就设计一个非常复杂的结构。从一个标准结构开始,随着项目复杂度的增加再逐步重构。
保持一致性:在整个项目中保持命名和结构的一致性。
组件命名:组件文件名使用 PascalCase(如
UserProfile.vue)。单一职责:每个文件/组件应该只负责一个明确的功能。
使用别名(Alias):在
vite.config.js或vue.config.js中配置路径别名(如@指向src),可以避免复杂的相对路径。javascript
// vite.config.js import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import { fileURLToPath, URL } from 'node:url'export default defineConfig({plugins: [vue()],resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))}} })
