7.7 KiB
7.7 KiB
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负责同步与持久化。
- 高频交互(拖拽、连线)使用本地 state(如 ReactFlow 的
开发约定
- 文件命名:前端 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 只调用
- 错误处理:
- 服务层应返回可解释错误,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 storeruntimeStore.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
推荐的快速启动与手动检查点
- 安装依赖并启动开发服务器:
cd web
npm install
npm run dev
- 手动检查点:
- 打开 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 覆盖。