前端问题排查.md 17 KB

前端问题排查

本文引用的文件

  • package.json
  • vite.config.ts
  • main.ts
  • config.ts
  • request.ts
  • storage.ts
  • debug.ts
  • pages.json
  • manifest.json
  • App.vue
  • index.html

目录

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

简介

本文件面向AI有声书生成平台的前端团队,聚焦于UniApp跨平台开发中的常见问题与排障策略。围绕以下主题展开:marked包Unicode正则兼容性、运行环境版本不一致、Android手机网络请求异常、window/document/localStorage兼容性、JSON.stringify循环引用崩溃、CSS gap属性不兼容等典型故障;并提供错误现象、根因分析、解决步骤、预防措施、条件编译最佳实践、API兼容性对照表与调试技巧。

项目结构

前端工程采用UniApp Vue3生态,基于Vite构建,支持多端(H5、App、小程序)统一开发。关键目录与文件:

  • 构建与运行:package.json脚本、vite.config.ts代理配置
  • 应用入口:main.ts创建应用、初始化Pinia、用户状态初始化、条件编译注入
  • 平台适配:config.ts按平台返回API地址、H5/APP/MP环境分支
  • 网络层:request.ts统一封装uni.request、重试、缓存、鉴权头、超时、错误处理
  • 存储层:storage.ts对localStorage/uni.storage进行条件编译适配
  • 调试:debug.ts全局错误捕获、API日志、页面生命周期日志、导航拦截
  • 配置:manifest.json、pages.json、App.vue、index.html

    graph TB
    A["应用入口<br/>main.ts"] --> B["状态管理<br/>Pinia"]
    A --> C["用户状态初始化<br/>useUserStore()"]
    A --> D["条件编译注入<br/>vConsole(H5)"]
    E["配置工具<br/>config.ts"] --> F["请求封装<br/>request.ts"]
    G["存储工具<br/>storage.ts"] --> F
    H["调试工具<br/>debug.ts"] --> F
    F --> I["网络层<br/>uni.request"]
    J["构建配置<br/>vite.config.ts"] --> K["代理/本地开发<br/>/api,/uploads,/videos"]
    

图示来源

  • main.ts:10-31
  • config.ts:44-66
  • request.ts:35-99
  • storage.ts:1-63
  • debug.ts:194-278
  • vite.config.ts:7-22

章节来源

  • package.json:1-65
  • vite.config.ts:1-24
  • main.ts:1-32
  • config.ts:1-80
  • request.ts:1-207
  • storage.ts:1-63
  • debug.ts:1-305

核心组件

  • 统一请求层:支持GET/POST/PUT/DELETE、鉴权头、重试、缓存、超时、错误码映射、429限流提示、401自动登出
  • 条件编译适配:H5/APP/MP环境差异、window/document/localStorage、plus.App事件
  • 平台路由与API:根据运行平台动态选择API基础地址,支持微信小程序模拟器识别
  • 调试与可观测:全局错误捕获、API请求/响应日志、页面切换日志、导航拦截器
  • 存储适配:H5使用localStorage,App/小程序使用uni.storage

章节来源

  • request.ts:35-99
  • config.ts:26-66
  • debug.ts:97-131
  • storage.ts:5-57

架构总览

下图展示从页面到服务端的关键调用链路,以及条件编译与平台适配点:

sequenceDiagram
participant Page as "页面组件"
participant Req as "请求封装<br/>request.ts"
participant Conf as "配置工具<br/>config.ts"
participant Net as "网络层<br/>uni.request"
participant Srv as "后端服务"
Page->>Req : 调用get/post/put/del
Req->>Conf : 获取API基础URL
Conf-->>Req : 返回平台适配后的URL
Req->>Net : 发起uni.request(含鉴权头/超时)
Net-->>Req : 返回响应(含code/data/message)
Req->>Req : 校验成功码/401/429/5xx
Req-->>Page : 成功数据或抛出错误

图示来源

  • request.ts:35-99
  • request.ts:102-168
  • config.ts:44-66

详细组件分析

组件A:统一请求层(request.ts)

  • 功能要点
    • 支持GET/POST/PUT/DELETE,可选重试、超时、缓存
    • 自动注入Authorization头(token来自storage)
    • 统一响应处理:兼容{code:0,data:...}与{success:true,data:...},401自动登出,429限流提示,5xx提示Toast
    • 统一错误日志输出(debug.ts)
  • 关键流程

    flowchart TD
    Start(["进入 request(url, options)"]) --> BuildHeaders["构建请求头<br/>Authorization/Content-Type"]
    BuildHeaders --> CacheCheck{"GET且启用缓存?"}
    CacheCheck --> |是| ReturnCache["命中缓存则返回"]
    CacheCheck --> |否| MakeReq["调用 makeRequest"]
    MakeReq --> UniReq["uni.request 发起请求"]
    UniReq --> Resp["处理响应"]
    Resp --> IsSuccess{"code==0 或 success==true?"}
    IsSuccess --> |是| Resolve["返回 data 或默认值"]
    IsSuccess --> |否| HandleErr["401登出/429限流/5xx提示/其他错误"]
    Resolve --> End(["结束"])
    HandleErr --> End
    ReturnCache --> End
    

