组件转物料
为了能够在低代码平台运行使用我们的基础组件,需要把基础组件转换成低代码平台可识别的组件,也就是物料。物料需要进行一定的配置和处理,这个过程中,需要一份配置文件,也就是资产包(就是一份json)。资产包文件中,针对每个物料定义了它们在低代码编辑器中的使用描述。
如何引入组件
我们需要在资产包里定义这个包的获取方式,如果不定义,就不会被低代码引擎动态加载并对应上组件实例。定义方式是 UMD 的包,低代码引擎会尝试在 window 上寻找对应 library 的实例;
定义低代码编辑器中加载的资源列表,包含公共库和组件(库) cdn 资源等;
字段 | 字段描述 | 字段类型 | 规范等级 | 备注 |
---|---|---|---|---|
packages[].id? | 资源唯一标识 | String | A | 资源唯一标识,如果为空,则以 package 为唯一标识 |
packages[].title? | 资源标题 | String | A | 资源标题 |
packages[].package | npm 包名 | String | A | 组件资源唯一标识 |
packages[].version | npm 包版本号 | String | A | 组件资源版本号 |
packages[].type | 资源包类型 | String | AA | 取值为: proCode(源码)、lowCode(低代码,默认为 proCode |
packages[].schema | 低代码组件 schema 内容 | object | AA | 取值为: proCode(源码)、lowCode(低代码) |
packages[].deps | 当前资源包的依赖资源的唯一标识列表 | Array | A | 唯一标识为 id 或者 package 对应的值 |
packages[].library | 作为全局变量引用时的名称,用来定义全局变量名 | String | A | 低代码引擎通过该字段获取组件实例 |
packages[].editUrls | 组件编辑态视图打包后的 CDN url 列表,包含 js 和 css | Array | A | 低代码引擎编辑器会加载这些 url |
packages[].urls | 组件渲染态视图打包后的 CDN url 列表,包含 js 和 css | Array | AA | 低代码引擎渲染模块会加载这些 url |
packages[].advancedEditUrls | 组件多个编辑态视图打包后的 CDN url 列表集合,包含 js 和 css | Object | AAA | 上层平台根据特定标识提取某个编辑态的资源,低代码引擎编辑器会加载这些资源,优先级高于 packages[].editUrls |
packages[].advancedUrls | 组件多个端的渲染态视图打包后的 CDN url 列表集合,包含 js 和 css | Object | AAA | 上层平台根据特定标识提取某个渲染态的资源, 低代码引擎渲染模块会加载这些资源,优先级高于 packages[].urls |
packages[].external | 当前资源在作为其他资源的依赖,在其他依赖打包时时是否被排除了(同 webpack 中 external 概念) | Boolean | AAA | 某些资源会被单独提取出来,是其他依赖的前置依赖,根据这个字段决定是否提前加载该资源 |
packages[].loadEnv | 指定当前资源加载的环境 | Array | AAA | 主要用于指定 external 资源加载的环境,取值为 design(设计态)、runtime(预览态)中的一个或多个 |
packages[].exportSourceId | 标识当前 package 内容是从哪个 package 导出来的 | String | AAA | 此时 urls 无效 |
packages[].exportSourceLibrary | 标识当前 package 是从 window 上的哪个属性导出来的 | String | AAA | exportSourceId 的优先级高于exportSourceLibrary ,此时 urls 无效 |
packages[].async | 标识当前 package 资源加载在 window.library 上的是否是一个异步对象 | Boolean | A | async 为 true 时,需要通过 await 才能拿到真正内容 |
packages[].exportMode | 标识当前 package 从其他 package 的导出方式 | String | A | 目前只支持 "functionCall", exportMode等于 "functionCall" 时,当前package 的内容以函数的方式从其他 package 中导出,具体导出接口如: (library: string, packageName: string, isRuntime?: boolean) => any |
示例:
js
"packages": [
{
"package": "element-ui",
"version": "2.5.12",
"urls": [
"https://unpkg.com/element-ui/lib/index.js",
"https://unpkg.com/element-ui/lib/theme-chalk/index.css"
],
"library": "ELEMENT"
},
{
"package": "vant",
"version": "2.12.53",
"urls": [
"https://unpkg.com/vant@2.12/lib/vant.min.js",
"https://unpkg.com/vant@2.12/lib/index.css"
],
"library": "vant"
}
],
如何定义组件
单个组件描述内容为 json 结构,主要包含以下三部分内容,分别为:
- 基础信息 (A): 描述组件的基础信息,通常包含包信息、组件名称、标题、描述等。
- 组件属性信息 (A): 描述组件属性信息,通常包含参数、说明、类型、默认值 4 项内容。
- 能力配置/体验增强: 推荐用于优化搭建产品编辑体验,定制编辑能力的配置信息。
基础信息 ElRow示例:
js
{
"category": "基础组件",
"componentName": "ElRow",
"npm": {
"package": "element-ui",
"version": "2.30.6",
"exportName": "Row",
"destructuring": true
}
}
基础信息
字段说明
字段 | 字段描述 | 字段类型 | 允许空 |
---|---|---|---|
componentName | 组件名称 | String | 否 |
title | 组件中文名称 | String | 否 |
description | 组件描述 | String | 是 |
docUrl | 组件文档链接 | String | 否 |
screenshot | 组件快照 | String | 否 |
icon | 组件的小图标 | String (URL) | 是 |
tags | 组件标签 | String | 是 |
keywords | 组件关键词,用于搜索联想 | String | 是 |
devMode | 组件研发模式 | String (proCode,lowCode) | 是 |
npm | npm 源引入完整描述对象 | Object | 否 |
npm.package | 源码组件库名 | String | 否 |
npm.exportName | 源码组件名称 | String | 否 |
npm.subName | 子组件名 | String | 否 |
npm.destructuring | 解构 | Bool | 否 |
npm.main | 组件路径 | String | 否 |
npm.version | 源码组件版本号 | String | 否 |
snippets | 内容为组件不同状态下的低代码 schema (可以有多个), 用户从组件面板拖入组件到设计器时会向页面 schema 中插入 snippets中定义的组件低代码 schema | Object[] | 否 |
group | 用于描述当前组件位于组件面板的哪个 tab | String | 否 |
category | 用于描述组件位于组件面板同一 tab 的哪个区域 | String | 否 |
priority | 用于描述组件在同一 category 中的排序 | String | 否 |
组件属性信息 ElRow 示例:
js
"props": [
{
"name": "gutter",
"propType": "number"
},
{
"name": "type",
"propType": "string",
"defaultValue": "flex"
},
{
"name": "justify",
"propType": {
"type": "oneOf",
"value": ["start", "end", "center", "space-around", "space-between"]
},
"defaultValue": "start"
},
{
"name": "align",
"propType": {
"type": "oneOf",
"value": ["top", "middle", "bottom"]
}
},
{
"name": "tag",
"propType": "string",
"defaultValue": "div"
}
]
组件属性信息 props
描述组件属性信息,通常包含名称、类型、描述、默认值 4 项内容。
字段 | 字段描述 | 字段类型 | 允许空 |
---|---|---|---|
name | 属性名称 | String | 否 |
propType | 属性类型 | String/Object | 否 |
description | 属性描述 | String | 是 |
defaultValue | 属性默认值 | Any | 是 |
存在基本类型和复合类型,描述如下:Prop — Vue.js
基本类型
propType 值 | 类型描述 | PropType 类型 |
---|---|---|
'array' | 数组类型 | Array |
'bool' | 布尔类型 | Boolean |
'func' | 函数类型 | Function |
'number' | 数字类型 | Number |
'object' | 对象类型 | Object |
'string' | 字符串类型 | String |
'node' | 节点类型 | 定义具名插槽 |
'any' | 任意值类型 | 会生成多个setter切换,如:node、string、object、array类型 |
复合类型
propType 值 | 类型描述 | 用途 |
---|---|---|
{ type: 'oneOf', value: ['a', 'b', 'c', '...']} | 枚举值类型 | 从给定的数据选择一个,会生成 SelectSetter |
{ type: 'oneOfType', value: ['string', 'number', { type: 'array', isRequired: true }]} | 指定类型中的一种,支持递归描述 | 从给定的数据类型里,可切换 setter |
{ type: 'arrayOf', value: 'number'} | 指定统一成员值类型的数组类型 | 会生成 ArraySetter, value指定每一项的类型 |
{ type: 'shape', value: [{ name: 'color', propType: 'string' }, { name: 'fontSize', propType: { type: 'number', isRequied: true }}]} | 指定对象的部分属性名和值类型的对象类型 | 根据指定的key会生成 Objectetter |
{ type: 'exact', value: [{ name: 'name', propType: 'string' }, { name: 'quantity', propType: 'number' }]} | 严格指定对象全部属性名和值类型的对象类型 | 和 shape 类似,但需指定全部key |
能力配置/体验增强 configure
configure ElRow 示例:
js
"configure": {
"supports": {
"events": ["click", "change"],
"loop": true,
"condition": true,
"style": true
},
"component": {
"isContainer": true,
"isLayout": true
},
"props": [
{
"type": "group",
"title": "布局样式",
"display": "block",
"items": [
{
"type": "field",
"title": "类型",
"name": "type",
"defaultValue": "flex",
"condition": false
},
{
"type": "field",
"title": "栅格间隔",
"name": "gutter",
"setter": "NumberSetter"
},
{
"type": "field",
"title": "水平排列",
"name": "justify",
"setter": {
"componentName": "SelectSetter",
"defaultValue": "start",
"props": {
"options": [
{ "title": "start", "value": "start" },
{ "title": "end", "value": "end" },
{ "title": "center", "value": "center" },
{ "title": "space-around", "value": "space-around" },
{ "title": "space-between", "value": "space-between" }
]
}
}
},
{
"type": "field",
"title": "垂直排列",
"name": "align",
"setter": {
"componentName": "SelectSetter",
"defaultValue": "start",
"props": {
"options": [
{ "title": "top", "value": "top" },
{ "title": "middle", "value": "middle" },
{ "title": "bottom", "value": "bottom" }
]
}
}
}
]
}
]
}
基础字段
字段 | 字段描述 | 字段类型 | 备注 |
---|---|---|---|
props (A) | 属性面板配置 | Array | 用于属性面板能力描述 |
component(A) | 组件能力配置 | Object | 与组件相关的能力、约束、行为等描述,有些信息可从组件视图实例上直接获取 |
supports (AA) | 通用扩展配置能力支持性 | Object | 用于通用扩展面板能力描述 |
advanced (AAA) | 高级特性配置 | Object | 用户可以在这些配置通过引擎上下文控制组件在设计器中的表现,例如自动初始化组件的子组件、截获组件的操作事件进行个性化处理等 |