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

7.7 KiB
Raw Permalink Blame History

TraceStudio 前端 V3 开发规范

目标与愿景

  • 目标:将 TraceStudio 打造成可编程的分析实验室Programmable Analysis Lab。前端负责交互与可视化、节点画布和操作体验。
  • 愿景UI 保持轻量、可声明;所有业务和数据一致性逻辑下沉到 core(纯 TypeScriptUI 仅负责渲染与事件。

架构原则

  • Core 与 Components 分离:
    • core(纯 TypeScript无 ReactStudioRuntimeGraphModelNodeModelPortModel、服务(RuntimeServiceGraphService)。
    • componentsReact/TSX界面组件仅通过 RuntimeService 与 core 交互。
  • 单一职责:
    • GraphService:图变更与校验(节点/边/端口/暴露/复制/删除等)。
    • RuntimeService:系统编排(启动 / manifest / viewport / autosave / import/export对外代理并同步投影syncGraphFromRuntime())。
    • StudioRuntimeSSOT真实运行时数据结构与序列化。
  • 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-casePascalCase组件Core 使用 PascalCase 类名。
  • Manifest / node meta
    • param_schema:建议为数组,每项包含 name, type, label?, widget?, options?, min?, max?
    • meta.category:建议为数组(也可解析字符串 path用于 NodePalette 分组。
    • context_vars:显式列出可被 context 模式消费的变量及其类型。
  • API 使用:
    • UI 只调用 RuntimeServiceRuntimeService.graph.*,不直接改 runtime
    • 服务层返回 boolean/id 或抛错UI 显示友好提示。
  • 错误处理:
    • 服务层应返回可解释错误UI 使用 toast/Modal 呈现并在图中高亮冲突节点。

性能策略

  • 本地优先local-first UI使用本地 React state 优化交互流畅性。
  • 防抖/节流viewport 写入采用 500ms 防抖,其他高频写入点也应参数化。
  • 采样策略:预览使用采样,生产使用全量。
  • 渲染优化:节点/边组件使用 React.memouseCallbackuseMemo 减少重绘。

UX 规范

  • 属性面板:支持 static/context/exposed 三种模式,static<->exposed 切换即时生效(调用 RuntimeService.exposeParam/unexposeParam 并同步)。
  • NodePalettecategory 分组、支持搜索与目录过滤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.tsxReactFlow 画布实现,负责节点/边本地状态(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.tsxJsonEditor.tsx 等)。

web/src/core

  • api/:与后端交互封装。
    • SchemaApi.ts:获取 manifest、节点元数据等。
    • FileApi.tsGraphApi.ts:文件与 graph 相关的 REST wrapper如需
  • model/:纯 TS Core无 React
    • StudioRuntime.tsSSOT包含 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:保存视图投影与 flagsrfNodesrfEdgesgraphVersionviewportmanifestLoadedloadingactiveNodeIdpropertyPanelVisible 等)。
  • types.ts:共享类型定义。

web/src/tests

  • TEST_INTEGRATION.js:集成测试脚本样例;建议迁移到 Jest/Playwright 以实现自动化测试。

交互与依赖关系图(简述)

  • UI 组件 -> 调用 -> RuntimeService(或 RuntimeService.graph.*-> GraphService -> StudioRuntimeSSOT-> 更新 -> 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. 安装依赖并启动开发服务器:
cd web
npm install
npm run dev
  1. 手动检查点:
  • 打开 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聚焦 WorkspaceUniversalNode 渲染路径,优化不必要的 re-renders。
  • TEST_INTEGRATION.js 迁移到自动化测试框架,增加关键流的 CI 覆盖。