图示来源

  • request.ts:35-99
  • request.ts:102-168

章节来源

  • request.ts:12-19
  • request.ts:48-99
  • request.ts:122-168

组件B:平台配置与条件编译(config.ts)

  • 功能要点
    • 根据运行平台返回API基础URL,区分H5/APP(Android/iOS)/小程序
    • H5环境支持生产/开发模式,支持微信小程序模拟器识别
  • 条件编译注意

    • H5/APP-PLUS/MP-WEIXIN分支需严格闭合,避免逻辑泄露
    • 平台判断依赖uni.getSystemInfoSync,需确保在合适时机调用

      flowchart TD
      PStart["getPlatform()"] --> H5Check{"是否H5?"}
      H5Check --> |是| H5Env["返回 'h5'"]
      H5Check --> |否| AppCheck{"是否APP-PLUS?"}
      AppCheck --> |是| SysInfo["读取系统信息(platform/system)"]
      SysInfo --> Plat{"android/ios?"}
      Plat --> |android| RetAndroid["返回 'android'"]
      Plat --> |ios| RetIOS["返回 'ios'"]
      Plat --> |other| RetAndroid2["兜底返回 'android'"]
      AppCheck --> |否| RetWeb["返回 'web'"]
      

图示来源

  • config.ts:26-42
  • config.ts:44-66

章节来源

  • config.ts:26-66

组件C:存储适配(storage.ts)

  • 功能要点
    • H5使用localStorage,App/小程序使用uni.storage
    • 统一封装token与用户信息的读写与清理
  • 兼容性注意

    • H5环境检测使用typeof window/document
    • JSON序列化/反序列化需保证数据可序列化

      flowchart TD
      SStart["isH5检测"] --> TokenGet["getToken()<br/>H5: localStorage<br/>App/MP: uni.storage"]
      SStart --> TokenSet["setToken()<br/>同上"]
      SStart --> UserInfoGet["getUserInfo()<br/>JSON.parse"]
      SStart --> UserInfoSet["setUserInfo()<br/>JSON.stringify"]
      

图示来源

  • storage.ts:5-57

章节来源

  • storage.ts:5-57

组件D:调试与可观测(debug.ts)

  • 功能要点
    • 全局错误捕获:window/unhandledrejection、uni.onError
    • API请求/响应日志:方法、URL、耗时、页面上下文
    • 页面生命周期与导航拦截:navigateTo/redirectTo/switchTab/reLaunch/navigateBack
    • 平台信息打印:getPlatformName
  • 使用建议

    • 生产环境可关闭DEBUG_ENABLED或按需开启
    • H5端可结合vConsole进行交互式调试

      sequenceDiagram
      participant Win as "window"
      participant Uni as "uni.onError"
      participant Dbg as "debug.ts"
      participant Log as "控制台"
      Win-->>Dbg : unhandledrejection/error
      Uni-->>Dbg : 错误回调
      Dbg->>Log : 输出错误信息(含堆栈)
      Dbg->>Log : API请求/响应日志
      Dbg->>Log : 页面切换/导航拦截日志
      

图示来源

  • debug.ts:97-131
  • debug.ts:158-191
  • debug.ts:212-278

章节来源

  • debug.ts:97-131
  • debug.ts:158-191
  • debug.ts:212-278

依赖分析

  • 构建与运行
    • Vite插件:@dcloudio/vite-plugin-uni
    • 代理:/api、/uploads、/videos指向本地3000端口
  • 运行时依赖

    • marked^4.3.0:Markdown渲染
    • vconsole^3.15.1:H5端调试面板
    • vue/pinia/katex/vue-i18n等

      graph LR
      Pkg["package.json"] --> Vite["@dcloudio/vite-plugin-uni"]
      Pkg --> Marked["marked ^4.3.0"]
      Pkg --> VC["vconsole ^3.15.1"]
      Vite --> Uni["UniApp 生态"]
      Marked --> Render["Markdown 渲染"]
      VC --> Debug["H5 调试"]
      

图示来源

  • package.json:39-51
  • vite.config.ts:1-24

章节来源

  • package.json:39-51
  • vite.config.ts:1-24

性能考虑

  • 请求缓存:GET请求可配置缓存与TTL,减少重复请求
  • 重试与超时:合理设置retry/retryDelay/timeout,避免阻塞UI线程
  • 代理与跨域:开发阶段通过Vite代理避免CORS问题
  • 条件编译:避免在非目标平台执行无用逻辑,减少包体与运行开销

[本节为通用指导,无需具体文件引用]

故障排查指南

1. marked包Unicode正则兼容性问题

  • 现象
    • Android真机或特定浏览器环境下,Markdown渲染出现异常或报错
  • 根因
    • marked内部正则在某些引擎中对Unicode范围支持不一致
  • 解决步骤
    • 升级marked至最新稳定版,确保正则兼容性
    • 如仍异常,尝试在H5端降级或替换渲染库,并通过条件编译隔离
  • 预防措施
    • 在CI中加入不同平台/浏览器的渲染回归测试
    • 对Markdown输入进行预处理与白名单校验

