简述首次Amis使用观感

百度的开源项目,由于百度名誉的问题,之前在听到这个开源项目,有点不屑一顾,奈何阿里一堆KPI项目及腾讯的相关开源更差,最终还是整了整Amis,最后发现还是挺香的

官网: https://aisuda.bce.baidu.com/amis/zh-CN/docs/index

Amis Github 编辑器主体: https://github.com/baidu/amis

Amis 官方体验地址: https://aisuda.github.io/amis-editor-demo/#/

Amis React 版集成: https://github.com/aisuda/amis-editor-demo

https://github.com/aisuda/amis-react-starter

无界微前端: https://wujie-micro.github.io/doc/

简介

Amis

amis 是一个低代码前端框架,它使用 JSON 配置来生成页面

无界

无界方案

无界微前端

这里采用了无界微前端集成Amis

React 注册自定义类型

使用无界微前端整合Amis到vue3的框架中,由于需要有一定的灵活性,我们类比了SDK模式和React模式最终选择了React模式,并以(https://github.com/aisuda/amis-editor-demo)为蓝本,对Amis进行自定义组件扩展

import {BasePlugin} from 'amis-editor-core';
import '@/renderer/MyRenderer'; // 渲染器

export default class MyRenderer extends BasePlugin {
  rendererName = 'my-renderer1';

  // 暂时只支持这个,配置后会开启代码编辑器
  $schema = '/schemas/UnkownSchema.json';

  // 用来配置名称和描述
  name = '自定义渲染器';
  description = '这只是个示例';

  // tag,决定会在哪个 tab 下面显示的
  tags = ['自定义', '自定义UI'];

  // 图标
  icon = 'fa fa-user';

  // 用来生成预览图的
  previewSchema = {
    type: 'my-renderer1',
    target: 'demo' // 复杂业务组件拖动
  };

  // 拖入组件里面时的初始数据
  scaffold = {
    type: 'my-renderer1',
    target: '233'
  };

  // 右侧面板相关
  panelTitle = '自定义组件';
  panelControls = [
    {
      type: 'tabs',
      tabsMode: 'line',
      className: 'm-t-n-xs',
      contentClassName: 'no-border p-l-none p-r-none',
      tabs: [
        {
          title: '常规',
          controls: [
            {
              name: 'target',
              label: 'Target',
              type: 'text'
            }
          ]
        },

        {
          title: '外观',
          controls: []
        }
      ]
    }
  ];
}

自定义组件需要配套自定义渲染器,来辅助渲染

ps: 未定义渲染器也是很多自定义组件未生效原因之一

import {Renderer} from 'amis';
import {RendererProps} from 'amis';
import React from 'react';

export interface MyRendererProps extends RendererProps {
  target?: string;
}

export default class MyRenderer extends React.Component<MyRendererProps> {
  static defaultProps = {
    target: 'world'
  };

  render() {
    const {target} = this.props;
    return <p>Hello {target}! @amis-editor</p>;
  }
}

Renderer({
  type: 'my-renderer1',
  autoVar: true
})(MyRenderer);

参照官方文档及以上代码,成果如下图所示

集成过程中所遇问题

1.文档较为薄弱

由于官方的Github的md说明版本之间有参差,一定以官网说明为主!

2.The renderer with name "XXX" has already exists, please try another name!

在Issues有极其多的类似问题,而我是通过升级编辑器版本解决的,建议使用最新版.

3.集成时使用了无界微前端内嵌Amis(https://github.com/baidu/amis),运行后样式全部丢失

无界在集成时,示例编辑器Html在引入scss,而在无界中运行时无法解析,需要更改scss的引入位置

ps: 正常在iframe中是可以直接展示的

ps: 以上仅是简单说明记录,若有问题敬请联系或评论,待补充~