# 页面路由 **本文引用的文件** - [pages.json](file://my-uniapp-vue3/src/pages.json) - [main.ts](file://my-uniapp-vue3/src/main.ts) - [App.vue](file://my-uniapp-vue3/src/App.vue) - [manifest.json](file://my-uniapp-vue3/src/manifest.json) - [user.ts](file://my-uniapp-vue3/src/store/user.ts) - [request.ts](file://my-uniapp-vue3/src/utils/request.ts) - [storage.ts](file://my-uniapp-vue3/src/utils/storage.ts) - [index.vue(首页)](file://my-uniapp-vue3/src/pages/index/index.vue) - [login.vue(登录页)](file://my-uniapp-vue3/src/pages/login/index.vue) - [mine.vue(我的页)](file://my-uniapp-vue3/src/pages/mine/index.vue) - [vite.config.ts](file://my-uniapp-vue3/vite.config.ts) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考量](#性能考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本文件面向“AI有声书生成平台”的前端路由体系,围绕 UniApp 的页面路由配置与运行时行为进行系统化梳理。重点覆盖以下方面: - pages.json 的页面声明、窗口样式与 TabBar 配置 - 路由守卫机制与页面生命周期管理 - 页面间通信方式与权限控制 - 与 Vue Router 的差异及在 UniApp 中的特殊处理 - 动态路由、嵌套路由、懒加载与 SEO 优化建议 - 实战最佳实践与常见问题排查 ## 项目结构 本项目采用 UniApp + Vue 3 + Vite 的技术栈,路由配置集中在 pages.json,页面通过 uni-app 的导航 API 进行跳转,全局状态通过 Pinia 管理。 ```mermaid graph TB subgraph "应用入口" A["App.vue
应用生命周期(onLaunch/onShow/onHide)"] B["main.ts
创建应用实例/初始化用户状态"] C["manifest.json
应用元信息/平台能力"] end subgraph "路由与页面" D["pages.json
页面清单/窗口样式/TabBar"] E["各页面组件
如 pages/index/index.vue 等"] end subgraph "状态与网络" F["store/user.ts
用户状态/Pinia"] G["utils/request.ts
统一请求/鉴权/重试/缓存"] H["utils/storage.ts
跨端存储封装"] end subgraph "开发与构建" I["vite.config.ts
代理/插件"] end A --> B B --> F B --> G D --> E F --> E G --> E I --> D ``` 图表来源 - [App.vue:1-134](file://my-uniapp-vue3/src/App.vue#L1-L134) - [main.ts:1-32](file://my-uniapp-vue3/src/main.ts#L1-L32) - [manifest.json:1-52](file://my-uniapp-vue3/src/manifest.json#L1-L52) - [pages.json:1-211](file://my-uniapp-vue3/src/pages.json#L1-L211) - [user.ts:1-107](file://my-uniapp-vue3/src/store/user.ts#L1-L107) - [request.ts:1-207](file://my-uniapp-vue3/src/utils/request.ts#L1-L207) - [storage.ts:1-63](file://my-uniapp-vue3/src/utils/storage.ts#L1-L63) - [vite.config.ts:1-24](file://my-uniapp-vue3/vite.config.ts#L1-L24) 章节来源 - [pages.json:1-211](file://my-uniapp-vue3/src/pages.json#L1-L211) - [main.ts:1-32](file://my-uniapp-vue3/src/main.ts#L1-L32) - [App.vue:1-134](file://my-uniapp-vue3/src/App.vue#L1-L134) - [manifest.json:1-52](file://my-uniapp-vue3/src/manifest.json#L1-L52) - [vite.config.ts:1-24](file://my-uniapp-vue3/vite.config.ts#L1-L24) ## 核心组件 - 页面清单与窗口样式 - pages.json 中的 pages 数组定义每个页面的 path 与 style(导航栏标题、自定义导航等) - globalStyle 定义全局导航栏与背景色 - tabBar 定义底部标签页及其对应页面 - 应用生命周期与初始化 - App.vue 在 onLaunch 中初始化用户状态并应用夜间模式 - main.ts 创建应用实例并注入 Pinia,初始化用户状态 - 状态与权限 - store/user.ts 管理 token、用户信息、会员状态与登录登出流程 - utils/request.ts 在请求头中携带 Authorization,并在 401 时触发自动跳转登录 - 导航与跳转 - 页面内通过 uni.navigateTo/switchTab/reLaunch 等 API 实现页面跳转 - 登录页在登录成功后根据当前页面栈决定 navigateBack 或 switchTab 章节来源 - [pages.json:1-211](file://my-uniapp-vue3/src/pages.json#L1-L211) - [App.vue:1-134](file://my-uniapp-vue3/src/App.vue#L1-L134) - [main.ts:1-32](file://my-uniapp-vue3/src/main.ts#L1-L32) - [user.ts:1-107](file://my-uniapp-vue3/src/store/user.ts#L1-L107) - [request.ts:1-207](file://my-uniapp-vue3/src/utils/request.ts#L1-L207) ## 架构总览 UniApp 的路由体系由“配置驱动 + 运行时导航 API”构成。pages.json 决定页面清单与 TabBar,运行时通过 uni-app 的导航 API 控制页面栈与跳转行为;全局状态与网络层负责权限校验与数据获取。 ```mermaid sequenceDiagram participant U as "用户" participant P as "页面组件" participant R as "路由导航API" participant S as "用户状态(Pinia)" participant N as "网络层(request)" participant B as "后端" U->>P : 触发跳转/进入页面 P->>R : uni.navigateTo/switchTab/reLaunch R-->>P : 页面栈变化/页面显示 P->>S : 读取登录状态/会员状态 alt 未登录 P->>N : 调用登录接口 N-->>P : 成功后写入token/用户信息 P->>R : reLaunch/switchTab 跳转首页 else 已登录 P->>N : 拉取业务数据 N->>B : 发起带Authorization的请求 B-->>N : 返回数据/401 alt 401 N->>R : reLaunch 跳转登录页 end end ``` 图表来源 - [index.vue(首页):231-262](file://my-uniapp-vue3/src/pages/index/index.vue#L231-L262) - [login.vue(登录页):101-134](file://my-uniapp-vue3/src/pages/login/index.vue#L101-L134) - [mine.vue(我的页):264-274](file://my-uniapp-vue3/src/pages/mine/index.vue#L264-L274) - [request.ts:135-146](file://my-uniapp-vue3/src/utils/request.ts#L135-L146) - [user.ts:32-46](file://my-uniapp-vue3/src/store/user.ts#L32-L46) ## 详细组件分析 ### pages.json 配置详解 - 页面路径与窗口样式 - 每个页面以 path 指向相对路径,style 中可设置 navigationBarTitleText、navigationStyle(custom 表示自定义导航栏) - 适用于首页、创建页、历史页、我的页、播放页、登录页、收藏页、搜索页、专辑/合辑页、书籍生成功能、视频生成功能、设置、订单、发布、歌单、草稿、webview、支付结果/确认、支付宝二维码等 - 全局样式 - globalStyle 控制全局导航栏文字颜色、标题、背景色与页面背景色 - TabBar - tabBar.list 中的 pagePath 指向底部标签页对应的页面 - 文案 text 显示在 TabBar 上 章节来源 - [pages.json:1-211](file://my-uniapp-vue3/src/pages.json#L1-L211) ### 路由守卫机制与页面生命周期 - 生命周期 - App.vue 的 onLaunch 在应用启动时执行,用于初始化用户状态与夜间模式 - 页面组件可通过 onShow/onHide/onLoad 等生命周期钩子感知页面显示/隐藏 - 权限守卫 - 登录页在登录成功后根据当前页面栈决定返回上一页或跳转 Tab 页 - 我的页 onShow 中若检测到未登录则跳转登录页 - 网络层在收到 401 时清除 token 并跳转登录页 ```mermaid flowchart TD Start(["页面显示"]) --> CheckLogin["检查登录状态"] CheckLogin --> |未登录| GoLogin["跳转登录页"] CheckLogin --> |已登录| FetchData["拉取业务数据"] FetchData --> Resp{"请求结果"} Resp --> |401| ClearToken["清除token并跳转登录"] Resp --> |其他| Done(["渲染完成"]) GoLogin --> Done ClearToken --> Done ``` 图表来源 - [login.vue(登录页):118-125](file://my-uniapp-vue3/src/pages/login/index.vue#L118-L125) - [mine.vue(我的页):264-274](file://my-uniapp-vue3/src/pages/mine/index.vue#L264-L274) - [request.ts:135-146](file://my-uniapp-vue3/src/utils/request.ts#L135-L146) 章节来源 - [App.vue:10-25](file://my-uniapp-vue3/src/App.vue#L10-L25) - [login.vue(登录页):101-134](file://my-uniapp-vue3/src/pages/login/index.vue#L101-L134) - [mine.vue(我的页):264-274](file://my-uniapp-vue3/src/pages/mine/index.vue#L264-L274) - [request.ts:135-146](file://my-uniapp-vue3/src/utils/request.ts#L135-L146) ### 页面间通信方式 - 参数传递 - 通过 uni.navigateTo 等 API 的 url 参数携带查询字符串或路径参数 - 示例:首页跳转播放页、专辑详情页均通过查询参数传入 id - 全局状态共享 - 使用 Pinia store 在页面间共享用户信息、会员状态等 - 事件与消息 - 可通过 uni.$emit/$off/$once 或自定义事件总线在页面间传递消息(本项目未显式使用) 章节来源 - [index.vue(首页):231-262](file://my-uniapp-vue3/src/pages/index/index.vue#L231-L262) ### uniapp 路由与 Vue Router 的区别与特殊处理 - 不同点 - uniapp 路由由 pages.json 声明式配置驱动,运行时通过 uni-app API 控制页面栈 - Vue Router 是前端 SPA 路由,基于浏览器 History/Hash 模式 - 特殊处理 - 自定义导航栏:pages.json 中 navigationStyle: "custom",页面内自行实现导航栏 - TabBar:通过 tabBar.list 指定底部标签页,使用 uni.switchTab 切换 - 页面栈:uni-app 有原生页面栈概念,navigateTo/redirectTo/switchTab/redirectTo/reLaunch 影响页面栈结构 章节来源 - [pages.json:5-8](file://my-uniapp-vue3/src/pages.json#L5-L8) - [pages.json:191-208](file://my-uniapp-vue3/src/pages.json#L191-L208) ### 动态路由与嵌套路由 - 动态路由 - 通过在 pages.json 中定义带占位符的 path,结合 uni.navigateTo 的参数传递实现动态路由 - 示例:专辑详情页通过 id 参数区分不同专辑 - 嵌套路由 - uniapp 不支持传统 Web 的嵌套路由,但可通过 TabBar 子页面组合实现类似效果(如“我的”下的多个子页面) 章节来源 - [index.vue(首页):244-247](file://my-uniapp-vue3/src/pages/index/index.vue#L244-L247) ### 懒加载策略 - 页面级懒加载 - 通过按需引入页面组件或拆分页面,减少首屏加载体积 - 资源懒加载 - 图片懒加载、骨架屏占位、滚动触底加载更多 - 网络懒加载 - 首屏仅请求必要数据,后续滚动或交互再请求更多数据 章节来源 - [index.vue(首页):9-31](file://my-uniapp-vue3/src/pages/index/index.vue#L9-L31) - [index.vue(首页):184-207](file://my-uniapp-vue3/src/pages/index/index.vue#L184-L207) ### SEO 优化方案 - 页面标题与描述 - 在 pages.json 的 style.navigationBarTitleText 设置页面标题 - 全局标题可在 globalStyle.navigationBarTitleText 设置 - 结构化数据 - 对于公开内容页面,可在页面内输出结构化数据(如 JSON-LD),提升搜索引擎识别度 - 静态资源优化 - 使用 CDN、压缩与缓存策略,提升页面加载速度 章节来源 - [pages.json:5-7](file://my-uniapp-vue3/src/pages.json#L5-L7) - [pages.json:180-184](file://my-uniapp-vue3/src/pages.json#L180-L184) ## 依赖关系分析 - 配置依赖 - pages.json 决定页面清单与 TabBar,直接影响导航与页面栈 - 运行时依赖 - App.vue 与 main.ts 负责应用初始化与用户状态注入 - store/user.ts 与 utils/request.ts 共同实现权限校验与自动跳转 - 构建与代理 - vite.config.ts 提供 /api、/uploads、/videos 代理,便于开发联调 ```mermaid graph LR P["pages.json"] --> T["TabBar/页面清单"] M["main.ts"] --> U["App.vue"] U --> S["store/user.ts"] S --> R["utils/request.ts"] R --> B["后端API"] V["vite.config.ts"] --> R ``` 图表来源 - [pages.json:1-211](file://my-uniapp-vue3/src/pages.json#L1-L211) - [main.ts:1-32](file://my-uniapp-vue3/src/main.ts#L1-L32) - [App.vue:1-134](file://my-uniapp-vue3/src/App.vue#L1-L134) - [user.ts:1-107](file://my-uniapp-vue3/src/store/user.ts#L1-L107) - [request.ts:1-207](file://my-uniapp-vue3/src/utils/request.ts#L1-L207) - [vite.config.ts:1-24](file://my-uniapp-vue3/vite.config.ts#L1-L24) 章节来源 - [pages.json:1-211](file://my-uniapp-vue3/src/pages.json#L1-L211) - [main.ts:1-32](file://my-uniapp-vue3/src/main.ts#L1-L32) - [App.vue:1-134](file://my-uniapp-vue3/src/App.vue#L1-L134) - [user.ts:1-107](file://my-uniapp-vue3/src/store/user.ts#L1-L107) - [request.ts:1-207](file://my-uniapp-vue3/src/utils/request.ts#L1-L207) - [vite.config.ts:1-24](file://my-uniapp-vue3/vite.config.ts#L1-L24) ## 性能考量 - 页面栈管理 - 合理使用 uni.switchTab 与 uni.navigateTo,避免过深页面栈导致内存压力 - 数据缓存 - request.ts 提供请求缓存(GET + TTL),减少重复请求 - 骨架屏与懒加载 - 首屏使用骨架屏,滚动触底加载更多,降低白屏时间 - 构建优化 - vite.config.ts 配置代理,减少跨域与联调成本;生产环境启用压缩与缓存 章节来源 - [request.ts:20-55](file://my-uniapp-vue3/src/utils/request.ts#L20-L55) - [index.vue(首页):9-31](file://my-uniapp-vue3/src/pages/index/index.vue#L9-L31) - [vite.config.ts:7-22](file://my-uniapp-vue3/vite.config.ts#L7-L22) ## 故障排查指南 - 登录态异常 - 现象:访问受保护接口返回 401 - 排查:检查 token 是否存在、是否过期;确认 request.ts 是否正确注入 Authorization;确认网络层是否触发 reLaunch - 页面跳转异常 - 现象:跳转后页面栈混乱 - 排查:确认使用 uni.switchTab/uni.navigateTo/uni.reLaunch 的场景是否正确;避免在 Tab 页中使用非 Tab 跳转 - 夜间模式不生效 - 现象:切换夜间模式后页面颜色未更新 - 排查:确认 App.vue 是否正确应用夜间模式类名;确认页面样式是否包含夜间模式分支 - 开发联调失败 - 现象:/api /uploads /videos 请求失败 - 排查:确认 vite.config.ts 代理配置是否正确;确认后端服务是否启动 章节来源 - [request.ts:135-146](file://my-uniapp-vue3/src/utils/request.ts#L135-L146) - [App.vue:28-37](file://my-uniapp-vue3/src/App.vue#L28-L37) - [vite.config.ts:7-22](file://my-uniapp-vue3/vite.config.ts#L7-L22) ## 结论 本项目的路由体系以 pages.json 为配置核心,结合 uni-app 导航 API 与 Pinia 状态管理,实现了清晰的页面组织、完善的权限控制与良好的用户体验。通过合理的生命周期管理、请求缓存与懒加载策略,能够在多端环境中保持稳定的性能表现。未来可在动态路由参数校验、SEO 结构化数据与更细粒度的页面懒加载方面进一步优化。 ## 附录 - 最佳实践清单 - 使用 pages.json 统一声明页面与 TabBar - 在 App.vue 与 main.ts 中集中初始化用户状态 - 在 store/user.ts 中集中处理登录/登出/会员状态 - 在 utils/request.ts 中统一处理鉴权、重试与缓存 - 使用骨架屏与懒加载优化首屏体验 - 使用 vite.config.ts 的代理提升开发联调效率