[本节为通用指导,无需具体文件引用]

2. 运行环境版本不一致

  • 现象
    • H5与App/小程序表现不一致,API地址或行为异常
  • 根因
    • 平台判断逻辑未覆盖所有分支,或环境变量差异导致分支走错
  • 解决步骤
    • 检查config.ts的条件编译分支是否闭合
    • 在main.ts/各页面入口打印平台信息,确认getPlatform()返回值
    • 确认NODE_ENV与构建脚本一致
  • 预防措施
    • 在入口处统一打印平台与版本信息
    • 使用单元测试覆盖config.ts的分支逻辑

章节来源

  • config.ts:26-66
  • main.ts:10-31

3. Android手机网络请求异常

  • 现象
    • Android真机无法访问API,或偶发超时/失败
  • 根因
    • HTTPS证书校验、明文HTTP被拦截、代理/域名配置不当
  • 解决步骤
    • 确认API基础URL为https,检查证书有效性
    • 在config.ts中针对android分支使用真实域名而非代理路径
    • 检查manifest.json中网络域名校验配置
  • 预防措施
    • 所有环境统一使用HTTPS
    • 在开发阶段验证Android真机连通性

章节来源

  • config.ts:14-24
  • config.ts:64-66
  • manifest.json

4. window/document/localStorage兼容性问题

  • 现象
    • H5端localStorage不可用,或App/小程序端window/document不存在
  • 根因
    • 未做条件编译判断,直接使用H5原生API
  • 解决步骤
    • 使用storage.ts提供的封装接口,内部已做isH5判断
    • 避免在非H5环境直接使用window/document
  • 预防措施
    • 统一通过storage.ts与config.ts进行平台适配

章节来源

  • storage.ts:5-57
  • config.ts:27-42

5. JSON.stringify循环引用崩溃

  • 现象
    • 页面或组件在序列化状态时报错,导致应用崩溃
  • 根因
    • 对象存在循环引用(如DOM节点、Vue组件实例、自引用字段)
  • 解决步骤
    • 使用安全序列化工具或手动剥离循环引用字段
    • 在debug.ts中捕获并记录序列化错误,定位问题对象
  • 预防措施
    • 状态设计避免自引用;必要时在持久化前进行脱环处理

章节来源

  • debug.ts:97-131
  • storage.ts:42-47

6. CSS gap属性不兼容

  • 现象
    • H5端布局错乱,某些Android WebView不识别gap
  • 根因
    • CSS Grid gap在部分WebView中支持不完整
  • 解决步骤
    • 使用传统margin/padding替代,或使用Flexbox + 伪元素
    • 通过条件编译为H5端注入polyfill或回退样式
  • 预防措施
    • 在UI组件库中统一规范间距实现方式

[本节为通用指导,无需具体文件引用]

7. 条件编译最佳实践

  • 规范
    • H5/APP-PLUS/MP-WEIXIN分支必须成对出现且闭合
    • 不要在非目标平台执行敏感操作(如plus.App事件)
    • 将平台特有逻辑收敛到config.ts/storage.ts等工具模块
  • 示例
    • 在config.ts中集中处理平台判断与URL选择
    • 在main.ts中仅做轻量初始化,复杂逻辑放入工具模块

章节来源

  • config.ts:26-42
  • main.ts:6-8

8. API兼容性对照表(建议)

  • 平台能力
    • H5:window/document、localStorage、fetch/XMLHttpRequest
    • App:plus.App事件、原生能力(按需引入)
    • 小程序:wx.*API、分包与权限
  • 建议在config.ts/debug.ts中维护平台能力检测函数,避免直接假设API可用

[本节为通用指导,无需具体文件引用]

9. 调试技巧

  • 启用全局错误捕获与API日志
  • 使用uni.addInterceptor监控导航行为
  • 在main.ts中按需启用vConsole(H5)
  • 通过debug.ts输出页面切换与参数信息,快速定位问题页面

章节来源

  • debug.ts:194-278
  • main.ts:20-25

结论

通过统一请求层、平台配置与条件编译、存储适配与调试工具,本项目在多端环境下具备较好的稳定性与可观测性。针对本文列出的典型问题,建议优先从平台判断、API地址、存储适配与调试日志入手排查,并建立跨端回归测试与版本一致性检查机制,持续降低跨平台风险。

[本节为总结性内容,无需具体文件引用]

附录

A. 关键文件清单与职责

  • package.json:构建脚本、依赖版本
  • vite.config.ts:开发代理与本地服务
  • main.ts:应用创建、Pinia、用户状态、条件编译注入
  • config.ts:平台判断与API地址选择
  • request.ts:网络请求统一封装
  • storage.ts:本地存储适配
  • debug.ts:全局错误捕获与API日志
  • pages.json/manifest.json/App.vue/index.html:页面路由、应用配置与入口HTML

章节来源

  • package.json:1-65
  • vite.config.ts:1-24
  • main.ts:1-32
  • config.ts:1-80
  • request.ts:1-207
  • storage.ts:1-63
  • debug.ts:1-305
  • pages.json
  • manifest.json
  • App.vue
  • index.html