Files
hms/docs/discussions/2026-05-14-uniapp-debugging.md
iven 8f353946e1 fix(mp): T40 UI 审计修复 — 28 项设计系统合规 + 安全加固 + 讨论记录
T40 UI 审计修复(60 页面全覆盖):
- 新增 $acc-d/$wrn-d 渐变中间色变量,修复首页轮播渐变硬编码
- 替换 8 处裸 white 为 $white 设计变量(5 个 SCSS 文件)
- 修复 7 处触摸目标 40/44px → 48px(健康/消息/咨询/预约/首页)
- 3 页面新增 Loading 状态(体征录入/个人中心/就诊人添加)
- statusTag 移除硬编码布局值,改用 SCSS mixin 控制
- 医生端 14 页面架构 Hook 层补充(useThrottledDidShow 替换 useEffect)
- 移除 action-inbox 未使用 import

安全 P0 修复:
- JWT 中间件加固:token 类型校验 + 过期预检 + 类型别名简化
- 速率限制增强:滑动窗口 + 暴力破解防护
- analytics handler 错误处理完善

文档:
- T40 审计报告(24 PASS / 36 PASS_WITH_ISSUES / 0 NEEDS_WORK)
- 5 份 DevTools/性能审计讨论记录
- wiki 症状导航 + 小程序章节更新
2026-05-14 23:12:54 +08:00

98 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# UniApp 小程序调试记录
> 日期: 2026-05-14 | 分支: feat/media-library-banner
## 已解决的问题
### 1. crypto-js 导致 DevTools 卡死 (CRITICAL)
**现象:** 微信开发者工具打开 uni-app 项目后,所有页面导航(`navigateTo`/`switchTab`/`reLaunch`)均报错 `The "fd" argument must be of type number. Received undefined`DevTools 完全无响应。
**根因:** `crypto-js` 包在初始化时尝试通过 `commonjsRequire` 加载 Node.js 的 `crypto` 模块vendor.js 第 8113-8115 行)。微信 DevTools 运行在 Node.js 环境中,`require("crypto")` 被执行但 `crypto` 模块期望 `fd`(文件描述符)为数字,而 DevTools 环境不提供有效的 fd导致整个 JS 运行时崩溃。
**修复:** 移除 `crypto-js` 依赖,`utils/secure-storage.ts` 改为直接明文存储(因为 `VITE_ENCRYPTION_KEY` 未配置时加密本来就不生效)。敏感数据通过 HTTPS + 后端加密保护。
**影响文件:**
- `src/utils/secure-storage.ts` — 移除 crypto-js 引用
- `package.json` — 移除 crypto-js 依赖
- `vendor.js` — 从 10086 行降至 8070 行
**Taro 版本影响:** 已确认 Taro 版本存在完全相同的问题(`src/utils/secure-storage.ts` 同样引用 crypto-js。已于 2026-05-14 同步修复:移除 crypto-js 依赖,改写为明文存储降级。编译产物验证无 crypto-js 残留。
### 2. 401 无限循环风险 (HIGH)
**现象:** `request.ts` 中 401 处理程序重试请求时没有最大重试次数限制,可能导致 `401 → refresh → retry → 401 → ...` 无限循环。
**修复:** 添加 `retryCount401` 计数器和 `MAX_401_RETRY = 1` 限制。
### 3. 登录后 redirectTo 子包页面 (HIGH)
**现象:** `login/index.vue` 中医生角色登录后用 `redirectTo` 导航到子包页面 `/pages-sub/doctor/index`,可能不可靠。
**修复:** 改为 `reLaunch`
### 4. Profile 页面 loadPatients 时序问题 (MEDIUM)
**现象:** `onMounted` 中调用 `loadPatients()`,但此时 `authStore.user` 可能还没通过 `onShow``restore()` 恢复。
**修复:**`loadPatients()` 移到 `onShow` 回调中,在 `restore()` 之后执行。
### 5. automationAudits 配置缺失
**现象:** uni-app 的 `manifest.json` 中缺少 `automationAudits: true`,导致 MCP 连接时 DevTools 的自动化端口不开启。
**修复:**`manifest.json``mp-weixin.setting` 中添加 `"automationAudits": true`
## 待解决的问题
### 6. reLaunch 后 navigateTo 失败 (INVESTIGATING)
**现象:** `wx.reLaunch({ url: '/pages/index/index' })` 成功后,`wx.navigateTo` 到子包页面报 `timeout`。MCP 的 `navigate` 工具有时超时但页面实际已加载。
**可能原因:**
- uni-app 的 `navigateTo` 在 tabBar 页面上有特殊行为
- 子包首次加载耗时较长automator 超时 vs 实际加载中)
- uni-app 运行时的 navigateTo 封装添加了额外异步开销
**状态:** 需要进一步调查。MCP navigate 超时后页面可能仍在后台加载成功。
## Taro 版本同步修复
> 2026-05-14 下午 — 同步修复 Taro 版本(主项目)
### 7. Taro login 页面 redirectTo 子包 (HIGH)
**现象:** `apps/miniprogram/src/pages/login/index.tsx` 第 19 行使用 `Taro.redirectTo({ url: '/pages/doctor/index' })`,与 uni-app 相同问题。
**修复:** 改为 `Taro.reLaunch`
### 8. Taro request.ts 401 无限重试 (HIGH)
**现象:** `apps/miniprogram/src/services/request.ts` 中 401 处理递归调用 `request()` 无最大重试次数限制。
**修复:** 添加 `retryCount401` 计数器和 `MAX_401_RETRY = 1` 限制,与 uni-app 修复一致。
### 9. Taro navigateTo:fail timeout (INVESTIGATING)
**现象:** 用户报告 DevTools 控制台显示 `navigateTo:fail timeout``SharedArrayBuffer` 警告、`<scroll-view> padding` 警告。
**分析:**
- 编译产物已确认无 crypto-js 残留grep 验证通过)
- Taro auth restore 已在 App 层处理(`useEffect` + `useDidShow`),无时序问题
- `navigateTo:fail timeout` 可能是旧构建残留错误或 DevTools 本身性能问题
- 已完成编译Webpack: Compiled successfully in 10.30s),修复已包含在产物中
**状态:** 需要用新编译产物重新打开 DevTools 验证。
## MCP 连接配置
**关键配置:** `.mcp.json``WEAPP_PROJECT_PATH` 指向 `dist/dev/mp-weixin`dev 编译输出)。
**启动流程:**
1. 运行 `npx uni -p mp-weixin` 启动 dev 编译
2. 等待编译完成(约 20 秒)
3. `"D:/微信web开发者工具/cli.bat" auto --project "G:/hms/apps/miniprogram-uniapp/dist/dev/mp-weixin" --auto-port 9420`
4. MCP `connect` 连接
**注意:** 必须先关闭所有 DevTools 实例再启动,否则会打开错误的项目。