理念
这里将介绍灵矶设计理念及核心技术点,它在技术上和其它低代码平台有什么不同。
设计理念
灵矶最初用户是公司内部开发者,因此它最重要的设计理念是「开发者优先」。
我们认为面向非开发者的零代码平台使用场景有限,只能做简单的办公应用,大部分时候还不如在线 Excel 简单方便,因此灵矶不是零代码平台,它面向的是有一定开发经验的用户。
灵矶的目标不是取代开发者,而是辅助开发者更高效地完成工作。
因为重视开发者,灵矶比起其它低代码平台有三个显著特点:
- 灵活性高,我们重视灵活性和功能可扩展,让开发人员可以最大程度发挥,而不是为了易用性处处设限,这点在后续的前端和后端设计中都有体现。
- 开放和透明,低代码平台最大的风险是技术锁定和黑盒,作为开发者我们自己也不喜欢封闭的低代码平台,因此灵矶重视开放性,前端方面渲染器开源了,后端方面也选择了开发人员最熟悉的传统数据库技术,没有中间层,对开发者是透明的,并且灵矶后端不依赖任何云厂商,可以部署到任意环境。
- 架构上松耦合,比起大而全的集成系统,我们选择了松耦合的架构,这样能让开发者有更多选择,可以选择只用前端、只用可视化编辑器、只用后端,可以很好和现有开发结合。
接下来将介绍灵矶中前后端及编辑器的核心设计。
前端
灵矶前端使用了流行的开源项目 formily,它的 star 数量有 11.5k,并且一直在持续更新,目前大量互联网及金融公司使用,包括但不限于:美团、滴滴、阅文集团、贝壳、光大银行等知名企业。
formily 渲染器的核心是将 JSON 配置渲染成可交互的页面,比如下面一段简单的配置:
{
"type": "void",
"x-acl-action-props": {
"skipScopeCheck": true
},
"x-acl-action": "newTasks:create",
"x-decorator": "FormBlockProvider",
"x-use-decorator-props": "useCreateFormBlockDecoratorProps",
"x-decorator-props": {
"dataSource": "main",
"collection": "newTasks",
"association": null
},
"x-toolbar": "BlockSchemaToolbar",
"x-settings": "blockSettings:createForm",
"x-component": "CardItem",
"x-template-key": "jd7idnyhz3w",
"properties": {
"uq8jz1sqsjf": {
"type": "void",
"x-component": "FormV2",
"x-use-component-props": "useCreateFormBlockProps",
"properties": {
"f3gjcyexjqv": {
"type": "void",
"x-initializer": "createForm:configureActions",
"x-component": "ActionBar",
"properties": {
"wmhuxhvc2hc": {
"title": "{{ t(\"Submit\") }}",
"x-action": "submit",
"x-component": "Action",
"x-use-component-props": "useCreateActionProps",
"x-toolbar": "ActionSchemaToolbar",
"x-settings": "actionSettings:createSubmit",
"x-component-props": {
"type": "primary",
"htmlType": "submit"
},
"x-action-settings": {
"assignedValues": {},
"triggerWorkflows": [],
"pageMode": false
},
"type": "void"
}
}
},
"grid": {
"type": "void",
"x-component": "BlockTemplate",
"x-component-props": {
"templateId": "jd7idnyhz3w"
}
}
}
}
}
}
使用 formily 渲染之后就成了一个表单:

可以看到 formily 配置非常简洁,没有多余的内容,即便从来没学过也能看懂。
formily 可以支持多种场景使用,你可以用它来制作:
带导航的多页面应用。
单个页面。
已有页面(任意前端框架)的某个小区域,比如只用 formily 做表单。
formily 的核心技术点有:
支持无限层级嵌套,可以做出复杂的前端界面。
除了界面,还包括数据获取、表单验证、数据联动、显隐切换、交互的低代码配置。
大量内置组件(120+),开箱即用。
扩展容易,使用标准 React 组件扩展
后端数据模型
灵矶后端的数据模型是基于传统数据库,这和业界低代码平台的常见做法不一样,业界常见有两种做法:
- 基于非关系型数据库,最常用的是 mongo,大量零代码平台都是基于它开发的。
- 基于已创建好的宽表,比如预先创建 500 列,然后分配这些列给不同字段。
但这两种做法都有明显缺点:
- 数据是孤岛,因为数据类型特殊,因此只能存储在平台中,难以打通现有应用数据,只能通过 api 的方式交换数据,这也意味着这些低代码平台都只适合做全新应用,无法用于现有核心系统的开发,无法直连现有系统的数据库。
- 开发人员不熟悉,mongo 在国内依然小众,无 schema 既是优点也是缺点,没有 schema 容易导致新老数据结构不一致而引起问题,目前未听说有大公司在核心系统中使用 mongo,并且它的查询语法也远不如 SQL 普及。
- 有大量限制,基于已创建的宽表使得无法使用所有 SQL 语句,通常只支持查询,无法用 select *、无法创建 view 视图等,数据库各种高级功能几乎都没法用。
- 性能难以预估,而且因为要经过中间层转换,性能将有损,对开发者来说是个黑盒,出现性能问题将不好排查。
灵矶的数据模型采用了更传统的做法,它的原理是动态数据库 ORM 映射,可以理解为动态创建了 Entity 类,然后通过这些类去操作数据库。
这意味着在灵矶中:
- 数据模型就是数据库表,其中的字段就是表中的字段,对字段的修改是自动生成数据库的表结构变更操作,这和传统开发是一样的,开发人员都熟悉。
- 可以直连已有数据库,数据不再是孤岛,灵矶可以和传统开发混搭,可以用在现有成熟系统中,而不是只能做新应用。
- 即可以像操作对象那样便捷操作数据,也能使用任意 SQL 语句来实现复杂功能,实现和普通开发一样的灵活度。
- 性能和稳定性可预期,因为没有中间层转换,性能上限取决于数据库本身。 多环境独立 灵矶应用后端支持多环境,每个环境完全独立:
- 所有页面信息、导航、API 中心等在发布后就变成只读了,每个环境都是独立的。
- 数据模型将使用不同的库,数据不会相互影响。
- 发布之后所有前端静态文件都会保存当时的历史版本,即便平台做了不兼容升级也不会导致应用页面出问题。
业务编排
业务编排是一种可视化后端逻辑的能力,不少低代码产品使用的方式是基于图及连线的方式来编辑,比如下面是某个开源编排的截图:

使用图连接的方式虽然看起来漂亮,但实际使用体验不好,尤其是业务复杂的时候,连线会很乱,比如下面是一个复杂点的例子,可以发现这时已经很难看出执行逻辑了:

因此灵矶选择了开发人员更为熟悉的树形结构来进行业务编排:

使用这种方式有如下优点:
- 开发人员容易理解和看懂,它和写代码的思路是一样的,从上往下执行。
- 同时灵矶支持生成伪代码的能力,方便开发者检查。【TODO】
- 可以构建深层结构,并且能将它折叠起来方便一层层阅读,比起连线更简洁易懂。
灵矶在公司内部
灵矶在公司内部主要用户中后台前端开发,在公司的各个核心业务部门都有使用,包括运营、产品、技术、人工智能、大数据等,甚至被应用于多个重点项目中。例如,两年前的某大型活动,其实时调度控制界面就是基于灵矶开发的。
灵矶在公司内部的大规模普及并不是因为强制使用,而是各业务团队自主选择的,体现出了灵矶作为前端开发平台的高认可度。
公司内部较大的业务线基于灵矶制作了上千个页面,最复杂的页面包含超过 1 万行配置。
由于公司自身的大规模使用,灵矶的可靠性和长期维护都有充分保障。