TraceStudio-dev/docs/web/frontend_v3_spec.md
2026-01-12 03:32:51 +08:00

128 lines
7.7 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.

# TraceStudio 前端 V3 开发规范
## 目标与愿景
- 目标:将 TraceStudio 打造成可编程的分析实验室Programmable Analysis Lab。前端负责交互与可视化、节点画布和操作体验。
- 愿景UI 保持轻量、可声明;所有业务和数据一致性逻辑下沉到 `core`(纯 TypeScriptUI 仅负责渲染与事件。
## 架构原则
- Core 与 Components 分离:
- `core`(纯 TypeScript无 React`StudioRuntime`、`GraphModel`、`NodeModel`、`PortModel`、服务(`RuntimeService`、`GraphService`)。
- `components`React/TSX界面组件仅通过 `RuntimeService` 与 core 交互。
- 单一职责:
- `GraphService`:图变更与校验(节点/边/端口/暴露/复制/删除等)。
- `RuntimeService`:系统编排(启动 / manifest / viewport / autosave / import/export对外代理并同步投影`syncGraphFromRuntime()`)。
- `StudioRuntime`SSOT真实运行时数据结构与序列化。
- StoreZustand仅作 projection/flags
- 仅保存 `rfNodes`, `rfEdges`, `graphVersion`, `viewport`, `manifestLoaded`, `loading`, `activeNodeId`, `propertyPanelVisible` 等。
- 禁止在 store 中实现业务逻辑。
- UI 事件流:
- 高频交互(拖拽、连线)使用本地 state如 ReactFlow 的 `useNodesState`/`useEdgesState`),交互结束时再提交至 `RuntimeService`/`GraphService`。
- 所有最终的 graph 变更通过 `GraphService` 执行,`RuntimeService` 负责同步与持久化。
## 开发约定
- 文件命名:前端 TS/TSX 使用 `kebab-case``PascalCase`组件Core 使用 `PascalCase` 类名。
- Manifest / node meta
- `param_schema`:建议为数组,每项包含 `name`, `type`, `label?`, `widget?`, `options?`, `min?`, `max?`
- `meta.category`:建议为数组(也可解析字符串 path用于 `NodePalette` 分组。
- `context_vars`:显式列出可被 `context` 模式消费的变量及其类型。
- API 使用:
- UI 只调用 `RuntimeService``RuntimeService.graph.*`,不直接改 `runtime`
- 服务层返回 boolean/id 或抛错UI 显示友好提示。
- 错误处理:
- 服务层应返回可解释错误UI 使用 toast/Modal 呈现并在图中高亮冲突节点。
## 性能策略
- 本地优先local-first UI使用本地 React state 优化交互流畅性。
- 防抖/节流viewport 写入采用 500ms 防抖,其他高频写入点也应参数化。
- 采样策略:预览使用采样,生产使用全量。
- 渲染优化:节点/边组件使用 `React.memo`、`useCallback`、`useMemo` 减少重绘。
## UX 规范
- 属性面板:支持 `static/context/exposed` 三种模式,`static<->exposed` 切换即时生效(调用 `RuntimeService.exposeParam/unexposeParam` 并同步)。
- NodePalette`category` 分组、支持搜索与目录过滤Files 面板作为并列 tab。
- 右键菜单UI 负责展示确认,动作委托给 `RuntimeService`,动作结果用 toast 显示。
## 测试与验收
- 集成测试覆盖关键流程create nodeconnectexpose/unexposeimport/exportautosave/restore。
- 使用 mock manifest 测试不同 `param_schema` 类型。
## 扩展点
- `custom_nodes/` 插件:后端节点插件实现 `TraceNode` 并提供 `get_metadata()`/`execute()`;前端应支持 `render_class`->Component 映射。
---
# TraceStudio 前端目录与文件说明
本文件对 `web/` 代码组织和每个重要文件/目录的作用进行说明,便于前端接手者快速定位与优化。
## 目录总览
- `web/`前端工程根目录React + Vite + TypeScript
- `web/src/`:应用源代码。
### web/src/components
- `App.tsx`:应用入口,组织 providers、路由和顶层容器。
- `AppShell.tsx`应用布局Header、左侧 NodePalette、画布 Workspace、右侧 PropertyPanel
- `HeaderBar.tsx`:顶部工具栏,包含 Run/Save/Import/Export/Settings。
- `Workspace.tsx`ReactFlow 画布实现,负责节点/边本地状态(`useNodesState`/`useEdgesState`)、拖拽、连接事件以及调用 `RuntimeService` 提交变更。
- `NodePalette.tsx`:左侧节点面板,按 `category` 分组、支持搜索与 Files tab拖拽节点到画布。
- `PropertyPanel.tsx`:右侧属性编辑器,渲染参数控件并调用 `RuntimeService.exposeParam/unexposeParam/updateNodeParams`
- `UniversalNode.tsx`:节点默认渲染器,渲染 title、ports、参数预览和高亮已暴露端口支持被特定 `render_class` 覆盖。
- `ContextMenu.tsx`右键上下文菜单UI 部分与 hook (`useContextMenuAction`) 分离。
- `widgets/`:小部件(`FilePicker.tsx`、`JsonEditor.tsx` 等)。
### web/src/core
- `api/`:与后端交互封装。
- `SchemaApi.ts`:获取 manifest、节点元数据等。
- `FileApi.ts`、`GraphApi.ts`:文件与 graph 相关的 REST wrapper如需
- `model/`:纯 TS Core无 React
- `StudioRuntime.ts`SSOT包含 `runtime.graph`、manifest 缓存、import/export workflow、viewport 存取方法。
- `GraphModel.ts`:图数据结构、节点/边逻辑、`upDimension` 传播与序列化。
- `NodeModel.ts`单个节点的数据模型params、inputs/outputs、meta包含 `exposeParamAsInput`/`removeExposedParam`。
- `PortModel.ts`:端口模型与 `getTypeInfo()` 逻辑type + dim
- `services/`:业务服务
- `RuntimeService.ts`系统级编排boot、reloadManifest、syncGraphFromRuntime、viewport 防抖、autosave、import/export。包含 `graph` 属性指向 `GraphService`
- `GraphService.ts`集中处理图变更create/remove/duplicate node/edge、updateNodeParams、expose/unexpose param、disconnect 等)。
- `store/`Zustand projection store
- `runtimeStore.ts`:保存视图投影与 flags`rfNodes`、`rfEdges`、`graphVersion`、`viewport`、`manifestLoaded`、`loading`、`activeNodeId`、`propertyPanelVisible` 等)。
- `types.ts`:共享类型定义。
### web/src/tests
- `TEST_INTEGRATION.js`:集成测试脚本样例;建议迁移到 Jest/Playwright 以实现自动化测试。
## 交互与依赖关系图(简述)
- UI 组件 -> 调用 -> `RuntimeService`(或 `RuntimeService.graph.*`-> `GraphService` -> `StudioRuntime`SSOT-> 更新 -> `RuntimeService.syncGraphFromRuntime()` -> 更新 `runtimeStore` 投影 -> React 渲染。
## 关键文件/类说明(快速查找)
- StudioRuntime: `web/src/core/model/StudioRuntime.ts`
- RuntimeService: `web/src/core/services/RuntimeService.ts`
- GraphService: `web/src/core/services/GraphService.ts`
- NodeModel: `web/src/core/model/NodeModel.ts`
- NodePalette: `web/src/components/NodePalette.tsx`
- Workspace: `web/src/components/Workspace.tsx`
- PropertyPanel: `web/src/components/PropertyPanel.tsx`
## 推荐的快速启动与手动检查点
1. 安装依赖并启动开发服务器:
```bash
cd web
npm install
npm run dev
```
2. 手动检查点:
- 打开 http://localhost:5173验证 NodePalette 节点列表与搜索。
- 拖拽节点到画布,检查拖拽流畅性与拖拽结束后节点是否出现在 `runtimeStore` 投影中。
- 右键节点,尝试 `delete/duplicate/disconnect`,观察 toast 提示与画布同步。
- 打开 `PropertyPanel`,切换参数模式到 `exposed`,确认端口立刻出现在节点上并在 `rfEdges` 中可连线。
## 交接建议给前端优化的 AI
- 提供 mock manifest 覆盖所有 `param_schema` 类型并测试text, number, range, checkbox, select, context, exposed。
- 做性能剖析React Profiler聚焦 `Workspace``UniversalNode` 渲染路径,优化不必要的 re-renders。
-`TEST_INTEGRATION.js` 迁移到自动化测试框架,增加关键流的 CI 覆盖。
---