# 可视化编辑支持第三方组件库展示能力

对于已有的小程序组件库,工具可视化新增展示能力。只需该组件库包处于 miniprogram_npm 目录下,且在组件库根目录下配置相应的配置文件接口 工具可视化即可解析和添加该组件库组件信息,使其可以拖拽到相应页面 wxml 和 json 中。

# 运行环境

1.05.2206242 或以上版本的开发者工具

# 新建操作流程

工具可视化的第三方组件库接入,需要新增配置一份 json 来进行管理

# 1. 新建配置

  • 在组件库的根目录中新建一个 .wechatide.ib.json,需要打包后的 miniprogram_root

# 2. 配置组成说明

# 2.1 主要结构 components 和 menu

  1. .wechatide-ib.json 内部是一个 json 对象,包含以下 key
export interface IIBComponentLibConfig {
  key: string // 组件库标识,如 tdesign
  label: string // 可读名称,如 "Tdesign 组件"

  // 组件列表说明配置
  components: {
    [propName: string]: IIBComponentLibConfigComponent
  };

  // 菜单相关
  menu: IIBComponentLibConfigMenu[], // 组件面板菜单情况
  common: IIBComponentLibConfigCommon // @TODO 通用属性和配置
}

# 2.2 组件定义 IIBComponentLibConfigComponent

工具会通过 components 的内容获取定义组件的基本信息


export interface IIBComponentLibConfigComponent {
  key?: string; // 组件标签名称, 如 "t-button", 应该和组件列表的 key 是一样的,工具会默认补齐,可不配置
  label: string; // 组件可读名称,如 "按钮"
  icon: string; // 组件 icon 示意图、本地或者网络地址,建议尺寸为 200 * 100, 如 "../../xxx.png" 或者 “https://xxxx/xx.png”
  topIcon?: string // 组件如果需要放在头部,本地或者网络地址,建议尺寸 44 * 44, 内边距为 10, 如 "../../xxx.png" 或者 “https://xxxx/xx.png”
  events?: IIBComponentLibConfigEvent[]; // 事件列表
  properties?: IIBComponentLibConfigProperty[]; // 属性列表
  tpl?: string; // 自定义组件模块代码,为空则用 key 作为标签名生成默认 tpl `<$key></$key>`
  path?: string, // 原子组件的相对 npm 根目录的位置
  require?: {
	[propName: string]: string	
  } // 组件依赖的其他组件,填写的是依赖的组件的 key,通常是组合组件tpl 才会需要填写
  externalClasses?: string[] // 外部样式类
}

组件 icon ,如下所示

组件 topIcon, 如下所示

例如最简单的一个组件 button,虽然没什么用

