Vue Ace Admin Monorepo 架构总览:企业级组件库的设计理念与实践

约 12 分钟阅读

什么是 Monorepo 架构

Monorepo(Monolithic Repository)是一种将多个相关项目或包存储在同一个代码仓库中的代码组织方式。与传统的多仓库(Multi-repo)架构相比,Monorepo 提供了更好的代码共享、统一管理和开发体验。

Vue Ace Admin 采用 Monorepo 架构,将主应用、组件库和 Hooks 包统一管理,实现了"一套代码,两种用法"的设计理念。

📚 系列文章导航

本系列文章深入解析 Vue Ace Admin 的 Monorepo 架构实践,分为以下几个主题:

  1. Monorepo 架构总览(本文)

    • 架构概念与优势
    • 项目结构概览
    • 核心设计理念
  2. 从零搭建 Monorepo 项目

    • pnpm workspace 配置详解
    • 项目结构设计最佳实践
    • TypeScript 和 Vite 配置
    • 包初始化流程
  3. Monorepo 依赖管理策略

    • workspace 协议工作原理
    • peerDependencies 配置策略
    • 依赖提升机制
    • 版本管理最佳实践
  4. Monorepo 构建与打包优化

    • Vite 库模式详细配置
    • TypeScript 类型声明生成
    • Turbo 缓存机制
    • 构建性能优化技巧
  5. Monorepo 开发工作流实践

    • 本地开发流程详解
    • 跨包调试技巧
    • 代码规范管理
    • npm 发布流程

Vue Ace Admin 项目概览

Vue Ace Admin 是一个基于 Vue 3.5、TypeScript 5.x、Ant Design Vue 4.x 构建的中后台管理系统解决方案。项目的核心亮点是采用 Monorepo 架构,将业务逻辑和 UI 组件解耦,实现了高度的代码复用和灵活性。

项目结构

text
vue-ace-admin/
├── packages/
│   ├── hooks/              # @codexlin/ace-admin-hooks
│   │   ├── src/
│   │   │   ├── useList.ts         # 列表数据管理 Hook
│   │   │   ├── usePagination.ts   # 分页管理 Hook
│   │   │   ├── useDebouncedRef.ts # 防抖 Ref Hook
│   │   │   └── ...
│   │   ├── package.json
│   │   └── vite.config.ts
│   │
│   └── ui/                 # @codexlin/ace-admin-ui
│       ├── src/
│       │   ├── pro-table/         # ProTable 组件
│       │   ├── pro-button/        # ProButton 组件
│       │   ├── pro-search-form/   # ProSearchForm 组件
│       │   └── ...
│       ├── package.json
│       └── vite.config.ts
│
├── src/                    # 主应用代码
├── docs/                   # 文档站点(VitePress)
├── pnpm-workspace.yaml     # pnpm workspace 配置
├── turbo.json              # Turbo 构建配置
└── package.json            # 根 package.json

Monorepo 核心配置

1. pnpm Workspace 配置

pnpm-workspace.yaml 定义了工作空间的范围:

yaml
packages:
  - 'packages/*'
  - 'docs'

这个配置告诉 pnpm 哪些目录是独立的包,pnpm 会自动处理这些包之间的依赖关系。

2. 根 package.json 配置

根目录的 package.json 使用 workspace:* 协议引用本地包:

json
{
  "dependencies": {
    "@codexlin/ace-admin-hooks": "workspace:*",
    "@codexlin/ace-admin-ui": "workspace:*"
  }
}

workspace:* 的作用:

  • 自动链接到本地 packages/ 目录下的对应包
  • 开发时直接使用源码,修改立即生效
  • 无需发布到 npm 即可在本地使用
  • 保持与 npm 发布版本相同的使用方式

3. Turbo 构建优化

turbo.json 配置了构建任务的依赖关系和缓存策略:

