Architecture

前端架构

Tagtag Starter 前端架构的详细介绍。

Tagtag Starter 前端采用现代化的架构设计,基于 Vue 3 + TypeScript + Vite 构建,使用 Monorepo 结构管理代码。本文档将详细介绍前端架构的设计理念、技术栈、核心组件和最佳实践。

1. 架构设计理念

Tagtag Starter 前端架构遵循以下设计理念:

1.1 组件化设计

将 UI 拆分为可复用的组件,每个组件负责一个独立的功能,提高代码复用率和可维护性。

1.2 关注点分离

业务逻辑、UI 展示和状态管理分离,使代码结构清晰,易于测试和维护。

1.3 类型安全

充分利用 TypeScript 提供的静态类型检查,提高代码质量和开发效率。

1.4 响应式设计

适配不同屏幕尺寸的设备,提供良好的用户体验。

1.5 性能优化

采用代码分割、懒加载、虚拟滚动等优化手段,提高应用性能。

1.6 可扩展性

设计灵活的扩展机制,便于添加新功能和集成第三方库。

2. 技术栈

技术版本用途
Vue 33.x响应式前端框架,提供 Composition API。
TypeScript5.x静态类型检查,提高代码质量。
Vite5.x现代化前端构建工具,提供快速的开发体验。
Pinia2.xVue 3 官方状态管理库。
Vue Router4.xVue 官方路由管理库。
Tailwind CSS3.x实用优先的 CSS 框架,提高样式开发效率。
Shadcn UI最新可定制的 UI 组件库,基于 Tailwind CSS。
pnpm10.x高效的包管理器,支持 Monorepo 结构。
Axios1.xHTTP 客户端,用于 API 请求。
Echarts5.x数据可视化库。

3. Monorepo 结构

Tagtag Starter 前端采用 Monorepo 结构管理代码,使用 pnpm 作为包管理器。这种结构的优势包括:

3.1 代码共享

多个应用可以共享组件、工具类和配置,减少重复代码。

3.2 统一依赖管理

所有应用使用相同版本的依赖,避免版本冲突。

3.3 统一构建工具

共享构建配置和脚本,提高开发效率。

3.4 更好的协作

团队成员可以更方便地共享和复用代码。

3.5 简化版本管理

统一版本号管理,简化发布流程。

4. 目录结构

注意:以下描述均在 cd frontend 后的目录结构基础上进行说明。

frontend
├── apps                  # 应用层
│   └── tagtag            # 主应用
│       ├── public        # 静态资源
│       └── src           # 源代码
├── packages              # 核心包层
│   ├── @core             # 核心共享库
│   │   ├── base          # 基础设计系统、图标和共享工具
│   │   ├── composables   # 通用组合式函数
│   │   ├── preferences   # 应用偏好设置管理
│   │   └── ui-kit        # UI 组件库
│   ├── constants         # 常量定义
│   └── effects           # 业务副作用与逻辑封装
└── internal              # 内部工具层
    ├── lint-configs      # 代码规范配置
    ├── node-utils        # Node.js 工具函数
    ├── tailwind-config   # Tailwind CSS 配置
    ├── tsconfig          # TypeScript 配置文件
    └── vite-config       # Vite 构建配置

5. 核心模块

5.1 应用层 (apps)

包含具体的应用实现,每个子目录对应一个独立的前端应用。

5.1.1 主应用 (apps/tagtag)

核心组件

  • src/api/: API 请求定义和封装
    • core/: 核心 API(认证、用户、菜单)
    • modules/: 模块 API(IAM、系统、存储)
    • request.ts: Axios 实例配置
  • src/views/: 页面视图组件
    • _core/: 核心页面(登录、个人中心、404 等)
    • dashboard/: 仪表盘页面
    • modules/: 模块页面(IAM、系统、存储)
  • src/router/: 路由配置
    • routes/: 路由定义
    • access.ts: 路由守卫
    • guard.ts: 权限守卫
  • src/store/: Pinia 状态管理
    • auth.ts: 认证状态管理
  • src/layouts/: 布局组件
    • auth.vue: 认证布局
    • basic.vue: 基础布局
  • src/components/: 业务组件
  • src/locales/: 国际化配置
    • langs/: 语言包

