一、背景

表单Form开发,尤其在中台项目中,是FE🐒的家常便饭,一般需要大量的重复性工作🥱:

• 编写模板
• 编写校验规则
• 表单提交(偶尔联动)

同时,Server也需要编写校验规则。然而,伴随业务变更和前后端开发同步不及时的情况,前后端校验规则可能会存在不一致的问题。所以「前后端共用校验规则」也可在范畴之内。

二、目标

减少重复性工作🚀:通过配置自动生成表单模板,同时这个配置最好还能描述表单校验相关。

三、方案选型

1. form-render

2019年10月阿里开源,基于React框架的跨组件表单生成引擎。通过 JSON Schema 生成标准 Form,常用于自定义搭建配置界面生成。

📖 官方文档

👀 playground演示

优点:

  • schema基于JSON schema 协议进行拓展,可以无缝接入;
  • 天然支持 antd 和 fusion两套,其他的组件库可通过 widgets 的方式传入;
  • 对于具体表单组件属性的互动,使用ui:options存放的特定配置(例如textarea的rows,基本上所有的antd文档中的props都可以使用ui:options的方式来直接使用);
  • 对于具体表单组件样式的互动,使用的是ui:className,可通过该属性值的变动驱动该组件的样式;
  • 支持弹窗展示,list+list无限嵌套,list+modal等复杂数据结构;
  • 当使用 js 对象作为 schema 时,属性的值可以传函数,实现组件之间的联动;
  • 支持自定义组件功能,自定义主题,如定制化按钮、异步搜索输入框或者含xxx UI的组件;

缺点:

  • 开源时间不长,参考内容有限(在接受范围之内)🥷;
  • 关于表单校验,只满足简单的长度校验和正则表达式校验,复杂的校验场景(如接口校验)不能通过JSON schema驱动;
  • 暂时没有Vue框架的版本🦞;
2. react-jsonschema-form

基于React的组件,支持常用UI库,使用JSON Schema 生成Form表单。

📖 官方文档

👀 Playground

优点:

  • 遵循 JSON Schema 规范,只需要给定 JSON Schema,即可生成对应的form表单;
  • 支持自定义组件、自定义模板、自定义主题
  • 支持Ant Design、Bootstrap 3、Bootstrap 4、Fluent UI、Material UI、Semantic UI;
  • 社区比较活跃,star✨较多;

缺点:

  • 目前的版本默认视图依赖elementUi,后续版本可能会解耦开;
  • 表单schema校验使用 ajv,有一定的使用成本;
  • 官方示例较少,英文文档,上手体验一般;
3. vue-json-schema-form

react-jsonschema-form的vue版本,基于 Vue、ElementUi、JSON Schema 动态生成一个带完整校验的Form表单。

📖 官方文档

👀 Playground

优点:

  • 遵循 JSON Schema 规范,只需要给定 JSON Schema,即可生成对应的form表单;
  • 有活动编辑器和Schema生成器,开发体验友好;
  • 表单schema校验使用 ajv,相对来讲校验比较丰富;

缺点:

  • 目前的版本默认视图依赖elementUi,后续版本会解耦开来,可通过配置适配ElementUi,iView 或者你自己开发的组件库等;
  • 基于vue的框架,且暂不支持vue3;
  • 表单schema校验使用 ajv,有一定的使用成本;
  • 社区不是特别活跃,star✨较少;
4. form-generator

Element UI表单设计及代码生成器,可将生成的代码直接运行在基于Element的vue项目中;也可导出JSON表单,使用配套的解析器将JSON解析成真实的表单。

👀 Playground

优点:

  • 20+个组件基本能满足业务场景使用;
  • 可以导出vue文件,小特色🎉;

缺点:

  • 只有生成器教程,竟然没有开发文档😣;
  • 不支持组件联动,硬伤;
  • 组件嵌套时,似乎不是很流畅,issue里有人提到;
  • 除了必填和正则表达式校验,不支持别的;
5. amis

2019年7月百度开源,前端低代码框架(包含了表单生成),通过 JSON 配置就能生成各种页面。

amis 的渲染过程是将 json 转成对应的 React 组件。先通过 json 的 type 找到对应的 Component 然后,然后把其他属性作为 props 传递过去完成渲染。

📖 官方文档

👀 amis编辑器demo

优点:

  • 内置100+种UI组件🌈,同时支持自定义组件、模板开发;
  • 支持JS SDK 和 React两种使用方法;
  • 对于组件样式的互动比较丰富,如表单label提示;
  • 表单校验内置邮箱、URL各种格式,支持自定义校验,和自定义验证提示;
  • 容器支持无限级嵌套,可以通过组合来满足各种布局需求;
  • 支持基本组件联动、接口联动和组件间的联动;
  • 框架成熟,文档示例齐全;

缺点:

  • 比较庞大,适合mis系统页面配置生成,可能不太适合本次表单生成方案😅;
  • 开发复杂度较高,不易上手;
  • 与JSON schema 协议融合度不高;
  • 内置UI比较素,或者通过自定义组件来使用第三方UI;
    等等,还有很多框架,不再赘述🙈…

结论

总体言之,表单生成方案比较丰富,基本都能满足常见业务场景🌕。本次调研草率的体验了几个常用的表单生成框架,如有错误之处,还请告之及时更正。

最后,从功能支持、技术生态、开发体验、协议标准、可扩展性等多方面来考量,个人认为,form-render比较适合本人本次的项目选型。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