Bpmn.js 进阶指南之Lint流程校验(一)

简介: Bpmn.js 进阶指南之Lint流程校验(一)

前言


在之前的文章中已经把 bpmn.js 的执行原理和模块扩展方式都做了一些简单介绍,对 RendererRules 等常用功能也进行了说明。这个时候基本上已经可以满足大部分情况下的需求场景,但是也有小伙伴反应产品有新需求,需要在前端对流程完整性进行校验。


所以这小节主要讲解如何使用 bpmnlint 对流程进行校验。


1. 介绍


bpmn.js 的流程校验通过 bpmnlint 模块提供基础的校验规则与 bpmn-js-bpmnlint 模块来完成错误标识和动态校验。


1.1 bpmnlint 流程校验模块


该模块作为基础模块,主要包含以下几个部分:


  1. lib:核心目录,包括以下几个构造函数:


  1. 提供一个规则校验执行者 Linter ,通过规则测试函数 testRule 和错误报告生成器 Reporter 来进行校验并输出校验结果;


       b. 提供分别基于流程节点/静态文件的两个规则配置解析器


       c. 一个支持模块:支持通过一个 config 对象来生成一个包含 {config, resolver} 的 JavaScript 文件


  1. bin:用来主动读取根目录下的 .bpmnlintrc 配置文件,通过 bpmnlint xxx.bpmn 来校验对应的 xxx.bpmn 文件并输出校验结果


  1. rules:内部预设规则,目前已包含 17 条规则和一个类型检验规则创建器


1.2 Preset Rules 预设规则


规则文件名 规则描述
conditional-flows.js 检查从条件分叉网关或任务节点传出的序列流是否为默认流或具有附加条件
end-event-required.js 检查每个流程范围内是否存在结束事件
event-sub-process-typed-start-event.js 检查每个子流程中是否具有开始事件
fake-join.js 检查事件或者任务节点是否具有隐式的流转规则,默认事件和任务只能有一个流入条件
label-required.js 检查元素必须包含 label 标签
no-bpmndi.js 检查可见的元素是否都具有对应的 DI 标签
no-complex-gateway.js 不能包含复杂网关
no-disconnected.js 检查是否有没有连接到流程中的元素,即不包含流入与流出的连线
no-duplicate-sequence-flows.js 检查是否有重复的流转路线
no-gateway-join-fork.js 检查网关是否同时有多个流入和流出规则
no-implicit-split.js 检查网关或者任务节点是否有多个流出路径且没有配置条件
no-inclusive-gateway.js 不能包含相容网关
single-blank-start-event.js 检查一个正常流程内是否有多个开始事件
single-event-definition.js 验证事件是否包含有超过一个事件定义的规则
start-event-required.js 检查一个流程内是否存在开始事件
sub-process-blank-start-event.js 检查子流程的开始事件是否具有启动条件
superfluous-gateway.js 检查网关是否同时只有一个流入和流出路径,这样的网关是多余的需要移除


2. 最小改动方式使用


这里有两种方式可以做到简单引入,可以参照 基于Bpmn-js的流程设计器校验实现 -- 易样,这里简单进行说明。


2.1 使用 .bpmnlintrc 配置文件


  1. 首先需要下载相关依赖


bpmnlintbpmn-js-bpmnlint 不管哪种方式都需要安装。


npm install bpmnlint bpmn-js-bpmnlint bpmnlint-loader --save


这里的 bpmnlint-loader 主要用来加载和解析 .bpmnlintrc 文件。


  1. 创建 .bpmnlintrc 文件并配置规则


{
  // 继承默认规则
  "extends": "bpmnlint:recommended",
  "rules": {
    // 配置自定义规则,也可以在这里关闭默认规则
    "label-required": "off"
  }
}


  1. 修改 webpack 配置加载 .bpmnlintrc 文件


module.exports = {
  // ...
  module: {
    rules: [
      {
        test: /\.bpmnlintrc$/,
        use: [{ loader: 'bpmnlint-loader' }]
      }
    ]
  }
};


  1. 继承 bpmnlint 模块


import BpmnModeler from 'bpmn-js/lib/Modeler';
import lintModule from 'bpmn-js-bpmnlint';
import bpmnlintConfig from './.bpmnlintrc';
const modeler = new BpmnModeler({
  linting: {
    active: true, // 默认开启规则校验
    bpmnlint: bpmnlintConfig // 引入规则配置
  },
  additionalModules: [
    lintModule // 引入规则校验模块
  ]
});


lintModule 模块主要用于配置 linting.toggle, linting.configChanged, elements.changed 等事件的监听函数,在流程或规则发生改变、或者校验开启与关闭的时候进行重新校验,并将校验信息输出到界面上


2.2 bpmnlint-pack-config 生成配置文件


这里主要是通过 bpmnlint-pack-config 这个依赖包,将原来的 .bpmnlintrc 文件编译成 JavaScript 文件,避免 webpack 无法解析。


  1. 首先,在上面安装的依赖包的基础上安装以下依赖


npm i -g bpmnlint-pack-config bpmnlint