5.2 核心包层 (packages)

提供可复用的核心功能和组件,供应用层使用。

子模块

5.2.1 核心共享库 (packages/@core)

子模块

  • base: 基础设计系统、图标和共享工具
    • design/: 设计系统和设计令牌
    • icons/: 图标库
    • shared/: 共享工具类
    • typings/: 类型定义
  • composables: 通用组合式函数
    • use-is-mobile.ts: 移动端检测
    • use-layout-style.ts: 布局样式管理
    • use-namespace.ts: 命名空间管理
    • use-scroll-lock.ts: 滚动锁定管理
    • use-sortable.ts: 排序功能
  • preferences: 应用偏好设置管理
    • 主题设置
    • 布局设置
    • 其他用户偏好
  • ui-kit: 封装的 UI 组件库
    • shadcn-ui: 基于 Shadcn UI 的基础组件
    • form-ui: 表单组件封装
    • layout-ui: 布局组件封装
    • popup-ui: 弹窗、抽屉等组件封装
    • tabs-ui: 标签页组件封装
    • menu-ui: 菜单组件封装

5.2.2 常量定义 (packages/constants)

  • 核心常量定义
  • 业务常量定义

5.2.3 业务副作用与逻辑封装 (packages/effects)

  • access: 权限控制逻辑
    • 权限指令
    • 权限组件
    • 权限管理
  • common-ui: 通用 UI 组件
    • 关于页面
    • fallback 页面
    • 个人中心组件
  • hooks: 通用 Hooks
    • use-app-config.ts: 应用配置管理
    • use-content-maximize.ts: 内容最大化管理
    • use-design-tokens.ts: 设计令牌管理
    • use-hover-toggle.ts: 悬停切换管理
    • use-pagination.ts: 分页管理
    • use-refresh.ts: 刷新功能
    • use-tabs.ts: 标签页管理
    • use-watermark.ts: 水印功能
  • layouts: 布局组件
    • 基础布局
    • 认证布局
    • iframe 布局
  • plugins: 第三方插件集成
    • echarts: ECharts 图表集成
    • motion: 动画集成
    • vxe-table: 表格集成

5.3 内部工具层 (internal)

提供构建、开发和维护所需的工具和配置。

核心组件

  • lint-configs/: ESLint, Prettier, Stylelint 等代码规范配置
  • node-utils/: Node.js 工具函数
  • tailwind-config/: Tailwind CSS 配置封装
  • tsconfig/: TypeScript 配置文件
    • base.json: 基础 TypeScript 配置
    • library.json: 库 TypeScript 配置
    • node.json: Node.js TypeScript 配置
    • web-app.json: Web 应用 TypeScript 配置
    • web.json: Web TypeScript 配置
  • vite-config/: Vite 构建配置封装
    • 应用配置
    • 库配置
    • 插件配置

6. 数据流设计

6.1 状态管理

使用 Pinia 进行状态管理,将应用状态划分为多个模块,每个模块负责一个独立的功能域。

状态管理流程

  1. 组件通过 useStore 钩子获取状态
  2. 组件调用 action 修改状态
  3. Action 可以调用 API 获取数据
  4. Mutation 修改状态(在 Pinia 中,action 可以直接修改状态)
  5. 状态变化触发组件重新渲染

6.2 API 请求流程

  1. 组件调用 API 函数
  2. API 函数使用封装的 Axios 实例发送请求
  3. 请求拦截器添加认证信息和其他头部
  4. 后端处理请求,返回响应
  5. 响应拦截器处理响应,统一处理错误
  6. API 函数返回响应数据
  7. 组件处理响应数据,更新状态或 UI

6.3 路由流程

  1. 用户访问某个路由
  2. 路由守卫检查用户权限
  3. 权限通过后,加载对应的组件
  4. 组件获取数据,渲染页面

7. 权限控制

Tagtag Starter 前端实现了基于角色的权限控制(RBAC),包括:

7.1 路由权限

  • 动态路由生成:根据用户角色生成可访问的路由
  • 路由守卫:检查用户是否有权限访问某个路由

