现在我们从理论进入实践。bpmn.js 是一个由 bpmn.io 社区维护的JavaScript库,用来加载、编辑、展示BPMN流程图。本文介绍bpmn.js的生态、核心概念与最小实现示例。
bpmn.js生态
核心库
bpmn.js 的生态由几个关键库组成:
bpmn-js:核心库,提供Viewer与Modeler
Viewer:只读展示模式,用于查看流程图
Modeler:编辑模式,支持拖拽、编辑、保存
diagram-js:低层次的图形库
- 提供画布、元素、事件系统
- bpmn-js 基于它构建
bpmn-moddle:BPMN数据模型库
相关扩展:
bpmn-js-properties-panel:属性面板
diagram-js-minimap:小地图
bpmn-js-token-simulation:流程模拟
工作原理
1 2 3 4 5 6 7 8 9
| BPMN XML 文件 ↓ bpmn-moddle(解析) ↓ diagram-js(渲染到画布) ↓ bpmn-js(交互与编辑) ↓ 浏览器中的可视流程图
|
两种使用模式
Viewer(查看器)
场景:展示流程图,用户无法编辑。
常见用途:
特点:
Modeler(建模器)
场景:用户可以创建、编辑、保存流程图。
常见用途:
特点:
- 完整功能(Palette、ContextPad)
- 支持拖拽添加元素
- 可保存为XML
最小HTML示例
基础框架
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>bpmn.js最小示例</title> <style> html, body, #canvas { width: 100%; height: 100%; margin: 0; padding: 0; } </style> </head> <body> <div id="canvas"></div>
<script src="https://cdn.jsdelivr.net/npm/bpmn-js@latest/dist/bpmn-viewer.production.min.js"></script> <script> // 创建Viewer实例 const viewer = new BpmnJS({ container: '#canvas' });
// 示例BPMN XML(简单的订单审批流程) const bpmnDiagram = `<?xml version="1.0" encoding="UTF-8"?> <bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn"> <bpmn:process id="OrderApproval" isExecutable="false"> <bpmn:startEvent id="StartEvent_1"/> <bpmn:userTask id="ApproveOrder" name="审批订单"/> <bpmn:endEvent id="EndEvent_1"/> <bpmn:sequenceFlow id="Flow_1" sourceRef="StartEvent_1" targetRef="ApproveOrder"/> <bpmn:sequenceFlow id="Flow_2" sourceRef="ApproveOrder" targetRef="EndEvent_1"/> </bpmn:process> <bpmndi:BPMNDiagram id="BPMNDiagram_1"> <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="OrderApproval"> <bpmndi:BPMNShape id="BPMNShape_StartEvent_1" bpmnElement="StartEvent_1"> <dc:Bounds x="100" y="100" width="36" height="36"/> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="BPMNShape_ApproveOrder" bpmnElement="ApproveOrder"> <dc:Bounds x="200" y="80" width="100" height="80"/> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="BPMNShape_EndEvent_1" bpmnElement="EndEvent_1"> <dc:Bounds x="380" y="100" width="36" height="36"/> </bpmndi:BPMNShape> <bpmndi:BPMNEdge id="BPMNEdge_Flow_1" bpmnElement="Flow_1"> <di:waypoint x="136" y="118"/> <di:waypoint x="200" y="120"/> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="BPMNEdge_Flow_2" bpmnElement="Flow_2"> <di:waypoint x="300" y="120"/> <di:waypoint x="380" y="118"/> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </bpmn:definitions>`;
// 加载流程图 viewer.importXML(bpmnDiagram).then(() => { // 自动适配视窗 viewer.get('canvas').zoom('fit-viewport'); console.log('流程图加载成功!'); }).catch(err => { console.error('加载失败:', err); }); </script> </body> </html>
|
效果说明
- 容器:
<div id="canvas"> 是流程图的绘制区域
- 加载XML:通过
importXML() 方法解析BPMN XML并在画布上渲染
- 自动适配:
zoom('fit-viewport') 使流程图自动居中与缩放适应窗口
- 错误处理:异步操作使用 Promise 进行错误捕获
bpmn.js的核心API概览
| API |
用途 |
返回值 |
new BpmnJS(options) |
创建Viewer/Modeler实例 |
BpmnJS对象 |
importXML(xml) |
加载BPMN XML |
Promise |
saveXML() |
导出为XML |
Promise<{xml: string}> |
get('canvas') |
获取画布对象 |
Canvas |
get('elementRegistry') |
获取元素注册表 |
ElementRegistry |
get('eventBus') |
获取事件总线 |
EventBus |
常见的配置选项
1 2 3 4 5
| const viewer = new BpmnJS({ container: '#canvas', keyboard: { bindTo: document }, canvas: { deferUpdate: false } });
|
小结
掌握bpmn.js入门:
- ✓ 理解生态结构(bpmn-js、diagram-js、bpmn-moddle)
- ✓ Viewer vs Modeler 的选择
- ✓ 最小HTML示例的完整流程
- ✓ importXML 与基础配置
接下来将深入讲解Viewer与Modeler的各自特性与API。
参考资料