mirror of
https://gh-proxy.org/https://github.com/tiajinsha/JKVideo
synced 2026-07-08 07:28:37 +08:00
6.2 KiB
6.2 KiB
代码审查:优化建议与 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 安全存储 | 待修复 |