docs: 新增并更新产品战略、技术设计与商业化规划文档

- 新增 AI 时代下的 StructRail 战略定位与发展路线图,明确 AI 集成方向
- 更新前端可视化库设计方案,细化架构、技术挑战与商业化结合点
- 重构商业化策略文档为 Q&A 形式,深入探讨市场、产品与增长策略
This commit is contained in:
2026-02-22 22:36:48 +08:00
parent a9eaaa6023
commit 0e61e4f5b9
3 changed files with 313 additions and 109 deletions

View File

@@ -1,91 +1,94 @@
# 前端可视化库设计案 (@structrail/viz)
# 前端可视化库设计案 (`@structrail/viz`)
本文档描述了将平台前端渲染逻辑沉淀为独立可视化库的设计构想。
## 1. 核心目标
- **解耦**:将 Tracer SDK数据生成与前端渲染逻辑数据展示完全分离。
- **复用**:打造一个通用的、可嵌入的算法可视化库,服务于 StructRail 平台及第三方场景博客、文档、IDE 插件)。
- **标准**:作为 Tracer Protocol 的标准消费者,建立可视化渲染的事实标准。
## 1. 项目定位
## 2. 架构设计:确定性状态机 (Deterministic State Machine)
我们将“数据生成”Tracer SDK与“数据展示”Visualization Lib完全解耦旨在沉淀一套标准化的、可嵌入的前端可视化引擎
* **Tracer SDK (后端/客户端)**:负责生成标准化的、语言无关的 JSON 指令流Trace Protocol
* **Visualization Lib (前端)**:负责解析指令流,重建数据状态,并提供交互式的可视化组件。
这套库不仅服务于 StructRail 平台,未来也可被嵌入到博客、电子书或教学文档中,成为算法可视化的基础设施。
## 2. 核心架构 (Architecture)
库的核心遵循 **Player + Store + Renderer** 的分层架构本质上是一个支持时间旅行Time Travel的确定性状态机。
采用 **Player + Store + Renderer** 的分层架构确保时间旅行Time Travel的可靠性
### 2.1 Player (播放器/控制器)
* **职责**:负责解析 Tracer 生成的 JSON 指令流控制播放进度Frame/Step)。
* **功能**:提供 `play()`, `pause()`, `next()`, `prev()`, `seek(index)` 等 API。
* **特性**:它不关心具体怎么画,只关心“当前是第几步”以及“播放速度”
- **职责**:解析 JSON 指令流控制时间轴Play, Pause, Seek, Speed)。
- **特性**
- 维护当前帧索引 `currentIndex`
- 支持步进Step和连续播放。
- 处理“自动暂停”指令(如 `tracer.wait()`)。
### 2.2 Store (状态仓库/沙盒)
* **职责**:负责根据指令重构数据结构状态。
* **机制**维护一个“影子内存”Shadow Memory
* 当 Player 处于第 0 步时Store 是空的
* 当收到 `ArrayTracer.create` 指令时Store 里建立一个数组模型
* 当收到 `patch` 指令时Store 更新对应数组的元素值。
* 当收到 `pick` 指令时Store 标记对应元素为“高亮状态”。
* **输出**:它能在任何时间点,输出一份**只读的、标准化的数据快照 (Snapshot)** 给渲染层。
- **职责**维护“影子内存”Shadow Memory根据指令计算数据结构状态。
- **机制**
- **增量计算**:基于 immer.js 或类似机制只存储指令序列和初始状态通过重放Replay或关键帧Keyframe技术快速计算任意时刻的状态
- **快照 (Snapshot)**:向渲染层提供只读的、标准化的数据快照
- **State(t) = Apply(InitialState, Events[0...t])**
### 2.3 Renderer (渲染器/组件库)
* **职责**:纯粹的 UI 展示层View遵循 `f(state) => UI` 原则。
* **实现**:可以使用 React/Vue 组件,也可以是 Canvas/WebGL针对大规模数据
* **特点**:它完全不知道“指令”的存在,它只接收 `Store` 给它的快照
* 例如:`<ArrayVisualizer data={[1, 2, 3]} highlights={[1]} />`
- **职责**:纯 UI 展示层,遵循 `UI = Render(State)` 原则。
- **实现**
- **DOM/SVG 渲染器**:用于常规数据结构(数组、链表、树),支持 CSS 动画和高质量文本渲染
- **Canvas/WebGL 渲染器**:用于大规模数据(如 10w+ 节点的图、矩阵热力图)。
- **组件化**:提供 `<ArrayVisualizer>`, `<GraphVisualizer>` 等独立组件。
## 3. 库的形态设计 (API Preview)
## 3. 关键技术挑战与策略 (Advanced Technical Considerations)
如果这个库被开发出来,它在前端项目中的使用方式可能如下(以 React 为例)
为了确保该库能适应复杂的互联网环境(移动端、嵌入式、高性能场景),需重点关注以下方面
### 3.1 响应式与移动端适配 (Responsive & Mobile First)
- **自适应布局**Renderer 需具备流式布局能力。例如 `ArrayVisualizer` 在窄屏(手机/VS Code 侧边栏)下应自动切换为“折行显示”或“垂直列表模式”,避免横向滚动。
- **触控交互**:设计移动端友好的交互模式(如长按代替 Hover双指缩放代替滚轮
### 3.2 样式隔离与嵌入性 (Style Isolation)
- **Shadow DOM**:推荐使用 Web Components (Shadow DOM) 封装渲染器,彻底隔离宿主页面(如博客全局 CSS的样式干扰。
- **CSS Modules / CSS-in-JS**:作为备选方案,确保类名哈希化,防止污染宿主环境。
### 3.3 性能降级与 LOD (Level of Detail)
- **自动后端切换**:根据数据规模动态选择渲染后端。
- 节点 < 500使用 SVG交互性好调试方便
- 节点 > 500自动降级为 Canvas/WebGL高性能
- **LOD 策略**:在缩放或快速播放时,自动隐藏非关键细节(如节点文本、阴影),保证渲染帧率。
### 3.4 状态序列化与分享 (Serialization)
- **State Export**:支持将当前 Store 的状态快照导出为 JSON。
- **Deep Link**:支持将状态编码为 URL 参数(如 `?state=base64...`),实现“分享当前步骤”功能。
### 3.5 插件系统与扩展性 (Plugin System)
- **Renderer Provider**:设计开放的注册接口,允许第三方开发者注册自定义渲染器。
```typescript
// 允许用户注册自定义渲染器,支持“主题市场”商业化
VizRegistry.register('GraphTracer', CyberpunkGraphRenderer);
```
- **中间件机制**:允许拦截和修改指令流,实现自定义的逻辑增强(如增加声音音效)。
## 4. 预期形态
该库将发布为 NPM 包,提供如下使用方式:
```typescript
import { Player, ArrayVisualizer, GraphVisualizer } from '@structrail/viz';
import { Player, ArrayVisualizer } from '@structrail/viz';
import '@structrail/viz/dist/style.css'; // 或自动注入 Shadow DOM 样式
// 1. 载入 Tracer 生成的 JSON 数据
const events = await fetch('algorithm-trace.json');
// 1. 初始化播放器
const player = new Player(events);
// 2. 绑定到 UI
function AlgorithmDemo() {
// 使用 player 的 hook 获取当前帧的数据快照
// 2. 渲染组件 (React 示例)
function App() {
const snapshot = usePlayerSnapshot(player);
return (
<div>
{/* 播放控制栏 */}
<ControlBar player={player} />
{/* 渲染区域:根据 snapshot 中的数据自动渲染 */}
<div className="canvas">
{snapshot.tracers.map(tracer => {
if (tracer.type === 'array') {
return <ArrayVisualizer key={tracer.id} model={tracer} />
}
if (tracer.type === 'graph') {
return <GraphVisualizer key={tracer.id} model={tracer} />
}
})}
</div>
<div className="viz-container">
<ArrayVisualizer
model={snapshot.tracers['array-1']}
theme="cyberpunk" // 支持主题切换
/>
<Controls player={player} />
</div>
);
}
```
## 4. 关键技术挑战 (Technical Challenges)
### 4.1 增量计算与快照管理
* **问题**:如果算法有 100 万步,不能每一步都存一个深拷贝的快照
* **策略**:使用类似 Git 的机制或 immer.js。Store 只记录关键帧Keyframe的快照中间步骤通过重放指令Replay动态计算
### 4.2 动画过渡 (Animation)
* **问题**:当从“第 1 步”跳到“第 2 步”时如果只是数据的突变1 -> 2体验很生硬。
* **策略**:渲染层需要比较 `PrevSnapshot``CurrentSnapshot`Diff
* 如果发现数组 index 0 的元素位置变了,它应该生成一个移动动画。
* 这就是为什么我们的 `patch` / `swap` 指令语义很重要,它们对应了不同的动画原语。
### 4.3 自动布局 (Auto-Layout)
* **问题**:后端 Tracer 通常不包含坐标信息(除非我们以后添加坐标指令,但通常不建议耦合 UI 细节)。
* **策略**:前端库需要内置强大的自动布局算法。
* Graph: Force-directed graph (力导向图)
* Tree: Reingold-Tilford 树布局
## 5. 商业化结合点
- **开源核心**:建立协议标准,获取流量。
- **付费扩展**
- **高级主题包**:赛博朋克、手绘风、企业定制皮肤
- **高性能渲染器**3D 图算法渲染、大数据分析引擎
- **云端服务**:高清视频导出 (MP4/GIF)。