TraceStudio-dev/docs/web/frontend_v3_spec.md

128 lines
7.7 KiB
Markdown
Raw Normal View History

2026-01-12 03:32:51 +08:00
# 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 覆盖。
---