# TraceStudio 前端 V3 开发规范 ## 目标与愿景 - 目标:将 TraceStudio 打造成可编程的分析实验室(Programmable Analysis Lab)。前端负责交互与可视化、节点画布和操作体验。 - 愿景:UI 保持轻量、可声明;所有业务和数据一致性逻辑下沉到 `core`(纯 TypeScript),UI 仅负责渲染与事件。 ## 架构原则 - 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,真实运行时数据结构与序列化。 - Store(Zustand)仅作 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 node,connect,expose/unexpose,import/export,autosave/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 覆盖。 ---