开源表单方案Formily的核心设计思路

如果无法正常显示,请先停止浏览器的去广告插件。
分享至:
1. 第 十 六 届 D 2 前 端 技 术 论 坛 Formily核心设计思路 白玄
2. 自我介绍 业务侧 横向团队 花名 姓名 白玄 王智力 来自阿里数字供应链事业部 SELF-INTRODUCTION
3. 什么是Formily 具体设计思路 目录 使用数据 未来规划
4. 什么是Formily? 是一款面向中后台复杂场景的 数据+协议 驱动的表单框架 它也是阿里巴巴集团统一表单解决方案 域名 https://formilyjs.org
5. 高性能 核心特点 相当完备 FEATURE 生态完备 协议驱动
6. 单一 职责 设计 原则 优雅命名 简单 直观 一致 DESIGN PHILOSOPHY
7. 核 心 架 构
8. 设计思路
9. 高性能思路 设计思路 问题 普通React用法,想要实现数 据收集和同步,需要强依赖 虚拟DOM的整树重绘才能达 到目的。 目标 不管字段数量多少,高频输入 ,永远都是O(1)复杂度
10. 方案一 —— ReactFinalForm/Antd4.0方案 抽象FormState/FieldState,内部使用pub/sub模式进行通讯,脏检查控制联动时的渲染重绘 时间复杂度 输入时:Ant Design O(1)/ReactFinalForm O(1) 联动时:Ant Design O(1 or n)/ReactFinalForm O(1 or n) 优点 简单,易上手 问题 • 脏检查成本高 • 外部联动无法做到O(1)
11. 方案二 —— UForm/Formily1.x方案 抽象FormState/FieldState,内部使用pub/sub模式通讯,抽象主动更新模型 时间复杂度 输入时:O(1) 联动时:O(1) 优点 高性能 问题
12. 方案三 —— ReactHookForm方案 基于DOM机制收集数据,绕过React受控更新机制,保证高频输入无卡顿 时间复杂度 输入时:O(1) 联动时:O(n) 优点 问题
13. 方案四 —— Formily2.0方案 依托Reactive响应式解决方案,构建整个响应式表单领域模型 时间复杂度 输入时:O(1) 联动时:O(1) 优点 • 不再需要大量脏检查成本,一切都是基于数据变化精确渲染 • 既支持主动更新模型,也支持被动响应模型,在多对一被动联 动场景,代码量大大减少 • 外部数据与表单内部字段联动时,只需要定义 ApplicationReactiveData即可,代码编写成本很低 问题
14. 高频输入性能 时间复杂度 O(1) 复杂度 2000个字段,针对单个字段的高频输入,完全无卡顿
15. 外部共享联动
16. 协议驱动思路 设计思路 问题 目标 如何更高效的开发表单? • 定义一套通用协议,简单高 效的描述表单UI/逻辑 • 对低代码搭建是友好的
17. 方案一 纯UITree协议方案,类似于JSON版的JSX 优点 • 足够简单,componentName/props/children完全可以把整个UI 结构给描述清楚 • 对搭建非常友好 问题 只能描述视图结构,无法描述状态模型
18. 方案二 标准JSON Schema方案,参考ReactJSONSchemaForm 优点 以数据描述视角来驱动UI渲染,基于这样的数据描述,我们可 以将很多状态处理逻辑固化到渲染引擎或者组件内部。从而 使得我们的协议层变得非常干净 问题 无法解决UI容器包裹问题,对搭建不够友好
19. 方案三 Formily2.0方案,针对JSONSchema的扩展协议 核心思路 • 扩展Void类型描述数据无关布局容器或控件 • 扩展 x-* 属性描述UI控件与控件属性 优点 • 完全表达UI,无需第二套协议,学习成本很低 • 可以将临时状态封装在渲染引擎或者组件内部 • 对搭建更加友好,因为它已经可以把UI层级给表达出来了
20. 扩展组件思路 设计思路 问题 如何开发协议驱动的自定义 组件 目标 • 足够简单 • 符合标准组件开发最佳实践
21. 基础扩展方案 属性约定,比如 value/onChange 组件属性约定,保证所有输入型组件可以快速接入 优点 符合统一 React 属性命名规范标准,对 于第三方组件接入成本很低 缺点 value/onChange/disabled/readOnly
22. 白盒进阶扩展方案 标准Hooks方案,借助ReactContext,就近寻找渲染引擎内部状态模型 优点 完全隔离了渲染引擎与组件自身属性,做到了 类型更友好,写法更自然的通信模式 缺点
23. 黑盒进阶扩展方案 连接器扩展 优点 • 无需重新封装组件,只需要关注属性与字段模型的映射 • 映射转换逻辑方便复用 缺点
24. 高级场景化扩展方案 渲染权限转移模板化方案 优点 可以封装出大量模板组件,模板组件内部可以将布 局,交互,布局,逻辑全部固化,在实际使用过程 中提效很高,比如ArrayTable/ArrayCard这种自增组 件 缺点
25. 总结 Formily的扩展能力,是建立在标准组件开发最佳实践 基础之上的,它是没有任何黑魔法的
26. 使用数据
27. 阿里系 叮咚 买菜 菜鸟 盒马 使用 数据 高德 天猫超市 58同城 非阿里系 美团点评 钉钉 淘系 技术部 蚂蚁集团 数字供应链 事业部 字节跳动 阿里云 Lazada 阿里拍卖 淘特 天猫国际 腾讯 本地生活 快手 客户 体验 业务平台 拼多多 网易 云音乐
28. 社区运营数据 总star数 总关闭issue数 chrome插件安装量 6.5k 700+ 1.6k 总fork数 总贡献人数 文档独立用户访问量 762 131 12k/月 总PR数 总下载量 900+ 152k
29. 未来规划 PLAN 规划 SHORTAGE 还有哪些不足? • 进一步优化性能 • 构建更多的扩展生态 React18 • 思考如何借助Formily一次性解决CRUD页面 • 不兼容IE,无法解决,也不想解决 • 整体体积较大,压缩前 130k左右,压缩后80k左右, 包含桥接组件库 • 学习成本还是比较高,打算逐步完善视频教程
30. Formily的价值到底在哪里? 在 1套底层 适配多个框架 高性能 的加持下 1份Schema 适配多端 1个生态 全业务场景覆盖 (Pro/Low/No Code)
31. 个人微信 Formily技术交流钉钉群
32. 数字供应链团队 数字供应链校招交流群
33. Thanks

Home - Wiki
Copyright © 2011-2024 iteam. Current version is 2.137.1. UTC+08:00, 2024-11-16 13:04
浙ICP备14020137号-1 $Map of visitor$