json
{
  "tasks": {
    "build:hooks": {
      "outputs": ["packages/hooks/dist/**"],
      "cache": true
    },
    "build:ui": {
      "dependsOn": ["build:hooks"],
      "outputs": ["packages/ui/dist/**"],
      "cache": true
    },
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**"]
    }
  }
}

Turbo 的优势:

  • 依赖管理dependsOn 确保构建顺序正确
  • 增量构建:只构建变更的包,提升构建速度
  • 缓存机制:未变更的包直接使用缓存,大幅减少构建时间
  • 并行构建:无依赖关系的包可以并行构建

包的设计与实现

@codexlin/ace-admin-hooks - 纯逻辑 Hooks 包

这是一个无 UI 依赖的纯逻辑包,提供通用的 Composition API Hooks。

包结构:

typescript
// packages/hooks/src/useList.ts
export interface UseListOptions<ItemType, Response, FilterOption> {
  immediate?: boolean
  autoWatchPagination?: boolean
  pagination?: { current?: number; pageSize?: number }
  onSuccess?: (context: UseListSuccessContext) => void
  onError?: (error: Error) => void
  // ...
}

export function useList<ItemType, Response, FilterOption>(
  requestFn: UseListRequestFn<Response>,
  options?: UseListOptions<ItemType, Response, FilterOption>
) {
  // 实现逻辑...
}

特点:

  • ✅ 无业务依赖,可在任何 Vue 3 项目中使用
  • ✅ 完整的 TypeScript 类型支持
  • ✅ 支持响应式参数和返回值
  • ✅ 提供丰富的配置选项和生命周期钩子

使用示例:

typescript
import { useList } from '@codexlin/ace-admin-hooks'

const { items, loading, loadData, pagination } = useList(
  async (params) => {
    const res = await api.getUserList(params)
    return {
      items: res.data.list,
      total: res.data.total
    }
  },
  {
    immediate: true,
    pagination: { current: 1, pageSize: 10 }
  }
)

@codexlin/ace-admin-ui - UI 组件库

基于 Ant Design Vue 的增强组件库,提供企业级 UI 组件。

包配置:

json
{
  "name": "@codexlin/ace-admin-ui",
  "version": "0.3.0",
  "main": "./dist/ace-admin-ui.umd.js",
  "module": "./dist/ace-admin-ui.es.js",
  "types": "./dist/types/index.d.ts",
  "exports": {
    ".": {
      "types": "./dist/types/index.d.ts",
      "import": "./dist/ace-admin-ui.es.js",
      "require": "./dist/ace-admin-ui.umd.js"
    },
    "./dist/ace-admin-ui.css": "./dist/ace-admin-ui.css"
  },
  "peerDependencies": {
    "ant-design-vue": ">=4.0.0",
    "vue": ">=3.4.0"
  }
}

关键设计:

  • 多格式输出:同时支持 ESM 和 UMD 格式
  • 类型声明:完整的 TypeScript 类型定义
  • 样式分离:CSS 文件独立导出,支持按需引入
  • Peer Dependencies:避免重复安装依赖,减小包体积

开发工作流概述

Vue Ace Admin 的 Monorepo 架构实现了"一套代码,两种用法":

方式一:本地开发(Monorepo)

  • 使用 workspace:* 协议直接使用源码
  • 修改立即生效,无需重新构建
  • 完整的 TypeScript 类型支持
  • Vite HMR 自动热更新

方式二:npm 发布(外部使用)

  • 构建后发布到 npm
  • 使用方式完全一致
  • 无需修改代码即可切换

详细的开发工作流请参考:Monorepo 开发工作流实践

Monorepo 架构优势

1. 代码共享与复用

传统方式(Multi-repo):

text
project-a/
  └── components/
      └── Table.vue  # 重复代码

project-b/
  └── components/
      └── Table.vue  # 重复代码

Monorepo 方式:

text
monorepo/
  ├── packages/
  │   └── ui/
  │       └── Table.vue  # 单一数据源
  ├── project-a/         # 共享使用
  └── project-b/         # 共享使用

2. 类型安全

Monorepo 通过 TypeScript 项目引用实现跨包类型检查:

