前端项目组织结构

前端项目组织结构

#tech / dev / frontend #type / howto #status / growing

前端项目组织结构


项目结构

按文件类型分组(Type-Based)

结构示例:

src/
├── components/
├── views/
├── utils/
├── api/
├── store/
├── router/
└── assets/
优点:
简单直观:适合新手和小型项目,快速上手。

一致性高:所有组件、工具函数等按类型集中存放。

缺点:
耦合度高:功能相关的代码分散在不同目录,修改时需要跨目录操作。

难以扩展:随着项目规模增大,目录会变得臃肿。

适用场景:
小型项目(如个人博客、静态页面)。

快速原型开发。

按功能模块分组(Feature-Based)

完整项目结构示例:

 src/
├── modules/                  # 功能模块目录
   ├── User/                 # 用户模块
   ├── components/       # 用户相关组件
   ├── UserList.vue  # 用户列表组件
   ├── UserForm.vue  # 用户表单组件
   └── Profile/      # 用户资料相关子组件
   ├── store/            # 用户模块的Vuex状态管理
   ├── index.js      # 用户模块的store主文件
   ├── actions.js    # 用户相关actions
   ├── mutations.js  # 用户相关mutations
   └── getters.js    # 用户相关getters
   ├── api/              # 用户相关API调用
   └── index.js      # 用户API封装
   ├── views/            # 用户相关页面级组件
   ├── Login.vue     # 登录页面
   ├── Register.vue  # 注册页面
   └── Profile.vue   # 用户资料页面
   └── router.js         # 用户模块的路由配置
   ├── Product/              # 产品模块
   ├── components/       # 产品相关组件
   ├── store/            # 产品状态管理
   ├── api/              # 产品API
   ├── views/            # 产品相关页面
   └── router.js         # 产品模块路由
   └── Order/                # 订单模块
       ├── components/       # 订单相关组件
       ├── store/            # 订单状态管理
       ├── api/              # 订单API
       ├── views/            # 订单相关页面
       └── router.js         # 订单模块路由
├── core/                     # 全局共享代码
   ├── components/           # 全局公共组件
   ├── AppHeader.vue     # 顶部导航
   ├── AppFooter.vue     # 底部信息
   └── AppSidebar.vue    # 侧边栏
   ├── directives/           # 全局指令
   ├── filters/              # 全局过滤器
   ├── mixins/               # 全局混入
   ├── plugins/              # 全局插件
   ├── utils/                # 工具函数
   ├── auth.js           # 认证相关工具
   ├── api.js            # 基础API配置
   └── helpers.js        # 辅助函数
   ├── assets/               # 全局静态资源
   ├── styles/           # 全局样式
   ├── _variables.scss # SCSS变量
   ├── _mixins.scss    # SCSS混入
   └── main.scss      # 主样式文件
   └── images/           # 全局图片
   ├── router/               # 全局路由配置
   ├── index.js           # 路由主文件
   └── routes.js          # 路由定义
   └── store/                 # 全局Vuex store
       ├── index.js           # store主文件
       └── modules/           # 全局共享的store模块
├── App.vue                    # 根组件
└── main.js                    # 应用入口文件

优点: 高内聚低耦合:功能模块自包含所有代码(UI、状态、API)。

可维护性强:模块可独立开发、测试和复用。

适合团队协作:不同团队负责不同模块。

缺点: 初期复杂度高:需要设计模块边界和通信机制。

可能重复代码:不同模块间共享逻辑需抽离到 core/。

适用场景: 中大型应用(如 SaaS、ERP)。

长期迭代、多人协作项目。

领域驱动设计(DDD)

按功能模块分组时遇到了一个问题:
有一个代办任务模块和目标模块(每个目标都有关键结果)
代办任务又能够链接关键结果,实现任务完成后更新关键结果的值
此时,两个功能模块耦合了,需要在任务模块中使用目标模块中的服务

领域

DDD 架构图:


┌─────────────────────────────────────────┐
│           用户界面层 (UI Layer)              │
│  Vue组件、页面、表单验证等                    │
└─────────────────────────────────────────┘

┌─────────────────────────────────────────┐
│         应用层 (Application Layer)        │  ← 应用服务层方式
│  应用服务、用例协调、事务管理                  │
│  TaskGoalApplicationService              │
└─────────────────────────────────────────┘

┌─────────────────────────────────────────┐
│           领域层 (Domain Layer)           │  ← 事件总线方式
│  ┌─────────────┐    ┌─────────────┐      │
│  │ Task 聚合    │    │ Goal 聚合    │      │
│  │ - 任务实例   │    │ - 目标管理   │      │
│  │ - 任务模板   │    │ - 关键结果   │      │
│  └─────────────┘    └─────────────┘      │
│         │                  ↑             │
│         └──→ 领域事件 ──────┘             │
└─────────────────────────────────────────┘

