一、可视化搭建的核心不在编辑器,在协议
讨论物流页面可视化搭建工具,直觉上会聚焦于编辑器的拖拽体验------画布是否流畅、组件是否丰富、属性面板是否好用。但真正决定一个搭建工具能否支撑真实业务、能否长期演进的,不在编辑器,而在编辑器背后的协议层。
在快递系统的后台管理、调度看板、网点操作界面中,大量页面是"表单+列表+详情"的组合。这些页面的结构高度相似,但字段、校验规则、数据来源各不相同。如果每个页面都手写代码,研发效率极低;但如果搭建工具没有稳定的协议,产出的页面无法进入工程体系,维护成本会反噬效率收益。

阿里 LowCodeEngine 的分层架构把这一点表述得很清楚:自下而上是协议---引擎---生态---平台 ,引擎是协议的实现,引擎本身又分为入料、编排、渲染、出码四个模块。协议是编辑器、渲染引擎、出码引擎之间的共同契约,决定了工具的能力上限。
二、协议层:页面是一棵与框架无关的组件树
2.1 核心抽象:页面 = JSON Schema
可视化搭建的第一原则,是把"页面"从"写死的模板"中解放出来,抽象为一棵与框架无关的组件树 JSON。编辑器的一切操作------拖拽、改属性、删除节点、调整层级------本质上都是在修改这份 JSON。
json
{
"id": "node_1024",
"componentName": "FormInput",
"props": { "label": "运单号", "required": true, "placeholder": "请输入" },
"children": [],
"hidden": false
}
id 是全树唯一标识,用于选中、移动、删除和事件绑定;componentName 决定渲染哪个真实组件;props 是该组件的属性;children 描述嵌套关系。整棵树用一个根节点包裹,页面 = 递归渲染这棵树。
这个抽象的价值在于解耦:组件树不关心底层是 React 还是 Vue,不关心最终是运行时渲染还是编译出码。同一份 Schema,可以走不同的引擎路径,产出不同的运行时形态。
2.2 物料 Schema:组件必须"自我描述"
组件树只记录了"用了哪个组件、传了什么属性"。编辑器还需要知道"这个组件有哪些属性可以编辑、每个属性用什么控件编辑、默认值是什么"。这是物料 Schema 的职责。
json
{
"name": "FormInput",
"title": "输入框",
"propsSchema": [
{ "key": "label", "type": "string", "default": "标签" },
{ "key": "required", "type": "boolean", "default": false },
{ "key": "width", "type": "number", "default": 100, "min": 0, "max": 100 }
]
}
右侧属性面板遍历 propsSchema,根据 type 自动渲染对应的编辑控件。新增物料时不需要手写属性面板,物料通过元信息"自我描述",编辑器据此自动适配。
关键工程约束 :Schema 与组件实现必须保持同步。组件新增了属性,如果忘记登记到 propsSchema,属性面板里就改不到它,物料的实际能力和编辑器暴露的能力之间出现缺口。生产级工具需要把物料 Schema 变更纳入 CI 流程,而不是依赖开发者记忆。
三、渲染引擎:运行时渲染与出码的选型分叉
Schema 描述页面结构,但"谁来把它变成用户看到的界面"存在两条根本不同的路线。
3.1 运行时渲染:保存即生效,但引擎会膨胀
运行时渲染把 Schema 交给一个引擎,在浏览器中递归解析并渲染组件。编辑器和最终页面共用同一套渲染逻辑,保存后刷新即可看到效果。
阿里 LowCodeEngine 的渲染模块采用分层架构:协议层 提供 Schema 规范,能力层 提供 Props 解析、样式注入、条件渲染,适配层 抹平 React、Rax 等框架的 API 差异,渲染层提供核心渲染方法。适配层让同一套 Schema 可以在不同框架的运行时中渲染。
运行时渲染的代价是引擎膨胀:功能不断叠加,引擎代码越来越复杂,而它是项目级别的能力,所有页面共享同一个引擎版本,一次不完整的测试就可能导致线上所有页面崩溃。
3.2 编译出码:产物纯源码,但失去即时编辑
编译出码把 Schema 当作源代码,通过代码生成器编译成目标框架的可读源码,然后走正常的构建和发布流程。出码的本质是一次递归树遍历:遍历组件树的每个节点,根据 componentName 和 props 生成代码片段,再拼装成完整组件。
出码的收益是产物是纯源码:运行时引擎只在设计态存在,生产环境不包含它;生成的代码可以进入 Git、走 MR review、接入已有的 CI/CD;即使某次出码有 bug,也只影响当次生成的页面,不会像运行时引擎那样引发全局崩溃。对于快递系统面向 C 端的查件页、下单页,出码可以把解析负担从浏览器转移到编译时,显著降低首屏加载时间。
但出码是单向的:Schema 可以出码为源码,源码修改后无法再转回 Schema。一旦选择出码,页面就脱离了低代码编辑器的可维护范围,转入 ProCode 维护。
3.3 选型的本质:页面归属于谁
两条路线不是优劣关系,而是适用边界不同。运行时渲染适合归属权在低代码平台、需要持续在线调整的页面 ------运营活动页、内部管理后台的表单和列表。编译出码适合归属权需要迁移到工程体系、性能敏感或需要深度定制的页面------C 端查件页、需要 Merge 进老工程的新增页面。
工程上更务实的做法是双路径并存:平台同时提供运行时渲染和出码能力,由页面的性能要求、归属策略和定制深度决定走哪条路。
四、避坑指南
坑1:没有协议规范,物料和引擎紧耦合。 新增一个组件要改引擎代码,物料无法独立演进。协议先行,物料按资产包规范自我描述。
坑2:物料 Schema 与组件实现不同步。 组件新增属性没登记到 propsSchema,属性面板改不到。Schema 变更纳入 CI 流程。
坑3:运行时引擎无限膨胀。 所有功能往引擎里加,一次不完整的测试影响所有页面。出码是缓解引擎膨胀的有效手段,让运行时引擎只存在于设计态。
五、总结
物流页面可视化搭建的核心是协议、引擎、产物三件事。组件树 Schema 描述页面结构,物料 Schema 描述组件能力,两者共同构成编辑器、渲染引擎、出码引擎之间的契约;运行时渲染以"保存即生效"换取"引擎膨胀风险",编译出码以"构建成本"换取"产物纯源码、可进入工程体系";两者的选择取决于页面归属权和性能要求。工具的能力上限不在编辑器里有多少组件,而在协议是否稳定、引擎是否可治理、产物是否可进入工程体系。
下一篇预告:页面搭建解决了"长什么样",但表单的字段、校验和数据来源如何动态变化?明天聊元数据驱动的动态表单引擎。
> 本文作者:深圳+Eyf•半字节科技▪技术产品团队
> 快递快运、零担整车、海运空运铁路、快递末端等物流运营场景,让每一票,都清晰可控。从订单任务分配到签收回传,一站式管理每个作业环节。