# 代码修复计划 — 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 嵌套 `

` 标签 **文件**: `src/eula.ts` — 修正 HTML 结构,外层 `

` 改为 `

` --- ## 实施建议 ### 分批策略 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` | 配置调整 |