┌─────────────────────────────────────────┐
│        基础设施层 (Infrastructure)        │
│  数据持久化、外部服务、技术实现              │
└─────────────────────────────────────────┘

结构示例:

DDD模式下的Electron+Vue3项目的代码组织结构样例
src/
├── main/                          # Electron主进程(主领域逻辑)
   ├── events/                    # 主进程领域事件处理
   ├── modules/                   # 主进程领域模块
   ├── task/                  # 任务领域
   ├── application/       # 任务应用服务
   ├── domain/            # 任务聚合根/实体
   └── infrastructure/    # 任务仓储实现
   └── goal/                  # 目标领域(同任务结构)
   └── electron-main.ts           # 主进程入口

├── renderer/                      # Vue3渲染进程(DDD核心)
   ├── core/                      # 跨领域共享内容
   ├── shared/                # 通用组件/工具
   └── infrastructure/        # 基础设施(HTTP客户端等)

   ├── modules/                   # 业务领域模块(核心)
   ├── user/                  # 用户领域
   ├── application/       # 应用层
   ├── commands/      # CQRS命令
   └── queries/       # 查询服务
   ├── domain/            # 领域层
   ├── entities/      # 用户实体/值对象
   ├── events/        # 用户领域事件
   └── services/      # 领域服务
   ├── infrastructure/   # 基础设施
   └── repositories/ # 用户仓储实现
   └── interfaces/       # 用户接口层
       ├── components/    # 领域组件
       └── views/         # 领域视图

   └── payment/               # 支付领域(同结构)

   ├── App.vue                    # 根组件
   └── main.ts                    # 渲染进程入口

└── preload/                       # Electron预加载脚本
    └── electron-api.ts            # 暴露Electron API给渲染进程

优点: 业务逻辑清晰:严格分层,核心业务与 UI/基础设施解耦。

高度可测试:领域层不依赖外部框架。

缺点: 过度设计:对简单项目来说过于复杂。

学习成本高:需理解 DDD 概念(实体、值对象、聚合根)。

适用场景: 复杂业务系统(如金融、电商平台)。

需要长期维护和演进的业务核心项目。


### Atomic Design(原子设计)

结构示例: Copy src/ ├── atoms/ # 基础原子组件(按钮、输入框) ├── molecules/ # 分子组件(搜索框 = 输入框 + 按钮) ├── organisms/ # 有机体组件(导航栏、表单) ├── templates/ # 页面骨架 └── pages/ # 完整页面 优点: UI 高度复用:从原子到页面逐级组合,减少重复代码。

设计一致性:强制遵循统一的 UI 规范。

缺点: 灵活性低:复杂业务组件可能难以归类。

不适合业务逻辑:仅解决 UI 分层,需结合其他结构管理状态和 API。

适用场景: UI 密集型应用(如设计工具、门户网站)。

需要与设计团队紧密协作的项目。


### Monorepo(多包管理)

结构示例: Copy project/ ├── apps/ │ ├── web/ # 主应用 │ └── electron/ # Electron 壳 ├── packages/ │ ├── shared/ # 通用工具和类型 │ └── ui-kit/ # 独立 UI 组件库 └── package.json # Workspace 配置 优点: 代码共享便捷:多个应用共享公共包。

依赖统一管理:避免版本冲突。

缺点: 构建复杂:需配置 Turborepo、Nx 等工具。

仓库体积大:所有代码集中在一个仓库。

适用场景: 多端应用(Web + Electron + Mobile)。

需要维护多个独立组件库或微前端模块。


### Electron 专属结构

结构示例:

src/ ├── main/ # Electron 主进程 │ ├── ipc/ │ └── windows/ ├── renderer/ # Vue 渲染进程 │ ├── modules/ │ └── core/ ├── shared/ # 共享代码(类型、工具) └── resources/ # 静态资源(图标、配置文件) 关键点: 进程隔离:严格分离主进程(Node.js)和渲染进程(Vue)。

IPC 规范化:通过预加载脚本安全通信。

适用场景: 跨平台桌面应用(如 IDE、数据管理工具)。


### 微前端架构

结构示例:

project/ ├── app-shell/ # 基座应用(路由、全局状态) ├── app-dashboard/ # 子应用(独立仓库或模块) └── app-admin/ # 子应用(可独立部署) 优点: 独立部署:子应用可单独开发、测试和上线。

技术栈无关:不同子应用可用不同框架。

缺点: 通信复杂:需处理跨应用状态共享和路由同步。

性能开销:资源重复加载。

适用场景: 巨型企业级应用(如阿里云控制台)。 ss 整合遗留系统。


## Related notes

- [[frontend-engineering-moc|前端工程化MOC]]

- [[frontend-basics-moc|前端基础MOC]]

- [[css-moc|CSS MOC]]

- [[ecmascript-moc|ECMAScript MOC]]
创建于 2025/1/1 更新于 2026/5/27