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 症状导航 + 小程序章节更新
80 lines
4.5 KiB
Markdown
80 lines
4.5 KiB
Markdown
# Taro 小程序穷尽性能审计报告
|
||
|
||
> 日期: 2026-05-14 | 范围: apps/miniprogram/ (124 TS/TSX 文件, 66 页面)
|
||
|
||
## 审计维度
|
||
|
||
4 个并行审计 agent 覆盖:同步阻塞操作、依赖体积、API 调用+内存管理、渲染性能+导航。
|
||
|
||
## 已修复的问题
|
||
|
||
### CRITICAL (6 项 — 全部已修复)
|
||
|
||
| # | 问题 | 文件 | 修复 |
|
||
|---|------|------|------|
|
||
| C1 | DataBuffer `while(true)` Sync Storage 无上限 | `ble/DataBuffer.ts` | 添加 `MAX_BUCKETS=20` 循环保护 |
|
||
| C2 | DataBuffer.push 每次同步序列化大桶 | `ble/DataBuffer.ts` | 同上,限制桶数 |
|
||
| C3 | `Math.max(...arr)` 展开大数组栈溢出风险 | `TrendChart/index.tsx`, `health/index.tsx` | 改用 `reduce` |
|
||
| C4 | `responseCache` Map 无大小上限 | `services/request.ts` | 添加 `MAX_CACHE_SIZE=100` + LRU 淘汰 |
|
||
| C5 | BLE 事件监听器累积(多次 connect 不移除旧监听) | `ble/BLEManager.ts` | 保存 handler 引用,connect 前先 off |
|
||
| C6 | `navigateToLogin` 用 navigateTo 可能栈溢出 | `utils/navigate.ts` | 改为 `reLaunch` |
|
||
|
||
### HIGH (7 项 — 全部已修复)
|
||
|
||
| # | 问题 | 文件 | 修复 |
|
||
|---|------|------|------|
|
||
| H1 | EcCanvas 死代码 + echarts 58MB 死依赖 | `components/EcCanvas/`, `package.json` | 删除文件 + 移除依赖 |
|
||
| H2 | 访客首页每次 useDidShow 重新下载所有 banner 图片 | `pages/index/index.tsx` | 移除 downloadFile,直接用 URL + lazyLoad |
|
||
| H3 | analytics 每次 track 两次 Sync Storage | `services/analytics.ts` | 内存队列 + 异步 `setStorage` |
|
||
| H4 | `request.ts` getCacheKey 每次请求同步读 patientId | `services/request.ts` | 内存缓存 `cachedPatientId` |
|
||
| H5 | 切换就诊人不清理请求缓存和 healthStore | `stores/auth.ts` | `setCurrentPatient` 中调用 `clearRequestCache` |
|
||
| H6 | logout 不清理 healthStore/pointsStore | `stores/auth.ts` | logout 中调用 `healthStore.clearCache()` |
|
||
| H7 | zod (5.5MB) + react-dom (4.4MB) 死依赖 | `package.json` | 移除两个未使用的依赖 |
|
||
| H8 | 25 个页面 useDidShow 无条件全量刷新 | 多个页面 | 4 tabBar 页改 `useThrottledDidShow` + 子包页面同步更新 |
|
||
| H9 | 12 处 `useAuthStore()` 无参数导致全 store 订阅 | 15 个文件 | 全部改为精确选择器模式(38 个订阅优化) |
|
||
|
||
### MEDIUM (已修复)
|
||
|
||
| # | 问题 | 文件 | 修复 |
|
||
|---|------|------|------|
|
||
| M1 | settings 清缓存 17 次同步 Storage 操作 | `pkg-profile/settings/index.tsx` | 改为异步 `getStorage`/`clearStorage`/`setStorage` |
|
||
| M2 | 6 个页面 JSX 渲染路径中调用 getStorageSync | 6 个 pkg-profile 页面 | 提取 `hasPatient` state,渲染时引用 state 而非 sync 调用 |
|
||
| M5 | health/index.tsx indicatorCapsules/healthItems 每次 render 重建 | `pages/index/index.tsx` | `useMemo` 包裹,依赖 `todaySummary` 子字段 |
|
||
| M6 | BLEManager 模块级单例导出 vs 页面独立创建双实例 | `services/ble/BLEManager.ts` | 移除 `export default new BLEManager()` |
|
||
| M7 | device-sync useDidShow cleanup 不生效 | `pages/device-sync/index.tsx` | 清理逻辑移至 `useEffect` return |
|
||
| M3 | AI 报告 sanitizeHtml 正则替换链 | `pages/ai-report/detail/index.tsx` | 合并 6 步 regex 为 2 步,合并 h1/h2/h3 为单步 |
|
||
| M4 | doctor 子包 barrel re-export 全量引入 | 17 个 doctor 页面 | `import * as doctorApi` → 直接子模块具名导入 |
|
||
| M8 | 聊天消息全量渲染无上限 | 2 个 consultation detail 页面 | 添加 `MAX_RENDER_MESSAGES=200` 渲染上限 + 截断提示 |
|
||
|
||
## 待后续修复的问题
|
||
|
||
### HIGH (记录但未在本次修复)
|
||
|
||
| # | 问题 | 文件 | 建议修复 |
|
||
|---|------|------|----------|
|
||
| H10 | 积分商城加载 100 商品只为查 1 个详情 | `pkg-mall/exchange` | 后端新增单品查询 API |
|
||
| H11 | auth restore 启动路径 6 次同步 Storage 读取 | `stores/auth.ts` | 改异步 + 合并读取 |
|
||
|
||
## 包体积审计
|
||
|
||
| 指标 | 值 |
|
||
|------|-----|
|
||
| 编译产物总大小 | 1.4 MB |
|
||
| 主包 (taro + app + vendors + common) | ~380 KB |
|
||
| 最大子包 (doctor, 18 页面) | 268 KB |
|
||
| 移除的死依赖 | echarts (58MB) + zod (5.5MB) + react-dom (4.4MB) |
|
||
|
||
## 正面发现
|
||
|
||
- Taro 4.x 编译产物干净,无 crypto-js 残留
|
||
- 所有列表页使用页面级 `useReachBottom` 而非 ScrollView(性能最佳实践)
|
||
- TabBar 图标均为 334 bytes 极简图标
|
||
- app.tsx 的 analytics 定时器和事件监听 cleanup 正确
|
||
- 无内联 base64 图片、无 require 图片资源
|
||
- 文章列表 Image 已正确设置 `lazyLoad`
|
||
|
||
## 编译验证
|
||
|
||
- `taro build --type weapp` 编译成功 (10.46s)
|
||
- 所有修复已确认包含在编译产物中
|