背景
G6 3.0 ~ G6 4.x 经过近 3 年、186 个版本的迭代,当年的架构和细节设计逐渐浮现出了一些问题,不少用户反馈生命周期、API 合理性、数据结构合理性等问题。CY22 S2,我们将正式进入 G6 5.0 的设计阶段。
目标
期望在 CY23 推出 G6 5.0,具备更合理的架构,开发体验、使用体验更佳。更重要的是,希望 G6 5.0 较之于当前版本,有更强的代差感。-> 下面的问题治理仍然没有感觉到明显「代差」,需要更多 feature?
目前问题
1. 架构问题
- 无 spec:本该正交的能力和语法糖 区分不开 #逍为
- 配置项的一种规范,开发方式
- 同样的功能多种实现方式,
不必要的 export:这大概是当前 AntV 的通病。大概是因为扩展得机制不佳,所以需要 export 出去很多的变量和方法。 #逍为
2. 生命周期
常常出现异步更新,经常需要通过 setTimeout 来解决(类似 React)
目前很多异步函数,生命周期是通过时机事件抛出的,需要通过 graph.on 进行监听
克制?
- 缺失?
数据相关:用户分不清何时使用 data、changeData、updateItem、render。前两者可以合并。性能哪个好?各适合什么场景?数据存在很多份,原始数据、中间态数据。G6 修改的数据键放在指定 object
4. 功能机制
4.1 元素自定义机制
- 使用的是 mixin 的方式,单个函数内部无法 super 后扩展
- 继承含义不明确,用户常常不知道哪些函数被继承,会发生什么事情
- 接触 G 的绘图 API,各种图形的概念
- 超复杂节点 JSX,分层级(缩放等级)渲染的转换(包括布局、节点内部布局、全局重绘)
4.2. Behavior
- 当前的每种 behavior 配置到 graph 上是单实例的,如“快捷键”等 behavior,需要多例
- 如何规范化多个 behavior 之间产生冲突,更好地处理彼此间关系
- 机制目前没有开放,在生命周期的确定地方才可以插入,需要规范
- 定义哪些功能可以被扩展
- 核心模块插件化?灵活性与易读的平衡
- 生命周期需要一致
- 插件系统
- 联合 g2 组件机制:
4.4. 撤销重做
- 目前撤销重做栈存储的是变化前后的数据,是否应该改为命令的存储。X6 是怎么做的?
- 命令存储可能存在问题
- 目前无法处理多个原子操作的合并撤销/重做,例如将一个节点拖拽到 combo 内部,这里有的原子操作有:改变节点位置、改变节点与 combo 的从属关系、更新 combo 的位置和大小。预期撤销时,这几个原子操作应当一并撤销
-
4.5 元素的状态管理
目前状态管理有大量、频繁的 clone mix,将样式进行拷贝存储,有一定性能问题,也不太优雅。
4.6 动画规范
-
5. 数据
5.1. 数据隔离
目前通过 graph.data 输入的原数据,在渲染、布局之后,都会被修改,写入样式、位置信息等。@antv/layout 包也存在同样的问题
数据隔离是否必要?
-
5.2. 数据结构统一
与算法包 @antv/algorithm、布局包 @antv/layout 通用。方便形成规范和扩展
6. 布局
6.1. 参数问题
各个布局算法参数多,不好理解,用户需要凭借经验调参,很困难。希望能够参数自动化
渲染后的大小,需要影响布局
-
6.2. 多布局
6.3 增量数据布局保持一致性
7. 工程合理性
graph 核心类超长代码
- pnpm
- TypeScript 规范化
- 是否还有必要拆包?
- 现在太细了,对于 G6 新开发者来说,难以找到代码,类型的问题
- 过细的 repo 拆分带来: #逍为
- 代码归属,带来:代码 copy、更多的 repo、代码混乱
- 代码不可读
- 维护带来更多灵活性、可能性
- 虽然移动端交给 F6,但不意味着 G6 完全散失移动端扩展的可能性。可能由社区来做。可能将来有更多的可扩展性。
X6 抄作业指南
- 折线自动寻径算法,交叉、重叠
新需求
1. Debug 能力
例如性能问题,如何快速定位是自己带吗的问题还是 G6 的问题
抛出详细错误
redux dev tool: 看到所有事件的绑定、数据
2. 树图和图的转换?
3. 同画布多图实例
实例间的通信、管理问题。
- WebGL
- 包体积大小
- 风格化渲染
- L7 迁移完成后的打通,地图+图场景
-
G6 4.0 可保留的优点
1. 解耦合
- element、item、graph 由下至上隔离,即 element 渲染层感知不到 item,item 层感知不到 graph。由上至下管理
- behavior、分析算法、布局算法等与 graph 隔离,graph 与它们相互不感知。通过 graph 的各个 controller 进行管理
- 例:布局算法中没有 graph 实例,只有数据。graph 实例中没有布局实例。layoutController 中有 graph 实例、布局实例,相关生命周期由 layoutController 管理。
架构
方案(TODO)
1. Spec
围绕 spec 进行架构设计,最好可以和 G2 的 spec 形成整体 AntV 的 spec。
#逍为
2. 函数式
不用 class 去存储一些状态啥的,就纯 spec 驱动 ui,函数式代码,降低复杂度,代码组织容易,且打包小。
#逍为
3. 图形语法
?理论上说,G6 应该也能基于图形语法,加布局,或者是否还有其他的理论/语法。
#逍为
4. 生命周期规范与管理
- 清晰定义图的生命周期:创建(实例化) -> 读取数据 -> 渲染 -> 布局 -> 更新位置 -> 更新交互状态 -> 更换数据 -> 渲染 -> … -> 销毁
- 对于生命周期中的每一步,需要有对应的时机
5. 数据规范
设计规范的图数据结构,数据结构下沉,作为 G6、layout、algorithm 的基座。
#多牧6. 动画规范
7. 状态规范
8. 自定义规范
9. 其他具体见「目前问题」中每项解法
里程碑
| 2022.6.1 | G6 4.x 问题梳理 | | —- | —- | | 2022.10.1 | G6 5.0 架构设计完成 | | 2023. 4.30 | beta | | 2023.6.6 | 正式版本 |