优化: AI Chat全栈多批审查修复与架构清理(risk_level清理/路由解耦/工具渲染/测试补测/死代码)

This commit is contained in:
2026-06-18 22:57:19 +08:00
parent 0ca5d9805f
commit a2871a66e0
87 changed files with 5720 additions and 3012 deletions

View File

@@ -359,13 +359,13 @@
> UI 布局 localStorage + 模块级恢复的细节见 [归档文档](./功能决策记录-归档-2026-06-14.md)。
### 虚拟滚动:自研 IntersectionObserver + sentinel不引 vue-virtual-scroller [2026-06-17]
- **决策**AI Chat 消息列表虚拟滚动选**自研方案**——IntersectionObserver + sentinel div上下各一+ ResizeObserver 监听容器变化,仅渲染层裁剪不可见窗口卸载内容sentinel 占位保持 scrollHeight 不塌)。不选 vue-virtual-scroller 的 DynamicScroller。流式末条 pinnedKeys 保活不卸载
### 消息列表虚拟滚动:自研 → 彻底移除 [2026-06-17 → 2026-06-18]
- **决策**AI Chat 消息列表虚拟滚动选**自研方案**IntersectionObserver + sentinel + ResizeObserver仅渲染层裁剪**→ 2026-06-18 彻底移除**(删 useAiVirtualScroll.ts + AiChat.vue 移除全链路),消息恒渲染
- **原因/取舍**
- **vue-virtual-scroller 破坏既有布局**——DynamicScroller 接管滚动容器内部 DOM 结构 + 重排子节点顺序,与现有 `.ai-messages` `display: flex; flex-direction: column; gap: 14px` 布局冲突。同时破坏三处既有行为:① onMessagesScroll 的 wasNearBottom 边沿收起逻辑(依赖原生 scroll 事件和 scrollTop 计算);② isNearBottom / scrollToBottom / 「回到底部」按钮计算(依赖真实 scrollHeight③ 流式生成时自动滚到底部DynamicScroller 的滚动语义不同)
- **自研只做渲染裁剪**——不接管滚动容器、不改 DOM 结构、不动事件监听。sentinel div 用 `height: Npx` 占位保 scrollHeight 准确IO 触发时批量 mount/unmount 可见区间外消息组件。既有滚动/收起/流式/回到底部全零感知
- **pinnedKeys 保活**——流式生成中末条消息频繁更新,若被 IO 卸载再挂载会导致闪烁pinnedKeys 集合内的消息跳过卸载判断
- **状态**:✅ 已落地commit e38474b
- **不选 vue-virtual-scroller**——DynamicScroller 接管滚动容器 DOM + 重排子节点,破坏 `.ai-messages` flex/gap 布局 + onMessagesScroll(isNearBottom/scrollToBottom)/流式滚到底部既有逻辑
- **自研只做渲染裁剪**原方案——sentinel 占位保 scrollHeightIO mount/unmount 可见区间外消息pinnedKeys 保活流式末条
- **→ 彻底移除的取舍2026-06-18**:①**IO/RO 时序致重叠(移除主因)**——IO 判可见 + RO 测高度异步回调与 Vue 响应式交织,卸载分支 height=0 时 minHeight fallback 仍有竞态窗口reply1 移出 pinned + bubble 重建时 RO/IO 捕获 height=0 → slot 塌 0 → 后续上移重叠);多次修 fallback8abcd56+ 禁用裁剪0ca5d98验证重叠仍偶发shouldRender 恒 true 时 IO 仍设/清 sentinel inline minHeight 竞态源未除。②**消息量级不需要**——单会话几十条,恒渲染无性能问题。③**简化优于优化**——删 175 行 composable + AiChat 5 处调用,消除时序竞态源
- **状态**:✅ 2026-06-17 落地e38474b→ ❎ 2026-06-18 彻底移除(工作区待提交:删 useAiVirtualScroll.ts + AiChat.vue 移除 import/解构/setupVirtualScroll/watch lastStreamingRenderKey/template :ref+shouldRenderMsg 条件
## 应用启动 / 数据库配置