3.9 KiB
3.9 KiB
前端重构续办说明(next_steps_2)
本文基于
doc/frontend/next_steps.md的上下文,记录当前阶段的新进展、注意事项和下一步工作计划,供接力开发者参考。凡是与旧版 UI/交互存在歧义时,以doc/frontend/legacy_ui_spec.md及static/old_version_backup/前端备份目录为最终权威。
最新状态(相较上一版 next_steps)
- Pinia 引入:
static/src/main.ts已创建 Pinia 实例;useUiStore/useConversationStore落地,侧栏/会话列表基本信息改由 store 管理。App 通过mapWritableState读取这两个 store。 - 组件化进展:
ConversationSidebar、LeftPanel、FocusPanel、TokenDrawer、PersonalizationDrawer、QuickMenu已单独成组件。- 聊天区拆成
ChatArea.vue(含全部 action 块)、输入区拆成InputComposer.vue,App.vue只负责传状态/事件。
- 兼容逻辑:
- 自动滚动、思考块滚动锁、工具卡片等逻辑仍在
app.ts中,通过对新组件暴露的rootEl / getThinkingRef引用继续工作。 - Quick Menu/Settings/工具禁用/压缩对话等入口仍走原 methods,只是事件链路转接到了组件。
- 自动滚动、思考块滚动锁、工具卡片等逻辑仍在
待办事项
-
Pinia Store 拆分补全
- 参考
doc/frontend/componentization_plan.md,逐步迁移app.ts的数据/方法至useChatStore、useInputStore、useToolStore、useResourceStore、usePersonalizationStore等。 - 控制流程:先搬 state,再迁 actions/watch,最后清理
app.ts中重复逻辑。
- 参考
-
聊天/动作组件细分
- 目前的
ChatArea仍包含大量内联模板,可按行动类型(Thinking/Text/System/Modify/Tool/Summary)拆成独立子组件,增强可读性与复用性。 - Markdown 渲染、工具卡片展示、thinking-scroll 等复杂逻辑建议拆到 composable(如
useMarkdownRenderer、useToolPayloadRenderer)。
- 目前的
-
输入区状态/事件整合
- 将
inputMessage、inputLineCount、inputIsFocused、quickMenuOpen等迁入 store 或 composable;InputComposer 只负责展示,避免app.ts持有大量 ref。 - 文件上传逻辑(
handleFileSelected、uploadSelectedFile)可以移至useUploadStore或专用 composable,配合 InputComposer 的事件使用。
- 将
-
Socket/轮询拆分
- 现有 socket 事件与轮询仍在
app.ts,需抽出useLegacySocket、usePolling等组合式函数,让各 store 订阅自己关心的事件。
- 现有 socket 事件与轮询仍在
-
Overlay/Toast 组件化
- ToastStack/ConfirmDialog/EasterEggOverlay/ContextMenu 仍在
App.vue,后续需转成AppShell或独立组件,并提供订阅 API。
- ToastStack/ConfirmDialog/EasterEggOverlay/ContextMenu 仍在
-
样式与测试
- 长期目标是按模块拆分
style.css,但当前仍以遗留 CSS 为准。组件化完成后再考虑 Sass 模块化。 - 继续保持
npm run build通过;若引入 Pinia store/composable,补充单元测试/故事(可选)以防 regression。
- 长期目标是按模块拆分
推荐执行顺序
- 完成 Input/Chat 相关 store/composable 拆分,移除
App.vue的大部分 refs 和 watchers。 - 逐步把资源/工具/子智能体等模块迁至对应 store,同时将轮询/Socket 事件拆出。
- 在 store/composable 稳定后,再处理 Overlay/Toast/EasterEgg 等全局 UI。
- 全量对照
static/old_version_backup/前端备份与legacy_ui_spec做细节校验,确保折叠/aria/title 动作一致。
注意事项
- 任何新逻辑都需以
legacy_ui_spec和static/old_version_backup/前端备份为准,确保视觉、交互、API 行为不偏离旧版。 - 操作 DOM 时尽量通过组件暴露出的 ref/composable,而不是直接访问
$refs。拆分后应逐步删除app.ts中的 DOM 引用。 - 保持现有 API / Socket 事件名不变;若有必要增加事件,请先在文档中说明。
- 在大规模迁移前,先写好过渡层(store/composable),避免一次性修改导致回退困难。