前端架构.md 19 KB

前端架构

本文引用的文件

  • package.json
  • vite.config.ts
  • main.ts
  • pages.json
  • tsconfig.json
  • App.vue
  • user.ts
  • audio.ts
  • request.ts
  • config.ts
  • storage.ts
  • debug.ts
  • MiniPlayer.vue
  • LazyImage.vue
  • index.ts

目录

  1. 引言
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排查指南
  9. 结论
  10. 附录

引言

本文件面向“AI有声书生成平台”的前端团队,系统性梳理基于 uniapp + Vue3 + TypeScript 的前端架构设计与实现要点。内容覆盖页面路由配置、组件层次结构、状态管理模式(Pinia)、跨平台适配策略(H5 与微信小程序)、UI 组件库与样式管理、构建与调试工具、性能优化、API 交互与错误处理、以及用户体验优化策略。目标是帮助开发者快速理解并高效迭代前端能力。

项目结构

前端工程位于 my-uniapp-vue3 目录,采用 uniapp 多端统一框架,结合 Vite 构建与 TypeScript 类型约束,配合 Pinia 实现状态管理,并通过自研工具链实现跨平台适配与调试。

  • 关键目录与文件

    • src/main.ts:应用入口,注册 Pinia 并初始化用户态
    • src/pages.json:页面与 TabBar 路由配置
    • src/store/*:Pinia 状态模块(用户、音频)
    • src/utils/*:通用工具(请求、配置、存储、调试)
    • src/components/*:可复用 UI 组件(迷你播放器、懒加载图片等)
    • src/types/index.ts:全局类型定义
    • vite.config.ts:Vite 代理与插件配置
    • package.json:脚本与依赖声明
    • tsconfig.json:TypeScript 编译配置

      graph TB
      A["应用入口<br/>src/main.ts"] --> B["状态管理<br/>Pinia"]
      B --> C["用户状态<br/>src/store/user.ts"]
      B --> D["音频播放状态<br/>src/store/audio.ts"]
      A --> E["页面路由<br/>src/pages.json"]
      A --> F["全局样式与生命周期<br/>src/App.vue"]
      A --> G["工具库<br/>src/utils/*"]
      G --> H["请求封装<br/>src/utils/request.ts"]
      G --> I["平台配置<br/>src/utils/config.ts"]
      G --> J["本地存储<br/>src/utils/storage.ts"]
      G --> K["调试工具<br/>src/utils/debug.ts"]
      A --> L["组件库<br/>src/components/*"]
      L --> M["迷你播放器<br/>src/components/MiniPlayer.vue"]
      L --> N["懒加载图片<br/>src/components/LazyImage.vue"]
      O["构建配置<br/>vite.config.ts"] --> A
      P["依赖与脚本<br/>package.json"] --> A
      Q["类型定义<br/>src/types/index.ts"] --> H
      Q --> C
      Q --> D
      

图表来源

  • main.ts:1-32
  • pages.json:1-211
  • user.ts:1-107
  • audio.ts:1-297
  • request.ts:1-207
  • config.ts:1-80
  • storage.ts:1-63
  • debug.ts:1-305
  • MiniPlayer.vue:1-166
  • LazyImage.vue:1-73
  • index.ts:1-89
  • vite.config.ts:1-24
  • package.json:1-65

章节来源

  • main.ts:1-32
  • pages.json:1-211
  • vite.config.ts:1-24
  • package.json:1-65
  • tsconfig.json:1-14

核心组件

  • 应用入口与全局初始化
    • 注册 Pinia,注入全局用户态初始化逻辑
    • 条件引入 H5 调试工具(vConsole)
  • 页面路由与 TabBar
    • pages.json 统一声明页面与 TabBar,支持自定义导航栏样式
  • 状态管理(Pinia)
    • 用户状态模块:登录、验证码发送、用户信息拉取、会员状态、登出与更新
    • 音频播放模块:音色列表、播放队列、播放控制、播放模式、进度与速率
  • 工具库
    • 请求封装:统一超时、重试、缓存、鉴权头、错误处理与登录态失效跳转
    • 平台配置:根据运行环境自动选择 API 地址(H5、小程序、APP)
    • 本地存储:跨端适配(H5 使用 localStorage,小程序/APP 使用 uni 存储)
    • 调试工具:页面切换、导航拦截、API 请求/响应日志、全局错误捕获
  • UI 组件
    • 迷你播放器:全局悬浮播放器,自动隐藏于播放页
    • 懒加载图片:占位图与渐显过渡,错误事件透传

章节来源

  • main.ts:1-32
  • pages.json:1-211
  • user.ts:1-107
  • audio.ts:1-297
  • request.ts:1-207
  • config.ts:1-80
  • storage.ts:1-63
  • debug.ts:1-305
  • MiniPlayer.vue:1-166
  • LazyImage.vue:1-73

架构总览

整体采用“入口初始化 + 路由配置 + 状态管理 + 工具库 + 组件库”的分层架构。多端统一通过 uniapp 抽象,平台差异通过条件编译与运行时判断实现。

graph TB
subgraph "入口与配置"
M1["src/main.ts"]
M2["src/pages.json"]
M3["vite.config.ts"]
M4["package.json"]
M5["tsconfig.json"]
end
subgraph "状态管理"
S1["src/store/user.ts"]
S2["src/store/audio.ts"]
end
subgraph "工具库"
U1["src/utils/request.ts"]
U2["src/utils/config.ts"]
U3["src/utils/storage.ts"]
U4["src/utils/debug.ts"]
end
subgraph "UI 组件"
C1["src/components/MiniPlayer.vue"]
C2["src/components/LazyImage.vue"]
end
subgraph "全局样式与生命周期"
G1["src/App.vue"]
end
M1 --> S1
M1 --> S2
M1 --> U1
M1 --> U2
M1 --> U3
M1 --> U4
M1 --> C1
M1 --> C2
M1 --> G1
M2 --> M1
M3 --> M1
M4 --> M1
M5 --> U1

图表来源

  • main.ts:1-32
  • pages.json:1-211
  • vite.config.ts:1-24
  • package.json:1-65
  • tsconfig.json:1-14
  • user.ts:1-107
  • audio.ts:1-297
  • request.ts:1-207
  • config.ts:1-80
  • storage.ts:1-63
  • debug.ts:1-305
  • MiniPlayer.vue:1-166
  • LazyImage.vue:1-73
  • App.vue:1-134

详细组件分析

页面路由与 TabBar 配置

  • pages.json 统一声明页面路径与导航样式,全局样式集中配置
  • TabBar 四个入口:首页、生成、生成书籍、我的,便于用户快速跳转
  • 页面级自定义导航样式,提升品牌一致性

章节来源

  • pages.json:1-211

状态管理模式(Pinia)

  • 用户状态模块
    • 状态:token、用户信息、会员状态
    • 计算属性:登录态、会员态
    • 方法:初始化、登录、发送验证码、获取用户信息、获取会员状态、登出、更新用户信息
  • 音频播放模块

    • 状态:音色列表、当前音频、播放队列、索引、播放状态、进度、时长、播放速率、播放模式
    • 方法:初始化音频上下文、获取音色、生成音频、播放/暂停/切换、上一首/下一首、处理播放模式、跳转、设置播放速率、设置播放列表、销毁上下文

      classDiagram
      class UserStore {
      +token
      +userInfo
      +memberStatus
      +isLoggedIn
      +isMember
      +initUser()
      +login(phone, code)
      +sendCode(phone)
      +fetchUserInfo()
      +fetchMemberStatus()
      +logout()
      +updateUserInfo(info)
      }
      class AudioStore {
      +voices
      +currentAudio
      +playlist
      +currentIndex
      +isPlaying
      +currentTime
      +duration
      +playRate
      +playMode
      +hasPlaylist
      +hasNext
      +hasPrev
      +initAudioContext()
      +fetchVoices()
      +generateAudio(text, voiceId, voiceParams)
      +play(audio)
      +pause()
      +resume()
      +togglePlay()
      +playPrev()
      +playNext()
      +handlePlayMode()
      +togglePlayMode()
      +seek(time)
      +setPlayRate(rate)
      +setPlaylist(list, index, autoPlay)
      +destroy()
      }
      

图表来源

  • user.ts:1-107
  • audio.ts:1-297

章节来源

  • user.ts:1-107
  • audio.ts:1-297

跨平台适配策略(H5 与微信小程序)

  • 平台识别与 API 地址选择
    • 通过条件编译与运行时判断,自动选择开发/生产环境下的 API 域名
    • H5 环境区分普通浏览器与微信小程序模拟器,分别走相对路径或真实域名
  • 本地存储适配
    • H5 使用 localStorage;小程序/APP 使用 uni 存储接口
  • 调试工具

    • H5 条件引入 vConsole(默认禁用),按需开启

      flowchart TD
      Start(["进入应用"]) --> Detect["检测运行平台"]
      Detect --> IsH5{"是否 H5?"}
      IsH5 --> |是| EnvCheck["检查是否为微信小程序模拟器"]
      EnvCheck --> |是| UseWeb["使用 Web 域名"]
      EnvCheck --> |否| UseH5["使用 H5 相对路径"]
      IsH5 --> |否| UseNative["使用原生平台配置"]
      UseWeb --> SetBase["设置 API 基础地址"]
      UseH5 --> SetBase
      UseNative --> SetBase
      SetBase --> End(["完成"])
      

图表来源

  • config.ts:27-66
  • storage.ts:1-63
  • main.ts:6-25

章节来源

  • config.ts:1-80
  • storage.ts:1-63
  • main.ts:1-32

UI 组件库与样式管理

  • 迷你播放器
    • 仅在非播放页且存在当前音频时显示
    • 封面颜色随音色动态变化,支持播放/暂停与下一首操作
    • 点击跳转播放器页面
  • 懒加载图片
    • 支持占位图与渐显过渡,错误事件透传
    • 可配置懒加载开关与加载模式

章节来源

  • MiniPlayer.vue:1-166
  • LazyImage.vue:1-73
  • App.vue:44-134

前端构建配置与开发调试

  • Vite 插件与代理
    • 使用 @dcloudio/vite-plugin-uni,配置 /api、/uploads、/videos 代理至后端服务
  • 脚本与依赖
    • 提供多端开发/构建脚本,支持 H5、微信小程序、快应用等平台
  • TypeScript 配置
    • 开启 sourceMap,路径别名 @/*,类型声明包含 @dcloudio/types

章节来源

  • vite.config.ts:1-24
  • package.json:1-65
  • tsconfig.json:1-14

与后端 API 的交互模式与错误处理

  • 请求封装
    • 统一超时、重试、缓存(GET 有效)、鉴权头(Authorization)、加载提示
    • 成功/失败响应兼容两种格式:{ code, data } 与 { success, data }
    • 登录态失效自动清理本地存储并跳转登录页
    • 429 频控、5xx 服务器错误、业务错误统一 toast 提示
  • 完整 URL 拼接

    • 对静态资源(如音频文件)使用后端服务器地址拼接

      sequenceDiagram
      participant Page as "页面组件"
      participant Store as "Pinia Store"
      participant Req as "请求封装<br/>request.ts"
      participant API as "后端 API"
      participant Auth as "鉴权与错误处理"
      Page->>Store : 调用方法如 login/generateAudio
      Store->>Req : 发起请求(url, options)
      Req->>API : uni.request(...)
      API-->>Req : 返回 {code|success, data|message}
      Req->>Auth : 校验登录态/错误码
      alt 登录失效
      Auth->>Req : 清理本地存储
      Auth->>Page : 跳转登录页
      else 正常
      Req-->>Store : 返回 data
      Store-->>Page : 更新状态
      end
      

图表来源

  • request.ts:35-197
  • user.ts:33-51
  • audio.ts:89-109

章节来源

  • request.ts:1-207
  • user.ts:1-107
  • audio.ts:1-297

全局调试与日志体系

  • 页面切换与导航拦截
    • 记录 navigateTo/redirectTo/switchTab/reLaunch/navigateBack 调用与失败
  • API 请求/响应日志
    • 输出方法、URL、参数、耗时、状态与数据
  • 全局错误捕获
    • 捕获 Promise 拒绝、JS 运行时错误与 uni.onError
  • 平台信息
    • 输出当前运行平台(App/H5/微信小程序)

章节来源

  • debug.ts:1-305
  • App.vue:1-38

依赖关系分析

  • 入口依赖
    • main.ts 依赖 Pinia、用户状态模块、调试工具初始化
  • 状态模块依赖
    • user.ts 依赖 request 与 storage
    • audio.ts 依赖 request 与 types
  • 工具库相互协作
    • request 依赖 config 与 debug
    • config 与 storage 为平台与存储适配提供基础
  • 组件依赖

    • MiniPlayer 依赖 audio store
    • LazyImage 为通用展示组件

      graph LR
      Main["src/main.ts"] --> Pinia["Pinia"]
      Main --> User["store/user.ts"]
      Main --> Audio["store/audio.ts"]
      Main --> Utils["utils/*"]
      User --> Req["utils/request.ts"]
      User --> Stor["utils/storage.ts"]
      Audio --> Req
      Audio --> Types["types/index.ts"]
      Utils --> Debug["utils/debug.ts"]
      Utils --> Cfg["utils/config.ts"]
      Mini["components/MiniPlayer.vue"] --> Audio
      Lazy["components/LazyImage.vue"] --> Types
      

图表来源

  • main.ts:1-32
  • user.ts:1-107
  • audio.ts:1-297
  • request.ts:1-207
  • config.ts:1-80
  • storage.ts:1-63
  • debug.ts:1-305
  • MiniPlayer.vue:1-166
  • LazyImage.vue:1-73
  • index.ts:1-89

章节来源

  • main.ts:1-32
  • user.ts:1-107
  • audio.ts:1-297
  • request.ts:1-207
  • config.ts:1-80
  • storage.ts:1-63
  • debug.ts:1-305
  • MiniPlayer.vue:1-166
  • LazyImage.vue:1-73
  • index.ts:1-89

性能考虑

  • 请求缓存与重试
    • GET 请求可配置 TTL 缓存,减少重复请求
    • 支持指数退避重试,提升弱网稳定性
  • 播放体验优化
    • 音频上下文事件驱动(onPlay/onPause/onEnded/onTimeUpdate),避免轮询
    • 播放模式切换与自动播放下一首逻辑内聚在 store,降低页面复杂度
  • 资源加载
    • 懒加载图片与渐显过渡,改善首屏渲染与感知性能
  • 构建与代理
    • Vite 插件与代理提升开发效率,减少跨域与二次代理成本

[本节为通用指导,无需列出具体文件来源]

故障排查指南

  • 登录态失效
    • 现象:调用接口返回 401 或提示登录
    • 处理:自动清理本地存储并跳转登录页
  • 请求过于频繁
    • 现象:返回 429,提示频率限制
    • 处理:遵循后端提示的冷却时间再试
  • 服务器错误
    • 现象:返回 5xx
    • 处理:toast 提示并记录日志,必要时重试
  • 网络异常
    • 现象:fail 回调触发
    • 处理:统一提示“网络请求失败”,检查代理与后端连通性
  • 调试定位
    • 使用 debug 工具输出页面切换、导航拦截、API 请求/响应与错误堆栈
    • H5 环境可按需启用 vConsole

章节来源

  • request.ts:135-167
  • debug.ts:194-278
  • main.ts:20-25

结论

该前端架构以 uniapp 为核心,结合 Vue3 + TypeScript + Pinia,形成高内聚、低耦合的多端统一方案。通过完善的工具库(请求、配置、存储、调试)与可复用组件,显著提升了开发效率与用户体验。建议在后续迭代中持续完善错误监控与埋点体系,进一步优化播放性能与弱网体验。

[本节为总结性内容,无需列出具体文件来源]

附录

  • 类型定义
    • 用户信息、音频条目、音色参数、音色、会员状态、API 响应、分页结果等
  • 开发与构建
    • 多端脚本、Vite 代理、TypeScript 路径别名与类型声明

章节来源

  • index.ts:1-89
  • package.json:1-65
  • vite.config.ts:1-24
  • tsconfig.json:1-14