json
// packages/ui/tsconfig.json
{
  "compilerOptions": {
    "composite": true,
    "declaration": true
  },
  "references": [
    { "path": "../hooks" }
  ]
}

优势:

  • 修改 hooks 包的类型,ui 包立即检测到类型错误
  • 避免运行时类型不匹配问题
  • 提供更好的 IDE 自动补全

3. 统一工具链

所有包共享相同的开发工具和配置:

json
// 根目录配置
{
  "devDependencies": {
    "typescript": "~5.9.0",
    "eslint": "^9.39.1",
    "prettier": "^3.5.3"
  }
}

好处:

  • 统一的代码风格
  • 统一的构建配置
  • 统一的测试策略
  • 减少配置维护成本

4. 原子化发布

可以独立发布每个包,不影响其他包:

bash
# 只发布 hooks 包
cd packages/hooks
pnpm publish

# 只发布 ui 包
cd packages/ui
pnpm publish

优势:

  • 版本管理更灵活
  • 减少不必要的版本更新
  • 用户可以选择性安装

构建优化概述

Vue Ace Admin 使用 Turbo 进行构建优化:

  • 增量构建:只构建变更的包
  • 缓存机制:未变更的包使用缓存
  • 并行构建:无依赖关系的包并行构建
  • 依赖管理:自动处理构建顺序

详细的构建优化请参考:Monorepo 构建与打包优化

最佳实践总结

1. 包的设计原则

单一职责:

  • hooks 包:纯逻辑,无 UI 依赖
  • ui 包:UI 组件,依赖 hooks 包

依赖方向:

text
主应用 → ui 包 → hooks 包

避免循环依赖:

  • hooks 包不依赖 ui 包
  • ui 包可以依赖 hooks 包
  • 主应用可以依赖两者

2. 版本管理策略

语义化版本:

  • major.minor.patch
  • hooks 包:1.0.0
  • ui 包:0.3.0(仍在开发中)

独立版本:

  • 每个包独立版本号
  • 不强制版本同步
  • 根据实际变更决定版本号

3. 开发体验优化

即时反馈:

  • 使用 workspace:* 实现源码链接
  • 修改立即生效,无需重新构建
  • 完整的 TypeScript 类型支持

文档同步:

  • 代码即文档
  • TypeScript 类型即 API 文档
  • 提供使用示例和最佳实践

实际应用场景

场景一:快速搭建管理系统

bash
git clone https://github.com/codexlin/vue-ace-admin.git
cd vue-ace-admin
pnpm install
pnpm dev

5 分钟后,一个完整的管理系统就运行起来了!

场景二:只使用组件库

bash
pnpm add @codexlin/ace-admin-ui
typescript
import { ProTable } from '@codexlin/ace-admin-ui'
import '@codexlin/ace-admin-ui/dist/ace-admin-ui.css'

// 在你的项目中使用

场景三:贡献代码

bash
# Fork 项目
git clone https://github.com/your-username/vue-ace-admin.git

# 修改 packages/ui/src/pro-table/ProTable.vue
# 主应用自动使用最新代码,立即看到效果

# 提交 PR

总结

Vue Ace Admin 的 Monorepo 架构展示了现代前端项目组织的最佳实践:

  1. 代码共享:通过 workspace 实现代码复用
  2. 类型安全:TypeScript 项目引用确保类型一致
  3. 构建优化:Turbo 缓存和并行构建提升效率
  4. 灵活发布:支持本地开发和 npm 发布两种模式
  5. 开发体验:源码链接、即时反馈、完整类型支持

这种架构不仅适用于组件库项目,也适用于大型企业级应用的代码组织。通过合理的包拆分和依赖管理,可以实现代码复用、类型安全和开发效率的完美平衡。

如果你对 Vue 3 企业级工程实践 感兴趣,可以查看我们的 架构实践分类 下的其他文章。

相关资源

以下是一些有用的资源链接,帮助你深入了解 Monorepo 架构:

相关文章