{
  "button": {
    "key": "td-button",
    "icon": "",
    "label": "按钮"
 }

# 2.2.1 组件自定义模板 tpl

tpl 表示使用组件会生成的节点结构内容,如果为空则相当默认使用组件 key 来拼一个空的标签 <td-button />

{
  "key": "td-button",
  "icon": "",
  "label": "按钮",
  "tpl": "<td-button />"
}

如果需要自定义的話,则会输出对应的 tpl <td-button type="warn">按钮</td-view>

{
  "key": "td-button",
  "icon": "",
  "label": "按钮",
  "tpl": "<td-button type=\"warn\">按钮</td-button>"
}

# 2.2.2 组件依赖路径 path

组件如果是自定义组件的内容,是需要去依赖加载的,path 表示该组件的组件定路径,相对组件库根目录

{
  "key": "td-button",
  "icon": "",
  "label": "按钮",
  "tpl": "<td-button type=\"warn\">按钮</td-button>",
  "path": "./dist/components/button/index" 
}

# 2.2.3 组合组件依赖说明 require

如果 tpl 配置的是组合多个自定义组件的话,且不是一个自定义组件的话,可以通过配置 require 来有多个依赖的话

{
  "key": "td-button-group",
  "icon": "",
  "label": "按钮",
  "tpl": "<view><td-button type=\"warn\">按钮</td-button> <t-icon></t-icon><view>",
  "require": {
     "td-icon": "./dist/components/icon/index",
     "td-button": "./dist/components/button/index"
  }
}

# 2.2.4 组件事件 IComponentEvent

组件事件 IComponentEvent 解释自定义组件能够配置的事件

interface IIBComponentLibConfigEvent {
  key: string; // 事件名称,如"onChange"
  label: string; // 事件展示可读名称
  desc: string; // 事件展示的描述
  references?: IIBComponentLibConfigPropertyReferences // 组件属性说明文档
}

// 事件说明文档地址
interface IIBComponentLibConfigPropertyReferences {
  desc: string,
  url: string
}

示例,如下自定义了一个 onClick 的事件属性

{
  "key": "td-button-group",
  "icon": "",
  "label": "按钮",
  "tpl": "<td-button type=\"warn\">按钮</td-button>",
  "path": "./dist/components/button/index",
  "events": [
    {
    "key": "onClick",
    "label": "点击处理",
    "desc": "点击按钮后触发绑定"
    }
  ]
}

# 2.2.5 组件属性 IComponentProperty

组件属性 IComponentProperty 解释组件能够配置的属性


type ComponentPropertyType = 'Boolean' | 'String' | 'Color' | 'Image' | 'Enum' | 'Number' | 'Object' | 'Array'
export interface IIBComponentLibConfigProperty {
  key: string; // 属性名称, 如 "value"
  label: string; // 属性展示可读名称
  desc: string; // 属性展示的描述
  type: ComponentPropertyType[]; // 属性值类型(多种)
  defaultValue?: any // @TODO
  enum?: any[] // @TODO 枚举,对应下拉选择
  references?: IIBComponentLibConfigPropertyReferences // @TODO 组件属性说明文档
}

如下面定义了一个button 的 type 属性,其值类型为字符串,默认值为 ”normal"

{
  "key": "td-button-group",
  "icon": "",
  "label": "按钮",
  "tpl": "<td-button type=\"warn\">按钮</td-button>",
  "path": "./dist/components/button/index",
  "properties": [
  {
        "key": "text",
        "label": "文本",
        "desc": "按钮文本",
        "type": "String",
        "defaultValue": "normal"
      },
  {
        "key": "type",
        "label": "类型",
        "desc": "按钮类型",
        "type": "Enum",
        "defaultValue": "a",
        "details": [
        "a", "b", "c"
        ]
      }
  ]
}

# 2.2.6 复用公共的 properties 和 event(暂不支持)

可在 common 定义公共的 property 和 event ,然后组件使用的时候只需要写对应的 key 值即可

{
  "common": {
    "properties": {
      "commonText": {
        "key": "text",
        "label": "文本",
        "desc": "按钮文本",
        "type": "String",
        "defaultValue": "normal"
      }
    }
  },
  "components": [
    {
      "key": "td-button-group",
      "icon": "",
      "label": "按钮",
  	  "tpl": "<td-button type=\"warn\">按钮</td-button>",
  	  "path": "./dist/components/button/index",
      "properties": [
        "commonText",
        {
          "key": "type",
          "label": "类型",
          "desc": "按钮类型",
          "type": "Enum",
          "defaultValue": "a",
          "details": ["a", "b", "c"]
        }
      ]
    }
  ]
}

# 2.3 组件定义菜单

菜单定义的是展示组件的层级结构,目前只支持总共三级的结构

  • 组件类型
  • 组件二级类型
  • 具体组件
// 一级菜单
// 一级菜单
export interface IIBComponentLibConfigMenu {
  key: string; // 菜单唯一标识
  label: string; // 菜单可读名称
  icon?: string // 菜单 menu 图标 20*20
  submenu: IIBComponentLibConfigSubMenu[];
}
// 二级菜单
export interface IIBComponentLibConfigSubMenu {
  key: string; // 二级菜单唯一标识
  label: string; // 二级菜单可读名称
  components: string[]; // 对应的组件 key
}

示例如下

{
  "menu": [
    {
      "key": "form",
      "label": "表单组件",
      "icon": "",
      "submenu": [
        {
          "label": "按钮",
          "key": "button",
          "compnents": ["button", "button-group"]
        }
      ]
    }
  ]
}

# 完整的描述

/**
 * 可视化组件库配置规范
 */

export interface IIBComponentLibConfig {
  key: string // 组件库标识
  label: string // 可读名称

  // 组件列表说明配置
  components: {
    [propName: string]: IIBComponentLibConfigComponent
  };

  // 菜单相关
  topList?: string[], // 组件面板顶部通用组件列表 max 5个,配置的内容是 components 中组件的 key
  menu: IIBComponentLibConfigMenu[], // 组件面板菜单情况

  // @TODO: 其他配置
  remote?: string // @TODO 远程配置地址,后续读取配置进行更新
  common: IIBComponentLibConfigCommon // @TODO
}

// 通用 properties 和 events
export interface IIBComponentLibConfigCommon {
  properties?: {
    [proName: string]: IIBComponentLibConfigProperty;
  }, // 通用属性
  events?: {
    [proName: string]: IIBComponentLibConfigEvent;
  }, // 通用事件
}

export interface IIBComponentLibConfigComponent {
  key?: string; // 组件标签名称, 应该和组件列表的 key 是一样的,工具会默认补齐
  label: string; // 组件可读名称
  icon: string; // 组件 icon 示意图、本地或者网络地址,建议尺寸为 200 * 100
  topIcon?: string // 组件如果需要放在头部,本地或者网络地址,建议尺寸 44 * 44, 内边距为 10
  events?: IIBComponentLibConfigEvent[]; // 事件列表
  properties?: IIBComponentLibConfigProperty[]; // 属性列表
  tpl?: string; // 自定义组件模块代码,为空则用 key 作为标签名生成默认 tpl `<$key></$key>`
  path?: string, // 原子组件的相对 npm 根目录的位置
  require?: string[] // 组件依赖的其他组件,填写的是依赖的组件的 key,通常是组合组件tpl 才会需要填写
}

interface IIBComponentLibConfigEvent {
  key: string; // 事件名称,如"onChange"
  label: string; // 事件展示可读名称
  desc: string; // 事件展示的描述
  references?: IIBComponentLibConfigPropertyReferences // 组件属性说明文档
}

type ComponentPropertyType = 'Boolean' | 'String' | 'Color' | 'Image' | 'Enum' | 'Number' | 'Object' | 'Array'
export interface IIBComponentLibConfigProperty {
  key: string; // 属性名称, 如 "value"
  label: string; // 属性展示可读名称
  desc: string; // 属性展示的描述
  type: ComponentPropertyType[]; // 属性值类型(多种)
  defaultValue?: any // @TODO
  enum?: any[] // @TODO 枚举,对应下拉选择
  references?: IIBComponentLibConfigPropertyReferences // @TODO 组件属性说明文档
}

// 对应文档地址
export interface IIBComponentLibConfigPropertyReferences {
  desc: string,
  url: string
}

// 一级菜单
export interface IIBComponentLibConfigMenu {
  key: string; // 菜单唯一标识
  label: string; // 菜单可读名称
  icon?: string // 菜单 menu 图标 20*20
  submenu: IIBComponentLibConfigSubMenu[];
}
// 二级菜单
export interface IIBComponentLibConfigSubMenu {
  key: string; // 二级菜单唯一标识
  label: string; // 二级菜单可读名称
  components: string[]; // 对应的组件 key
}