react-diagrams版本迁移指南:从v1到v2的核心变化
你还在为react-diagrams版本升级而烦恼吗?本文将详细介绍从v1到v2的核心变化,帮助你快速完成迁移。读完你将了解包结构调整、API变更、依赖管理优化等关键内容,并掌握实际迁移步骤和常见问题解决方案。
包结构重构
react-diagrams v2采用了monorepo结构,将原有的单一包拆分为多个独立功能包,使代码组织更清晰,依赖管理更灵活。主要包含以下包:
- @projectstorm/react-canvas-core:核心画布功能,提供基础的画布渲染和交互支持
- @projectstorm/react-diagrams-core:图表核心功能,定义节点、链接等基础模型
- @projectstorm/react-diagrams-defaults:默认组件实现,提供常用的节点、链接和端口样式
- @projectstorm/react-diagrams-routing:链接路由功能,支持智能布线和路径查找
这种拆分使你可以根据需求选择性引入包,减少不必要的依赖。例如,如果你只需要基础的图表功能,可以只引入core和defaults包。
依赖管理优化
v2版本在依赖管理方面有重大改进:
-
移除peer dependencies:v1版本大量使用peer dependencies,导致版本冲突和安装问题。v2将依赖项移回各个包内部,由package manager自动处理版本兼容性。
-
使用workspace协议:内部包之间的依赖采用workspace协议声明,如
"@projectstorm/react-canvas-core": "workspace:*",简化了开发和发布流程。 -
升级核心依赖:全面升级所有依赖项,包括React 18和Emotion 11,提升性能和兼容性。
重大API变更
1. 模型创建方式
v1版本:
import { Diagram, Node, Port } from 'storm-react-diagrams';
const node = new Node({ id: 'node1' });
const port = new Port({ id: 'port1' });
node.addPort(port);
v2版本:
import { DefaultNodeModel, DefaultPortModel } from '@projectstorm/react-diagrams-defaults';
const node = new DefaultNodeModel({
name: 'Node 1',
color: 'rgb(0,192,255)',
});
const port = node.addOutPort('Out');
2. 画布渲染
v1版本:
<DiagramWidget diagram={diagram} />
v2版本:
import { CanvasWidget } from '@projectstorm/react-canvas-core';
<CanvasWidget engine={engine} />
3. 自定义节点实现
v2版本提供了更清晰的自定义节点实现方式。你需要创建模型、部件和工厂三部分:
模型定义 DiamondNodeModel.ts:
export class DiamondNodeModel extends NodeModel {
constructor() {
super({ type: 'diamond' });
this.addPort(new DiamondPortModel(PortModelAlignment.TOP));
this.addPort(new DiamondPortModel(PortModelAlignment.LEFT));
this.addPort(new DiamondPortModel(PortModelAlignment.BOTTOM));
this.addPort(new DiamondPortModel(PortModelAlignment.RIGHT));
}
}
部件实现 DiamondNodeWidget.tsx:
export class DiamondNodeWidget extends React.Component {
render() {
return (
<div className="diamond-node">
<svg width={this.props.size} height={this.props.size}>
{/* SVG内容 */}
</svg>
{/* 端口部件 */}
</div>
);
}
}
export class DiamondNodeFactory extends AbstractReactFactory {
constructor() {
super('diamond');
}
generateReactWidget(event) {
return <DiamondNodeWidget engine={this.engine} node={event.model} />;
}
generateModel(event) {
return new DiamondNodeModel();
}
}
迁移步骤
1. 安装新依赖
# 使用npm
npm install @projectstorm/react-diagrams @projectstorm/react-diagrams-defaults
# 使用pnpm
pnpm add @projectstorm/react-diagrams @projectstorm/react-diagrams-defaults
2. 更新导入语句
将原有的:
import { Diagram, Node } from 'storm-react-diagrams';
替换为:
import { DiagramEngine, DiagramModel } from '@projectstorm/react-diagrams-core';
import { DefaultNodeModel, DefaultLinkModel } from '@projectstorm/react-diagrams-defaults';
import { CanvasWidget } from '@projectstorm/react-canvas-core';
3. 重构图表初始化代码
v2初始化示例:
import { createEngine, DefaultNodeModel, DefaultLinkModel, DiagramModel } from '@projectstorm/react-diagrams';
// 创建引擎
const engine = createEngine();
// 创建节点
const node1 = new DefaultNodeModel({
name: 'Node 1',
color: 'rgb(0,192,255)',
});
node1.setPosition(100, 100);
const port1 = node1.addOutPort('Out');
// 创建第二个节点
const node2 = new DefaultNodeModel({
name: 'Node 2',
color: 'rgb(255,192,0)',
});
node2.setPosition(300, 100);
const port2 = node2.addInPort('In');
// 创建链接
const link = port1.link<DefaultLinkModel>(port2);
link.addLabel('Hello World!');
// 创建模型并添加元素
const model = new DiagramModel();
model.addAll(node1, node2, link);
// 将模型添加到引擎
engine.setModel(model);
4. 更新自定义组件
如果你有自定义节点或链接,需要按照v2的新架构重构。主要步骤包括:
- 创建模型类(继承NodeModel、LinkModel等)
- 创建对应的React部件
- 创建工厂类(继承AbstractReactFactory)
- 注册工厂到引擎
功能增强
多图层支持
v2引入了多图层功能,允许你创建多个节点层和链接层,实现更复杂的视觉效果和交互。例如,可以将背景元素放在底层,交互元素放在顶层。
// 创建图层
const layer1 = new LayerModel({ id: 'background' });
const layer2 = new LayerModel({ id: 'nodes' });
const layer3 = new LayerModel({ id: 'links' });
// 添加到模型
model.addLayer(layer1);
model.addLayer(layer2);
model.addLayer(layer3);
性能优化
v2在性能方面做了多项改进:
- 引入性能监控部件:提供PeformanceWidget,帮助你分析和优化图表性能
- 优化渲染逻辑:移除了v1中节点必须先于链接渲染的限制,提高渲染效率
- 改进状态管理:重构了状态机系统,减少不必要的重渲染
常见问题
1. 找不到模块错误
问题:迁移后出现类似Cannot find module '@projectstorm/react-diagrams'的错误。
解决:确保已安装所有必要的包,并使用正确的导入路径。v2使用作用域包名,如@projectstorm/react-diagrams。
2. 链接不显示
问题:节点显示正常,但链接不显示或位置不正确。
解决:检查端口是否正确添加到节点,以及链接是否正确连接端口。v2中端口位置变化时会自动通知链接更新,但需要确保端口模型正确实现。
3. 样式丢失
问题:迁移后节点和链接样式丢失。
解决:v2使用Emotion代替Sass,需要更新样式定义方式。可以参考默认样式实现迁移自定义样式。
总结
react-diagrams v2通过重构包结构、优化依赖管理和改进API设计,提供了更强大、更灵活的图表功能。虽然迁移需要一定的工作量,但新架构带来的可维护性和扩展性提升是值得的。
主要迁移步骤:
- 更新依赖包
- 调整导入语句
- 重构图表初始化代码
- 更新自定义组件
如果你在迁移过程中遇到问题,可以查阅官方文档或参考示例项目。祝你的迁移工作顺利!
别忘了点赞收藏本文,关注获取更多react-diagrams使用技巧和最佳实践!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