这里需要安装到全局,保证可以正常执行命令


  1. 执行编译命令,将配置文件转成 JavaScript 文件


npx bpmnlint-pack-config -c .bpmnlintrc -o packed-config.js -t es


  1. 集成 bpmnlint 模块(这里因为已经改成了 js 文件,所以不需要再修改 webpack 配置)


import BpmnModeler from 'bpmn-js/lib/Modeler';
import lintModule from 'bpmn-js-bpmnlint';
import * as bpmnlintConfig from './packed-config';
const modeler = new BpmnModeler({
  linting: {
    bpmnlint: bpmnlintConfig
  },
  additionalModules: [
    lintModule
  ]
});


3. 动态启用/禁用校验


这里 bpmn-js-bpmnlint 提供的 lintModule 构造函数原型上定义了状态切换方法 toggle,所以只需要简单调用即可。


const lintModule = modeler.get('linting')
lintModule && lintModule.toggle()


目录
相关文章
|
4月前
|
JavaScript 前端开发
JavaScript基础知识-流程控制之while循环
这篇文章介绍了JavaScript中的while循环和do...while循环的基础知识,并通过一个实际案例演示了如何使用while循环计算投资增长到特定金额所需的年数。
72 2
JavaScript基础知识-流程控制之while循环
|
2月前
|
监控 JavaScript 算法
深度剖析 Vue.js 响应式原理:从数据劫持到视图更新的全流程详解
本文深入解析Vue.js的响应式机制,从数据劫持到视图更新的全过程,详细讲解了其实现原理和运作流程。
|
7月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的销售项目流程化管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的销售项目流程化管理系统附带文章源码部署视频讲解等
75 3
|
4月前
|
JavaScript 前端开发
JavaScript基础知识-流程控制之for循环
这篇文章讲解了JavaScript中的for循环的基础知识,并通过一个实例演示了如何使用for循环来找出所有的三位水仙花数。
66 6
JavaScript基础知识-流程控制之for循环
|
4月前
|
JavaScript 前端开发
js_Ipv4以及ipv4段正则校验
几种JavaScript正则表达式,用于校验IPv4地址的有效性,包括支持CIDR表示法的变体。
101 4
|
5月前
|
前端开发 JavaScript 数据安全/隐私保护
前端JS正则校验密码之3种实现方式
这篇文章展示了三种使用JavaScript正则表达式来校验密码的方法,密码需要满足包含大写字母、小写字母、数字及特殊字符,并在8到16位之间,同时提供了示例代码和实现效果。
173 1
前端JS正则校验密码之3种实现方式
|
5月前
|
大数据 数据处理 分布式计算
JSF 逆袭大数据江湖!看前端框架如何挑战数据处理极限?揭秘这场技术与勇气的较量!
【8月更文挑战第31天】在信息爆炸时代,大数据已成为企业和政府决策的关键。JavaServer Faces(JSF)作为标准的 Java Web 框架,如何与大数据技术结合,高效处理大规模数据集?本文探讨大数据的挑战与机遇,介绍 JSF 与 Hadoop、Apache Spark 等技术的融合,展示其实现高效数据存储和处理的潜力,并提供示例代码,助您构建强大的大数据系统。
68 0
|
5月前
|
JavaScript 安全 数据安全/隐私保护
深入Node.js与Express:从表单接收到数据验证的完整指南——实战技巧揭秘后端开发中的表单处理流程
【8月更文挑战第31天】在Web开发中,处理表单数据至关重要。本文通过实例详细讲解了如何利用Node.js与Express框架接收和验证表单数据。首先,搭建环境并初始化一个简单的Express应用;接着,演示如何接收用户注册表单中的`username`和`email`字段;最后,引入`joi`模块进行数据验证,确保数据安全准确。掌握这些技能有助于开发者构建更安全、友好的Web应用。随着Node.js和Express的不断进步,未来将有更多高级功能值得期待。
144 0
|
5月前
|
JavaScript 前端开发 API
解锁前端开发新境界:Vue.js携手Webpack,打造高效构建流程,你的项目值得拥有!
【8月更文挑战第30天】随着前端技术的发展,模块化与组件化趋势愈发显著。Vue.js 以其简洁的 API 和灵活的组件系统,深受开发者喜爱;Webpack 则凭借强大的模块打包能力成为前端工程化的基石。两者结合,不仅简化了组件编写与引用,还通过模块热替换、代码分割等功能大幅提升开发效率。本文将通过具体示例,展示如何利用 Vue.js 和 Webpack 构建高效、有序的前端开发环境。从安装配置到实际应用,逐步解析这一组合的优势所在。
56 0
|
6月前
|
前端开发 NoSQL 数据库
部署常用的流程,可以用后端,连接宝塔,将IP地址修改好,本地只要连接好了,在本地上前后端跑起来,前端能够跑起来,改好了config.js资料,后端修改好数据库和连接redis,本地上跑成功了,再改
部署常用的流程,可以用后端,连接宝塔,将IP地址修改好,本地只要连接好了,在本地上前后端跑起来,前端能够跑起来,改好了config.js资料,后端修改好数据库和连接redis,本地上跑成功了,再改