Files
HyperBilibili/.mimocode/plans/1783084400288-jolly-rocket.md
T
2026-07-03 21:33:27 +08:00

253 lines
10 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、风险与性能问题
## 修复优先级总览
| 阶段 | 问题数 | 描述 |
|------|--------|------|
| P0 紧急 | 8 | 功能完全不可用、崩溃、安全漏洞 |
| P1 高 | 8 | 数据损坏、启动失败、CI 失效 |
| P2 中 | 14 | 功能异常、性能退化、潜在隐患 |
| P3 低 | 11 | 代码质量、工具链现代化 |
---
## P0 紧急修复(功能不可用/崩溃)
### 1. 回复功能 — API 调用交换 + 未声明变量
**文件**: `src/pages/reply/replys/replys.ux`
- **L64-77**: `GiveTreeReply``GiveSecReply` 调用语义反了,交换调用
- **L97**: `this.input_text` 未声明,在 `private` data 中添加 `input_text: { content: "" }`
### 2. 音乐播放 — `api` 未定义
**文件**: `src/pages/video/player/player.ux`
- **L782,822,1261,1461,1495**: `api.getSongUrl()` / `api.getLyric()` 调用但 `api` 未导入
- 需要创建 `src/bilibiliclient/music/music.ts` 模块(或找到正确的 API 来源),在文件顶部导入并赋值给 `api`
### 3. 动态详情 — `typeof` 比较恒为 true
**文件**: `src/pages/app/features/dynamic/detail/detail.ux`
- **L87**: `typeof this.dyn != Object``typeof this.dyn !== "object"`
### 4. 空回复检查 — 字符串与数字比较
**文件**: `src/pages/video/videodetail/videodetail.ux`
- **L202**: `evt.detail.content === 0``!evt.detail.content || evt.detail.content.length === 0`
### 5. Settings JSON.parse 崩溃
**文件**: `src/settings.ts`
- **L37**: 用 try-catch 包裹 `JSON.parse(data)`catch 中保持默认 SETTINGS 并 log 警告
### 6. App 启动 Promise 无错误处理
**文件**: `src/app.ux`
- **L44-50**: 用 try-catch 包裹每个 await,或用 `Promise.allSettled` 并行执行非关键初始化
- 关键初始化(`savedcontent.initialize`)失败应显示错误页面
- 非关键初始化(`getNetworkType`)失败可降级为默认值
### 7. HTTP 追踪 URL(调试遗留)
**文件**: `src/usertracker.ts`
- **L5**: 取消注释 L4 的 HTTPS URL,删除或注释 L5 的 HTTP 内网地址
### 8. asyncapi `access()` 语义错误
**文件**: `src/asyncapi/file.ts`
- **L161**: `fail` 回调中 `reject(...)``resolve(false)`,使调用方能用布尔值判断文件是否存在
---
## P1 高优先级修复
### 9. API 响应空检查链
**文件**: `src/bilibiliclient/api/request.ts`
- **L60, L91**: `return response.data` 前增加对 `response``response.data` 的 null 检查
- 创建 `safeData(response)` 辅助函数,统一处理 `response.data.code !== 0` 的错误情况
- 在所有 bilibiliclient 子模块中使用此辅助函数
### 10. 文章图片空引用
**文件**: `src/articletools.ts`
- **L39**: 在访问 `dom.attributes.src` 前增加 `dom.attributes && dom.attributes.src` 检查
- **L49**: 第二个 `parseInt(dom.attributes.height)``parseInt(dom.attributes.width)`
### 11. 页面返回键崩溃
**文件**: `src/ui/ui.ts`
- **L55**: 增加 `pageStack.length >= 2` 判断,不足时跳过返回动画
- **L57-58**: 增加 `global.vmPool[lastPageName]` 存在性检查
### 12. VmPool GC 逻辑错误
**文件**: `src/ui/ui.ts`
- **L21**: `return``continue`
### 13. 构建脚本不传播失败
**文件**: `scripts/build_s3s4.py`, `scripts/build_rw5.py`
- **L8**: `os.system("yarn run build")``subprocess.run(["yarn", "run", "build"], check=True)`
- 同时更新 import 语句添加 `subprocess`
### 14. buildtools.py 异常吞掉
**文件**: `scripts/buildtools.py`
- **L18**: `Exception(...)``raise Exception(...)`
- **L27-31**: 用 `with open(...) as f:` 替换裸 `open()`
### 15. ESLint 配置缺失
**文件**: 新建 `eslint.config.mjs`
- 创建 ESLint flat config 文件,兼容 ESLint 9
- 或将 `package.json` 中 ESLint 降级到 `^8.x` 并保留旧 `.eslintrc`
### 16. Husky hooks 未版本控制 + API 过时
**文件**: `.gitignore`, `husky.sh`
-`.gitignore` 中删除 `.husky/`
- 用 Husky v9 API 重写 `husky.sh``husky init` + 直接写 `.husky/pre-commit``.husky/commit-msg` 脚本)
---
## P2 中优先级修复
### 17. bvid 默认值类型错误
**文件**: `src/pages/video/videodetail/videodetail.ux`
- **L84**: `bvid: 1``bvid: ""`
### 18. 数组初始化为对象
**文件**: `src/pages/user/user.ux` L53, `src/pages/search/search/search.ux` L32
- `masterpiece: {}``masterpiece: []`
- `hotwords: {}``hotwords: []`
### 19. 音频事件处理被覆盖
**文件**: `src/pages/video/player/player.ux`
- **L404-407**: 删除 `onInit` 中重复的 `audio.ontimeupdate` 赋值,或合并逻辑到 `bindAudioEvents`
### 20. fetchDefaultPlaylist 空函数
**文件**: `src/pages/video/player/player.ux`
- **L665-668**: 实现函数体或标记为 TODO 并添加用户提示
### 21. Settings 加载竞态
**文件**: `src/settings.ts`
- 重构 `loadSettings` 返回 `Promise`,在 `app.ux``await` 完成后再继续初始化
### 22. HTML 解析器嵌套标签问题
**文件**: `src/htmlparser.ts`
- **L38**: 对于嵌套标签,改用递归下降解析而非单正则匹配
- 或引入轻量 HTML 解析库
### 23. 收藏夹名称硬编码
**文件**: `src/bilibiliclient/video/action.ts` L23, L47
- 改用 `folder.id === 0`(B站默认收藏夹 ID 固定为 0)或通过 API 响应中的 `default` 字段判断
### 24. 存储索引无验证
**文件**: `src/savedcontent.ts`
- **L38**: JSON.parse 后增加 `Array.isArray()` 检查和元素结构验证
### 25. 日志无缓冲
**文件**: `src/logger/logger.ts`
- 实现内存缓冲区,批量写入(如每 10 条或每 5 秒 flush 一次)
- 添加日志文件轮转机制(保留最近 N 个文件)
### 26. VmPool GC 定时器优化
**文件**: `src/ui/ui.ts`
- 在页面销毁事件中触发 GC,替代 10 秒定时器
### 27. 动画引用泄漏
**文件**: `src/animation/engine.ts`
-`SequenceAnim.stop()``DomAnim.stop()` 中从 `global.animations` 移除自身引用
### 28. request.ts 无超时
**文件**: `src/bilibiliclient/api/request.ts`
- `getRequest``postRequest` 增加 `timeout` 参数(默认 15s),传入 `fetch.fetch()`
### 29. Content-Length 冗余设置
**文件**: `src/bilibiliclient/message/message.ts`
- **L51**: 删除手动 `Content-Length` 设置,让 HTTP 客户端自动处理
### 30. Stylelint 废弃规则
**文件**: `.stylelintrc.js`
- **L10-11**: 删除 `color-hex-case``color-hex-length`,或安装 `stylelint-stylistic` 插件
---
## P3 低优先级改进
### 31. formatNumber 边界处理
**文件**: `src/tools.ts` L3-13 — 增加 `NaN`/负数/undefined 守卫
### 32. funnytips 日期捕获时机
**文件**: `src/funnytips.ts` L1 — `new Date()` 移入 `getTips()` 函数内部
### 33. jumpcheck storage 无 fail 回调
**文件**: `src/jumpcheck.ts` — 增加 `fail` 回调,导航到错误页面
### 34. Object.assign 原型组装
**文件**: `src/bilibiliclient/client.ts` L55-68 — 长期重构为 class extends 或 mixin 模式(影响范围大,建议单独 PR)
### 35. quickapp.config.js 健壮性
**文件**: `quickapp.config.js`
- L7: `execSync` 包裹 try-catch
- L10: 相对路径 → `path.resolve(__dirname, ...)`
- L12-17: 模板字符串值转义引号和反斜杠
### 36. manifest.json 生产日志级别
**文件**: `src/manifest.json` L53 — `"log"``"warn"`(或在构建脚本中覆盖)
### 37. .prettierrc.js 废弃选项
**文件**: `.prettierrc.js` L10 — `jsxBracketSameLine``bracketSameLine`
### 38. buildInfoContent 注入风险
**文件**: `quickapp.config.js` L12-17 — 对插值值做 JSON.stringify 转义
### 39. PII 泄漏
**文件**: `quickapp.config.js` L8 — 移除 `os.userInfo().username`,改用 CI 环境变量或固定标识
### 40. logger %c 样式无效
**文件**: `src/logger/logger.ts` L61 — 移除 `%c` 和 style 参数
### 41. eula.ts 嵌套 `<p>` 标签
**文件**: `src/eula.ts` — 修正 HTML 结构,外层 `<p>` 改为 `<div>`
---
## 实施建议
### 分批策略
1. **第 1 批 (P0)**: 8 个修复,每个独立可测,建议逐个 PR
2. **第 2 批 (P1)**: 8 个修复,工具链相关可合并为一个 PR
3. **第 3 批 (P2)**: 14 个修复,按模块分组(player 模块、bilibiliclient 模块、基础设施)
4. **第 4 批 (P3)**: 11 个改进,可在后续迭代中逐步完成
### 验证方式
- 每个修复在 NuttX 设备或模拟器上手动验证对应功能
- 构建脚本修复:运行 `python scripts/build_s3s4.py``python scripts/build_rw5.py` 确认退出码
- 工具链修复:运行 `yarn lint` 确认 ESLint 正常工作
- CI 修复:推送到 `next-gen` 分支确认 GitHub Actions 流水线绿色
### 关键文件清单
| 文件 | 修改类型 |
|------|---------|
| `src/pages/reply/replys/replys.ux` | Bug 修复 |
| `src/pages/video/player/player.ux` | Bug 修复 + 功能实现 |
| `src/pages/app/features/dynamic/detail/detail.ux` | Bug 修复 |
| `src/pages/video/videodetail/videodetail.ux` | Bug 修复 |
| `src/settings.ts` | 健壮性修复 |
| `src/app.ux` | 错误处理 |
| `src/usertracker.ts` | 安全修复 |
| `src/asyncapi/file.ts` | 语义修复 |
| `src/bilibiliclient/api/request.ts` | 健壮性修复 |
| `src/articletools.ts` | Bug 修复 |
| `src/ui/ui.ts` | Bug 修复 + 性能 |
| `src/tools.ts` | 边界处理 |
| `src/htmlparser.ts` | Bug 修复 |
| `src/logger/logger.ts` | 性能优化 |
| `src/savedcontent.ts` | 健壮性修复 |
| `src/animation/engine.ts` | 内存泄漏修复 |
| `src/funnytips.ts` | Bug 修复 |
| `src/jumpcheck.ts` | 健壮性修复 |
| `src/bilibiliclient/video/action.ts` | 兼容性修复 |
| `src/bilibiliclient/message/message.ts` | 代码清理 |
| `scripts/build_s3s4.py` | CI 修复 |
| `scripts/build_rw5.py` | CI 修复 |
| `scripts/buildtools.py` | Bug 修复 |
| `quickapp.config.js` | 健壮性 + 安全 |
| `package.json` | 依赖更新 |
| `.prettierrc.js` | 配置更新 |
| `.stylelintrc.js` | 配置更新 |
| `husky.sh` | 重写 |
| `.gitignore` | 配置修复 |
| `.github/workflows/main.yml` | CI 修复 |
| `eslint.config.mjs` | 新建 |
| `src/pages/user/user.ux` | Bug 修复 |
| `src/pages/search/search/search.ux` | Bug 修复 |
| `src/eula.ts` | HTML 修正 |
| `src/manifest.json` | 配置调整 |