快速开始
本指南将从 Vue 项目 创建开始一步一步教您将 bpmn-js 集成到项目中。
创建项目
- npm
- Yarn
- pnpm
- Bun
npm create vite@latest my-bpmn-modeler -- --template vue-ts
yarn create vite my-bpmn-modeler --template vue-ts
pnpm create vite my-bpmn-modeler --template vue-ts
bunx create-vite my-bpmn-modeler --template vue-ts
创建成功后的项目结构请查看官方提供的示例
添加依赖
- npm
- Yarn
- pnpm
- Bun
npm install bpmn-js diagram-js-grid --save-dev
yarn add bpmn-js diagram-js-grid --dev
pnpm add bpmn-js diagram-js-grid --save-dev
bun add bpmn-js diagram-js-grid --dev
这里我们添加一个 bpmn-js 扩展 diagram-js-grid 用于在画板中显示网格。
集成 bpmn-js
首先我们移除项目中的无用代码,然后创建一个 Modeler 组件。
创建 BPMN Modeler
const bpmnModeler = shallowRef<BpmnModeler>();
new BpmnModeler({
container: '#id', // 这里也可以是一个 HTML 元素
additionalModules: [
// 这里是插件
]
});
在 Vue 中我们一般使用 ref 绑定一个元素
<template>
<div class="modeler-container" ref="modelerContainerRef" />
</template>
<script setup lang="ts">
import { ref } from "vue";
const modelerContainerRef = ref<HTMLDivElement>();
</script>
那创建 BPMN Modeler 的方法就可以这样写
const bpmnModeler = shallowRef<BpmnModeler>();
new BpmnModeler({
container: modelerContainerRef.value as HTMLElement, // 这里也可以是一个 HTML 元素
additionalModules: [
// 这里是插件
]
});
完整代码
- src/App.vue
- src/style.css
- src/components/Modeler.vue
- src/resources/newDiagram.bpmn
<template>
<Modeler/>
</template>
<script setup lang="ts">
import Modeler from "./components/Modeler.vue";
</script>
:root {
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
}
html,body {
margin: 0;
padding: 0;
height: 100%;
width: 100%;
}
#app{
height: 100%;
width: 100%;
}
.djs-container svg:focus {
outline: none;
}
.djs-container svg:focus 这个样式是为了去除 bpmn 画板在激活状态下的黑色边框。
<template>
<div class="modeler-container" ref="modelerContainerRef" />
</template>
<script setup lang="ts">
// 引入样式
import 'bpmn-js/dist/assets/diagram-js.css';
import 'bpmn-js/dist/assets/bpmn-js.css';
import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css';
import {onMounted, ref, shallowRef} from "vue";
import BpmnModeler from 'bpmn-js/lib/Modeler';
//@ts-ignore
import gridModule from 'diagram-js-grid';
//@ts-ignore
import diagramXML from '../resources/newDiagram.bpmn?raw';
const bpmnModeler = shallowRef<BpmnModeler>();
const modelerContainerRef = ref<HTMLDivElement>();
onMounted(() => {
bpmnModeler.value = new BpmnModeler({
container: modelerContainerRef.value as HTMLElement,
additionalModules: [
gridModule
]
});
bpmnModeler.value.importXML(diagramXML) 1
})
</script>
<style scoped>
.modeler-container {
width: 100%;
height: 100%;
}
</style>
<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" id="sample-diagram" targetNamespace="http://bpmn.io/schema/bpmn">
<bpmn2:process id="Process_1" isExecutable="false">
<bpmn2:startEvent id="StartEvent_1"/>
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds height="36.0" width="36.0" x="412.0" y="240.0"/>
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>