Files
JKVideo/feature.md
Developer ff659dcef7 优化
2026-03-14 18:25:13 +08:00

155 lines
6.2 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.
# 代码审查:优化建议与 Bug 清单
## 严重 Bug
### 1. ~~useComments 竞态条件~~ [已修复]
- **文件**: `hooks/useComments.ts`
- **问题**: `load()` 依赖 `[aid, page, loading, hasMore]``setPage(p => p + 1)` 触发新的 load 回调,可能重复请求或跳页
- **修复**: 改用 `pageRef` + `loadingRef` 避免依赖循环
### 2. ~~LoginModal 错误处理缺失~~ [已修复]
- **文件**: `components/LoginModal.tsx`
- **问题**: `login(result.cookie, '', '')` 传入空 uid/username`getUserInfo()` 调用无错误处理
- **修复**: 添加 try-catch 包裹登录+拉取用户信息流程
### 3. ~~NativeVideoPlayer loadPvData 未捕获 Promise 异常~~ [已修复]
- **文件**: `components/NativeVideoPlayer.tsx`
- **问题**: `loadPvData().then(...)` 没有 `.catch()`,且原来的 try-catch 无法捕获异步 Promise
- **修复**: 改为 `.then().catch()` 链式调用
### 4. BigVideoCard PanResponder 闭包陈旧
- **文件**: `components/BigVideoCard.tsx`
- **问题**: `useMemo` 依赖为 `[]`,但内部使用 `currentTimeRef``durationRef``screenWRef`,重构时容易引入 bug
- **状态**: 当前使用 ref 所以不会出错,但属于脆弱模式
## 性能问题
### 5. ~~index.tsx renderItem 未稳定~~ [已修复]
- **文件**: `app/index.tsx`
- **问题**: `renderItem` 依赖 `[visibleBigKey]`,每次可见项变化都重建回调
- **修复**: 改用 `visibleBigKeyRef` + 空依赖 `useCallback`
### 6. BigVideoCard 视频预加载无取消机制
- **文件**: `components/BigVideoCard.tsx`
- **问题**: 快速滑动时,所有可见卡片同时发起 `getPlayUrl` 请求,无取消/去抖
- **修复**: 增加可见性停留阈值或 AbortController
### 7. DanmakuList 动画值频繁创建
- **文件**: `components/DanmakuList.tsx`
- **问题**: 每次 drip interval 都创建新的 `Animated.Value`,弹幕密集时影响性能
- **修复**: 使用对象池复用 Animated.Value
### 8. LivePulse 动画堆叠
- **文件**: `components/LivePulse.tsx`
- **问题**: 组件快速卸载/重新挂载时,`Animated.loop()` 动画可能堆叠
## 错误处理
### 9. 缺少全局错误边界
- **文件**: `app/_layout.tsx`
- **问题**: 没有 React Error Boundary任何组件抛异常会导致白屏
- **修复**: 在根布局包裹 ErrorBoundary 组件
### 10. ~~WBI Keys 缓存无过期~~ [已修复]
- **文件**: `services/bilibili.ts`
- **问题**: `wbiKeys` 模块级变量缓存后永不过期B站 WBI 密钥每日更换
- **修复**: 添加 12 小时 TTL过期后自动刷新网络错误时回退到陈旧缓存
### 11. ~~getWbiKeys 无容错~~ [已修复]
- **文件**: `services/bilibili.ts`
- **问题**: 直接访问 `res.data.data.wbi_img`,结构不匹配时直接崩溃
- **修复**: 添加可选链检查 + try-catch + 陈旧缓存回退
### 12. ~~Cookie 解析脆弱~~ [已修复]
- **文件**: `services/bilibili.ts`
- **问题**: `split(';')[0].replace('SESSDATA=', '')` 假设 SESSDATA 是第一个 cookie 属性
- **修复**: 改为 `.find()` 查找包含 `SESSDATA=` 的 part
### 13. ~~useVideoDetail 静默吞错~~ [已修复]
- **文件**: `hooks/useVideoDetail.ts`
- **问题**: `.catch(() => {})` 吞掉重新获取播放数据时的错误,用户无感知
- **修复**: 改为 `console.warn` 输出
## 代码质量
### 14. ~~残留调试代码~~ [已修复]
- **文件**: `components/NativeVideoPlayer.tsx`
- **问题**: `console.log(r, "ddddddddddddd")` 和未使用的 `axios` 导入
- **修复**: 已移除
### 15. 类型安全问题
- **文件**: `app/index.tsx`
- **问题**: `router.push(\`/video/${bvid}\` as any)` 使用 `as any` 绕过类型检查
- **修复**: 正确定义路由类型
### 16. 未使用的导入
- **文件**: `components/VideoPlayer.tsx`
- **问题**: `Paths``expo-file-system` 导入但未使用
### 17. 魔法数字散落
- **文件**: 多处
- **问题**: `SWIPE_SECONDS = 90``HIDE_DELAY = 3000``DRIP_INTERVAL = 250` 等硬编码
- **修复**: 统一到 constants 文件
## API 使用
### 18. 无请求去重
- **文件**: `services/bilibili.ts`
- **问题**: BigVideoCard 和 NativeVideoPlayer 可能同时为同一视频发起 `getPlayUrl` 请求
- **修复**: 实现请求去重(相同参数复用 Promise
### 19. 无请求超时重试
- **文件**: `services/bilibili.ts`
- **问题**: 设置了 `timeout: 10000` 但无重试逻辑,弱网下直接失败
## UI/UX
### 20. ~~MiniPlayer 拖拽无边界~~ [已修复]
- **文件**: `components/MiniPlayer.tsx`
- **问题**: 拖拽可将迷你播放器移出屏幕外,无边界限制
- **修复**: 释放时 clamp 到屏幕范围内,超出部分用 spring 动画弹回
### 21. 无网络状态检测
- **问题**: 离线时所有 API 静默失败,用户无反馈
- **修复**: 使用 `@react-native-community/netinfo` 检测网络并提示
### 22. BigVideoCard 预加载无 Loading 态
- **问题**: 视频 URL 加载期间画面冻结,无骨架屏或加载动画
## 安全
### 23. SESSDATA 明文存储
- **文件**: `services/bilibili.ts` / `store/authStore.ts`
- **问题**: Cookie 存储在 AsyncStorage明文设备被攻破可泄露
- **修复**: 使用 `expo-secure-store` 存储敏感凭证
---
## 修复进度
| 优先级 | 项目 | 状态 |
|--------|------|------|
| **P0** | #1 竞态条件 | 已修复 |
| **P0** | #3 Promise 未捕获 | 已修复 |
| **P0** | #14 调试代码 | 已修复 |
| **P0** | #10 WBI 过期 | 已修复 |
| **P1** | #2 登录错误处理 | 已修复 |
| **P1** | #5 renderItem 稳定化 | 已修复 |
| **P1** | #11 getWbiKeys 容错 | 已修复 |
| **P1** | #12 Cookie 解析 | 已修复 |
| **P1** | #13 静默吞错 | 已修复 |
| **P2** | #20 MiniPlayer 边界 | 已修复 |
| **P1** | #9 错误边界 | 待修复 |
| **P2** | #6 预加载取消 | 待修复 |
| **P2** | #18 请求去重 | 待修复 |
| **P2** | #21 网络检测 | 待修复 |
| **P3** | #4 闭包陈旧 | 暂不修复ref模式可用 |
| **P3** | #7 动画池化 | 待修复 |
| **P3** | #8 动画堆叠 | 待修复 |
| **P3** | #15 类型安全 | 待修复 |
| **P3** | #16 未使用导入 | 待修复 |
| **P3** | #17 魔法数字 | 待修复 |
| **P3** | #19 超时重试 | 待修复 |
| **P3** | #22 Loading 态 | 待修复 |
| **P3** | #23 安全存储 | 待修复 |