从0到1搭建可视化流程编辑器——BaklavaJS深度实践

1.BaklavaJS简介

BaklavaJS是一款轻量级、可扩展的前端节点图(NodeEditor)框架,适用于可视化编排、数据流设计器、低代码等场景。其核心特性包括:

  • 声明式节点:defineNode API一步到位。

  • 接口(Interface)系统:参数、连线、配置均为Interface。

  • 跨框架渲染:Vue/React/Svelte/原生WebComponent。

  • 插件化:画布、布局、快捷键、Inspector等随取随用。

项目技术栈:Vue3+Vite+Typescript,BaklavaJS版本V2.0。

pnpm addbaklavajs @baklavajs/plugin-renderer-vue @baklavajs/plugin-controls-vue

若仅需纯画布,可忽略 plugin-controls-vue(右侧属性面板)。

2.为什么选择BaklavaJS?

低代码

BaklavaJS 轻量、Vue原生、可定制—— 正中靶心。

3.核心API速查

下表汇总了开发中最常用的15个API,配合示例方便查阅。

低代码

更多Interface类型:SliderInterface、CheckboxInterface、ButtonInterface等均在主包中暴露,API一致。

4.节点开发——以MathNode为例

我们用 数学运算节点 贯穿全流程,展示API用法。

import {defineNode,     NodeInterface,     NumberInterface,     SelectInterface } from "baklavajs";export default defineNode({  /*  *1)基本信息  */  type: "MathNode",     // ⚠︎ 全局唯一,序列化依赖它  title: "数学运算",     //节点面板显示文字  category: "数学",     //左侧分组,无需预定义  /*  *2)输入接口  *  -两个数字+一个运算符  *  -运算符接口只做配置,不暴露连线  */  inputs:{   number1: ()=> new NumberInterface("数字A", 0),   number2: ()=> new NumberInterface("数字B", 0),   operation: ()=>    new SelectInterface("运算", "Add",[     "Add",   //加     "Subtract", //减     "Multiply", //乘     "Divide",  //除   ]).setPort(false),    // ❶ 仅做参数,不可连线 },  /*  *3)输出接口  */  outputs:{   output: ()=> new NodeInterface("结果", 0), },  /*  *4)核心逻辑  *  -BaklavaJS会在输入值变化时调用calculate  *  -可同步返回,也可async  */  calculate({number1,number2,operation}){   let result= 0;   switch (operation){    case "Add":   result=number1+number2; break;    case "Subtract": result=number1-number2; break;    case "Multiply": result=number1*number2; break;    case "Divide":  result=number2?number1/number2: 0; break;  }   return { output:result}; // ❷ 必须返回对象,键名对应outputs },});

4.1.setPort(false)的实际效果

  • 有圆点:接口可拖线,与其他节点形成依赖关系。

  • 无圆点:仅在Inspector面板展示为表单字段,常用于配置项(如上例中的 operation)。

4.2.异步计算示例

async calculate(inputs){  const res= await fetch("/api/calc",{ method: "POST", body: JSON.stringify(inputs)});  const {value}= await res.json();  return { output:value};}

当节点返回Promise时,BaklavaJS会自动等待结果后推进后续节点。

5.样式定制与主题切换

// src/styles/baklava-custom.scss@use "@baklavajs/plugin-renderer-vue/dist/styles" asbaklava;.baklava-node {  background-color: #1e1e2f;  border: 1px solid #3e3e5e;  border-radius: 8px;  .baklava-node-title { color: #56d6ff;}}

官方提供了两个种主题风格,若需定制开发别的主题风格样式,可在根组件设置CSS变量并在scss中引用。

6.与Vue3的深度结合

  • 自定义Interface组件:

import CustomInput from "../components/CustomInput.vue";const intf= new TextInputInterface("自定义", "默认值").setPort(false);(intf as any).component = markRaw(CustomInput);
  • Pinia状态同步:监听 graph.events,实时将 graph.toJSON() 存入store,实现“撤销/重做/云端保存”。

  • Teleport:使用VueTeleport可将上下文菜单、对话框脱离节点层级,解决z-index问题。

7.常见坑与最佳实践场景

低代码

8.结语

通过本文你已掌握:

1. BaklavaJS核心API(defineNode、Interface、事件系统等);

2. 如何基于MathNode进行节点开发并处理同步/异步计算;

3. 画布事件、样式覆盖与Vue3的结合方式。

BaklavaJS仍在迭代中,未来将加入子图(SubGraph)、流程调试器等特性。


作者:练江河

编辑:河洛生


上一篇: SpringAI——概念学习
下一篇: 数据科技创新新蓝图:国家数据局《实施意见》引领数字中国新征程