百度amis

低代码

Posted by hdj on February 9, 2025

百度amis低代码平台

一、amis简介

什么是 amis

amis 是一个低代码前端框架,它使用 JSON 配置来生成页面,可以减少页面开发工作量,极大提升效率。

amis优势

amis 的解决方案是基于 JSON 来配置,它的独特好处是:

不需要懂前端:在百度内部,大部分 amis 用户之前从来没写过前端页面,也不会 JavaScript,却能做出专业且复杂的后台界面,这是所有其他前端 UI 库都无法做到的;

不受前端技术更新的影响:百度内部最老的 amis 页面是 6 年多前创建的,至今还在使用,而当年的 Angular/Vue/React 版本现在都废弃了,当年流行的 Gulp 也被 Webpack 取代了,如果这些页面不是用 amis,现在的维护成本会很高;

享受 amis 的不断升级:amis 一直在提升细节交互体验,比如表格首行冻结、下拉框大数据下不卡顿等,之前的 JSON 配置完全不需要修改;

可以 完全 使用 可视化页面编辑器 来制作页面:一般前端可视化编辑器只能用来做静态原型,而 amis 可视化编辑器做出的页面是可以直接上线的。

amis 的其它亮点

提供完整的界面解决方案:其它 UI 框架必须使用 JavaScript 来组装业务逻辑,而 amis 只需 JSON 配置就能完成完整功能开发,包括数据获取、表单提交及验证等功能,做出来的页面不需要经过二次开发就能直接上线;

大量内置组件(120+),一站式解决:其它 UI 框架大部分都只有最通用的组件,如果遇到一些稍微不常用的组件就得自己找第三方,而这些第三方组件往往在展现和交互上不一致,整合起来效果不好,而 amis 则内置大量组件,包括了富文本编辑器、代码编辑器、diff、条件组合、实时日志等业务组件,绝大部分中后台页面开发只需要了解 amis 就足够了;

支持扩展:除了低代码模式,还可以通过 自定义组件 来扩充组件,实际上 amis 可以当成普通 UI 库来使用,实现 90% 低代码,10% 代码开发的混合模式,既提升了效率,又不失灵活性;

容器支持无限级嵌套:可以通过嵌套来满足各种布局及展现需求;

经历了长时间的实战考验:amis 在百度内部得到了广泛使用,在 6 年多的时间里创建了 5 万页面,从内容审核到机器管理,从数据分析到模型训练,amis 满足了各种各样的页面需求,最复杂的页面有超过 1 万行 JSON 配置。

amis 不适合做什么?

使用 JSON 有优点但也有明显缺点,在以下场合并不适合 amis:

大量定制 UI:JSON 配置使得 amis 更适合做有大量常见 UI 组件的页面,但对于面向普通客户(toC)的页面,往往追求个性化的视觉效果,这种情况下用 amis 就不合适,实际上绝大部分前端 UI 组件库也都不适合,只能定制开发。

极为复杂或特殊的交互

有些复杂的前端功能,比如 可视化编辑器,其中有大量定制的拖拽操作,这种需要依赖原生 DOM 实现的功能无法使用 amis。

但对于某些交互固定的领域,比如图连线,amis 后续会有专门的组件来实现。

amis运行时集成方式:

  1. JS SDK,可以用在任意页面中

租户端目前就是使用这种方式集成,

sdk自定义组件

1.1 使用 custom 组件临时扩展

基于 custom 组件可以直接在 amis 配置实现自定义功能,它的支持面最广,是唯一支持在可视化编辑器中使用的方法。

使用 custom 组件类似如下写法:

{
    label: "使用 custom 组件",
    name: "username", // 如果要放在 form 中,需要设置 name,onChange
    将会设置这个值
    type: "custom",
    // onMount 将会在组件创建时执行,默认会创建一个空 div 标签,也可以设置
    inline: true 来创建 span 标签
    // dom 是 dom 节点,value 是初始数据,比如表单 name
    初始拿到的数据,onChange 只有在表单下才会有
    onMount: (dom, value, onChange) => {
    const button = ***document***.createElement("button");
    button.innerText = "点击修改姓名";
    button.onclick = (event) => {
    // 第二个参数是要修改的表单项名称
    onChange("new name", "username");
    event.preventDefault();
    };
    dom.appendChild(button);
    },
    // onUpdate 将会在数据更新时被调用
    // dom 是 dom 节点、data 将包含表单所有数据,prevData
    是之前表单的所有数据
    onUpdate: (dom, data, prevData) => {
    ***console***.log("数据有变化", data);
    },
    // onUnmount 将会在组件被销毁的时候调用,用于清理资源
    onUnmount: () => {
      console.log("组件被销毁");
    },
};

1.2 JS SDK 注册组件

amis 组件都是基于 React 的,所以需要使用一个简单的 React 组件来注册,可以是函数组件也可以是类组件,下面以函数组件为示例:

let amis = amisRequire("amis/embed");
let amisLib = amisRequire("amis");
let React = amisRequire("react");

// 自定义组件,props 中可以拿到配置中的所有参数,比如 props.label 是
'Name'
function CustomComponent(props) {
let dom = React.useRef(null);
React.useEffect(function () {
// 从这里开始写自定义代码,dom.current 就是新创建的 dom 节点
// 可以基于这个 dom 节点对接任意 JavaScript 框架,比如 jQuery/Vue 等
dom.current.innerHTML = "custom";
// 而 props 中能拿到这个
});
return React.createElement("div", {
ref: dom,
});
}

//注册自定义组件,请参考后续对工作原理的介绍

amisLib.Renderer({
test: /(^|/.)my-custom/,
})(CustomComponent);

let amisScoped = amis.embed("#root", {
    type: "page",
    title: "表单页面",
    body: {
        type: "form",
        mode: "horizontal",
        api: "/saveForm",
        body: [
        {
        label: "Name",
        type: "my-custom", // 注意这个的 type 对应之前注册的 test
        name: "custom",
        },
       ],
    },
});

1.3 JS-SDK引入 Vue - Element UI

首先在页面中加入 Element UI 所需的依赖

<linkrel="stylesheet"href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"/><script
src="https://unpkg.com/vue/dist/vue.js"></script><script
src="https://unpkg.com/element-ui/lib/index.js"></script>

然后将前面的 React.useEffect 改成如下即可:

React.useEffect(function () {
    dom.current.innerHTML = `
    <el-button @click="visible = true">Button</el-button>
    <el-dialog :visible.sync="visible" title="Hello world">
    <p>Try Element</p>
    </el-dialog>
    `;
    new Vue({
        el:dom.current,
        data: function () {
        return { visible: false };
        },
    });
});

2. React,可以用在 React 项目中

需要在react项目中使用,暂时未研究,

amis-editor编辑器集成

通过编辑器直接拖拽组件自动生成,目前 amis-editor 未开源,但可以免费使用(包括商用)

地址:https://aisuda.github.io/amis-editor-demo/#

github 地址:https://github.com/aisuda/amis-editor-demo

租户端演示地址,从编辑时到运行时打通。

http://192.168.1.105:8082/channel-management/index-2

参考

官方demo: https://github.com/Hdj2048228/amis-editor-demo

amis-vue-template https://github.com/kevin361419446/amis-vue-template [vue-amis-sdk. https://github.com/h7ml/vue-amis-sdk]{.underline}