实现流程编排设计器的心路历程

news2024/11/16 23:43:37

接上回《「AntV」使用AntV X6实现流程编排设计器》一文说到,流程编排设计器的实现方案是将低代码引擎和AntV X6作为画布相结合。

为什么会有这样的想法?

可行性

起因是业务中有用到低代码引擎的场景,它的交互形式、页面结构正好符合流程编排设计器的诉求。同时,在阅读低代码引擎文档时,发现设计原理->渲染模块设计->模拟器介绍中有如下介绍:

基于以上思考,我们通过基于沙箱隔离的模拟器技术来实现了多运行时环境(如 React、Rax、小程序、Vue)、多模式(如流式布局、自由布局)、多场景(如页面编排、关系图编排)的 UI 编排。通过注册不同的运行时环境的渲染模块,能够实现编辑器从 React 页面搭建到 Rax 页面搭建的迁移。通过注册不同的模拟器画布,你可以基于 G6 或者 mxgraph 来做关系图编排。你可以定制一个流式布局的画布,也可以定制一个自由布局的画布。

综上可见,使用AntV X6作为画布和低代码引擎结合方案的可行性是没有问题。

那么接下来就是实践了,因为
在这里插入图片描述

于是乎走上了阅读源码,自己探索的道路。

埋头苦干

通过阅读源码,并借鉴Lowcode Engine Vue 渲染器及适配器实现的实现思路,期望也能够基于BuiltinSimulatorRenderer这个桥梁,通过结合Antv X6, 实现Lowcode Engine BPMN(X6)的伟大构想。

不过在近一个月的大量研究、实践、测试后,仅仅是完成了画布的渲染,正常编排交互无法得以解决。

React和Vue的画布(渲染器)是运行在iframe中,存在事件通信等一系列机制。而AntV X6如果也运行在iframe中,本身的拖拽等事件和宿主拖拽等事件存在着各种各样的冲突,即使在尝试修改了低代码引擎的部分源码后,也没有能够完全解决。

在实践过程中,也提过相关的issue,寻求官方解决方案。当时得到的回答是内部方案还在打磨中,并未开源。(PS: 不过在自己项目发布没多久,官方方案图编排扩展就开源了)

虽然失败了,但是也充分学习了画布相关的源代码,了解了其实现原理。

贴一张官方的模拟器架构图,「模拟器Host进程」和iframe中的「模拟器Renderer进程」通信

image.png

睡醒再干

俗话说,在哪里跌倒,就在哪里睡一觉。

睡醒之后,再次寻求解决方案。既然基于底层API搞不了,去上层瞅瞅呢?

低代码引擎本身只包含了最小的内核,而我们所能看到的设计器上的按钮、面板等都是插件提供的。插件是组成设计器的必要部分。通过定制插件,在和低代码引擎解耦的基础上,我们可以和引擎核心模块进行交互,从而满足多样化的功能。

显然画布也不例外。如果把原画布移除,添加自己实现的X6画布,是否可行呢?你还真别说,有一种重见天日,恍然大明白的感觉。

注册默认画布

如下是低代码引擎中注册画布面板的源码实现:

import { IPublicModelPluginContext } from '@alilc/lowcode-types';
import DesignerPlugin from '@alilc/lowcode-plugin-designer';

// 注册默认的面板
export const defaultPanelRegistry = (editor: any) => {
  const fun = (ctx: IPublicModelPluginContext) => {
    return {
      init() {
        const { skeleton, config } = ctx;
        skeleton.add({
          area: 'mainArea',
          name: 'designer',
          type: 'Widget',
          content: <DesignerPlugin
            engineConfig={config}
            engineEditor={editor}
          />,
        });
      },
    };
  };

  fun.pluginName = '___default_panel___';

  return fun;
};

export default defaultPanelRegistry;

自定义X6画布面板

如下是自定义X6画布的源码实现:

import { IPublicModelPluginContext } from "@alilc/lowcode-types";
import DesignerView from "@/components/DesignerView";

const BuiltinPluginRegistry = (ctx: IPublicModelPluginContext) => {
  return {
    name: "builtin-plugin-registry",
    async init() {
      const { skeleton } = ctx;
      
      // 移除默认的画布
      skeleton.remove({
        name: "designer",
        area: "mainArea",
        type: "Widget",
      });

      // 注册X6画布面板
      skeleton.add({
        name: "x6Designer",
        area: "mainArea",
        type: "Widget",
        content: DesignerView,
      });
    },
  };
};
BuiltinPluginRegistry.pluginName = "builtinPluginRegistry";

export default BuiltinPluginRegistry;

画布代码示例:

import React, { useRef } from "react";
import "./index.less";

export default () => {
  const containerRef = useRef(null);

  // 省略初始化画布代码

  return (
    <div className="lc-designer lowcode-plugin-designer">
      <div className="lc-project">
        <div className="lc-simulator-canvas lc-simulator-device-default">
          <div id="x6-container" ref={containerRef} />
        </div>
      </div>
    </div>
  );
};

拖拽

我们需要通过拖拽交互从组件库面板中拖动组件到画布中添加节点,使用到了AntV 独立的插件包@antv/x6-plugin-dnd来实现。

在低代码引擎中,有内置的拖拽引擎(Dragon

为了后续研发能够顺利开展,在拖拽机制上并没有采用低代码引擎自带的方案。

结语

在开发过程中,我们难免会遇到了一些问题,一开始可能没有成功实现预期的方案,但这也是一种宝贵的经验。我们不应该放弃,而是要继续探索,寻找更好的解决方案。同时,也要学会从失败中汲取教训,不断优化自己的思路和方法,以达到更好的效果。

有时间可以再写写关于低代码引擎画布相关的源码阅读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/737779.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超级实用~低生物量的样本如何进行污染控制

上次小编主要介绍了低生物量比如口腔、阴道等样本的常见微生物和污染物&#xff0c;但是测序技术的高灵敏度也放大了样本中DNA污染的影响&#xff0c;那么对于低生物量的样本如何进行污染控制就至关重要了~ 2019年在《Contamination in Low Microbial Biomass Microbiome Studi…

vue + el-table点击表头改变其当前样式

废话不多说&#xff0c;先看效果&#xff1a; 网上找了一大圈没有符合的&#xff0c;只能自己看着搞&#xff1a; 直接贴代码&#xff1a; <el-tableref"table":data"tableData"borderstripesort-change"changeColumn"><el-table-colu…

vue语法详解

以下页面就是用vue开发的 模板语法 注意 模板语法不能在标签属性中用 文本插值 {{ msg }} 使用JavaScript表达式 {{ number 1 }} {{ ok ? YES : NO }} {{ message.split().reverse().join() }} 使用HTML 双大括号将会将数据插值为纯文本&#xff0c;而不是HTML&…

Apikit 自学日记:测试数据集

测试数据集 添加数据集的变量 在测试用例详情页面中&#xff0c;您可以点击上方的 测试数据 标签&#xff0c;进入用例的数据管理页面。在这里您可以添加多组测试数据&#xff0c;以及每组测试数据的变量。 在添加数据集前&#xff0c;我们需要设置数据集中存在什么变量。可以…

Qt:记录一下好看的配色

qss代码 窗体背景色 background-color: #ED6927; border-top-left-radius:35px;border-top-right-radius:35px;border-bottom-right-radius:0px; border-bottom-left-radius:0px;background-color: #203A32; border-radius:35px; border-top-left-radius:0px;border-top-righ…

如何用一部手机进行人体全身三维扫描

人体建模的应用真的是涵盖到了我们生活中的方方面面&#xff0c;真人潮玩、服饰定制、医疗康复、3D数字人等等领域&#xff0c;都离不开人体建模。 提到给人体建模&#xff0c;大家脑海里第一个浮现的画面&#xff0c;大多会是坐在电脑屏幕前&#xff0c;打开某个熟悉的建模的…

从本地目录和S3目录生成Classpath字符串的最佳实践

从一个目录生成Classpath字符串是一个非常常见的问题&#xff0c;在使用命令提交一个Java、Spark作业时会经常遇到。通常遇到的遇到情况是&#xff1a;将本地目录下的Jar文件拼接成一个Classpath字符串&#xff0c;这时&#xff0c;通常我们可以使用这样的命令&#xff1a; sp…

《八角笼中》电影我表达不出的好

昨天看完王宝强主演的《八角笼中》内心久久不能平静&#xff0c;里面有很多触动我的点&#xff0c;如果是写作高手&#xff0c;一定能从这部影片中捕捉到很多可写的话题。其实我也有&#xff0c;只是一直在思索要如何定主题&#xff0c;把内心深处那些想法表达出来&#xff0c;…

【HDC.Cloud 2023】华为云区块链分论坛内容值得再读!

Web3是全新的互联网世界&#xff0c;它不仅仅是一个技术革新&#xff0c;更是一种新的生态系统。在这个新的生态系统中&#xff0c;区块链技术、去中心化应用、智能合约等技术被广泛应用&#xff0c;为人们带来了更加安全、透明、去中心化的互联网体验。 然而&#xff0c;Web3的…

底层的出路,就在突破多重“八角笼”

底层的出路&#xff0c;就是突破“八角笼” “八角笼”隐喻是&#xff1a;出生地域&#xff0c;出生家庭&#xff0c;教育机会限制&#xff0c;权力网络&#xff0c;知识和技能的限制&#xff0c;资源的网络&#xff0c;机会…… 趣讲大白话&#xff1a;突破困局&#xff0c;精…

VoxPose:零样本训练机器人听你的话

VoxPoser是一种从大型语言模型&#xff08;LLMs&#xff09;中提取机器人操纵的可供性和约束的方法&#xff0c;它不需要额外的训练&#xff0c;并且可以泛化到开放集的指令。 地址&#xff1a;VoxPoser 它利用LLMs的编码能力&#xff0c;与视觉语言模型&#xff08;VLMs&…

快使用双截棍 | 低码之连接器 元服务开发的奇门武器

AppGallery Connect&#xff08;以下简称AGC&#xff09;低代码服务是一个基于Serverless的低代码开发平台&#xff0c;可通过拖拽式开发&#xff0c;可视化配置构建元服务。打通HarmonyOS云侧与端侧能力&#xff0c;轻松实现HMS Core和AGC Serverless能力的调用&#xff0c;宛…

基于matlab校正亮度不均匀问题并分析前景对象(附源码)

一、前言 此示例说明如何在分析前的预处理步骤增强图像。在此示例中&#xff0c;您可以校正背景亮度不均匀问题&#xff0c;并将图像转换为二值图像&#xff0c;以便于识别前景对象&#xff08;单个米粒&#xff09;。然后&#xff0c;您可以分析对象&#xff0c;例如计算每粒…

【剑指offer】学习计划day3

​​​​​​​ 目录 一. 前言 二.替换空格 a.题目 b.题解分析 c.AC代码 三. 左旋转字符串 a.题目 b.题解分析 c.AC代码 一. 前言 本系列是针对Leetcode中剑指offer学习计划的记录与思路讲解。详情查看以下链接&#xff1a; 剑指offer-学习计划https://leetcode.cn/stud…

多线程(3): 线程同步

1. 互斥锁的加锁和解锁 1.1 加锁解锁说明 在处理线程同步时&#xff0c;第一种方式就是使用互斥锁。互斥锁只能同时被一个线程使用&#xff0c;锁的所有权只能被一个线程拥有。互斥锁是线程同步最常用的一种方式&#xff0c;通过互斥锁可以锁定一个代码块 &#xff0c;被锁定…

23款奔驰S450 4MATIC更换原厂旋转高音,提升车内氛围感

奔驰加装3D旋转高音&#xff0c;让高音“有型有色”,高端3D环绕立体声音响系统的视觉效果同样令人印象深刻&#xff1a;系统启动时&#xff0c;安装在前车门后视镜三角板中的两个高音头会与同色车内氛围灯一块亮起&#xff0c;同时向外旋出10mm至最佳效果位置&#xff0c;以提高…

docker安装单机版nacos,并把数据保存到MySQL

1.下载镜像(请根据cloud版本选择) docker pull nacos/nacos-server:1.4.12.启动临时镜像并拷贝文件 docker run -p 8848:8848 -p 9848:9848 -p 9849:9849 --name nacos-temp \ -d nacos/nacos-server:1.4.1后面是需要修改的本机路径 docker cp nacos-temp:/home/nacos/logs/…

记录一个heatmap.js在strict模式下的bug

ImageData的data属性只读&#xff0c;无法修改 出问题的在原始代码的490行~528行 var img this.shadowCtx.getImageData(x, y, width, height);var imgData img.data;var len imgData.length;var palette this._palette;for (var i 3; i < len; i 4) {var alpha imgD…

拥有铁粉,怀抱CSDN大家庭

&#x1f451; 个人主页 &#x1f451; &#xff1a;&#x1f61c;&#x1f61c;&#x1f61c;Fish_Vast&#x1f61c;&#x1f61c;&#x1f61c; &#x1f41d; 个人格言 &#x1f41d; &#xff1a;&#x1f9d0;&#x1f9d0;&#x1f9d0;说到做到&#xff0c;言出必行&am…

收藏备用 | 提高效率的建筑工地技巧

随着城市化进程的加速和建筑业的蓬勃发展&#xff0c;建筑工地扬尘和噪声污染成为了日益突出的问题。这些问题不仅对周边环境造成了不良影响&#xff0c;还对居民的生活质量和健康造成了潜在风险。 为了有效管理和监控建筑工地的扬尘和噪声水平&#xff0c;保障周边居民的权益和…