7.2 组件权限

  • 权限指令:使用 v-access 指令控制组件的显示和隐藏
  • 权限组件:使用 AccessControl 组件控制子组件的显示和隐藏

7.3 按钮权限

  • 按钮权限指令:使用 v-access 指令控制按钮的显示和隐藏

8. 国际化支持

Tagtag Starter 前端支持多语言切换,使用 Vue I18n 实现。

国际化配置

  • src/locales/langs/: 语言包文件
  • src/locales/index.ts: 国际化配置

使用方式

<template>
  <div>{{ $t('common.save') }}</div>
</template>

<script setup lang="ts">
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
</script>

9. 构建和部署

9.1 构建流程

  1. 安装依赖:pnpm install
  2. 开发模式:pnpm run dev
  3. 生产构建:pnpm run build
  4. 预览生产构建:pnpm run preview

9.2 构建优化

  • 代码分割:根据路由和组件分割代码
  • 懒加载:按需加载路由和组件
  • Tree Shaking:移除未使用的代码
  • 压缩:压缩 JavaScript、CSS 和 HTML

9.3 部署方式

  • 静态文件部署:将构建生成的静态文件部署到 CDN 或 Web 服务器
  • Docker 部署:使用 Docker 容器部署应用
  • Kubernetes 部署:使用 Kubernetes 管理容器化应用

10. 最佳实践

10.1 组件开发

  • 组件命名:使用 PascalCase 命名组件
  • 组件职责:每个组件负责一个独立的功能
  • 组件通信:使用 Props 和 Emits 进行组件通信
  • 组件测试:为组件编写单元测试

10.2 API 开发

  • API 命名:使用 RESTful API 风格
  • API 封装:统一封装 API 请求,处理错误和认证
  • API 文档:使用 Swagger 或其他工具生成 API 文档

10.3 状态管理

  • 状态设计:保持状态简洁,避免冗余
  • 状态划分:根据功能域划分状态模块
  • 异步处理:在 action 中处理异步逻辑

10.4 性能优化

  • 避免不必要的渲染:使用 v-memov-once 指令
  • 虚拟滚动:处理大量数据时使用虚拟滚动
  • 图片优化:使用适当的图片格式和大小
  • 懒加载:按需加载路由和组件

10.5 代码规范

  • 遵循 ESLint 和 Prettier 配置
  • 使用 TypeScript 严格模式
  • 注释规范:为复杂代码添加注释

11. 开发工具和流程

11.1 开发工具

  • VS Code:推荐的代码编辑器
  • Volar:Vue 3 开发插件
  • ESLint:代码质量检查
  • Prettier:代码格式化

11.2 开发流程

  1. 克隆代码仓库
  2. 安装依赖
  3. 启动开发服务器
  4. 编写代码
  5. 运行测试
  6. 提交代码
  7. 代码审查
  8. 合并代码
  9. 构建和部署

12. 测试策略

12.1 单元测试

使用 Vitest 进行单元测试,测试组件、工具函数和状态管理。

12.2 集成测试

测试组件之间的交互和 API 调用。

12.3 E2E 测试

使用 Cypress 进行端到端测试,测试完整的用户流程。

13. 监控和日志

13.1 应用监控

  • 使用 Sentry 或其他工具监控应用错误
  • 收集用户行为数据,分析应用使用情况

13.2 日志记录

  • 记录应用错误和警告
  • 记录关键操作日志
  • 使用日志分析工具分析日志

14. 未来规划

  • 支持微前端架构
  • 增强 TypeScript 类型支持
  • 优化性能和用户体验
  • 增加更多的 UI 组件和模板
  • 支持更多的国际化语言

总结

Tagtag Starter 前端架构采用现代化的设计理念和技术栈,基于 Vue 3 + TypeScript + Vite 构建,使用 Monorepo 结构管理代码。这种架构设计具有良好的可扩展性、可维护性和性能,适合构建复杂的企业级应用。

通过本文档的介绍,您应该对 Tagtag Starter 前端架构有了全面的了解。如果您想深入了解某个具体的模块或组件,可以查看相关的源代码和文档。