大概涉及到的几个技术栈中,Ant Design Charts 是对 G2Plot 做了 React 化,G2Plot 是对 G2 做了API上的优化,G2 是对 G 做了图表的封装,而最底层的 G 是一套同时支持 Canvas 和 SVG 的 2D 渲染引擎。后三者都是 AntV 团队的作品,已开源,文档地址统一贴在文末。
G
G 的实现原理就是在画布 Canvas 上增加图形 Shape,仿佛作画一般。
如下的代码画一块 600 * 500 的画布:
| 1 | // 这里的 Canvas 只是画布的意思,如果是 svg,则是 import { Canvas } from '@antv/g-svg'; | 
如下的代码在这块画布上画一个圆:
| 1 | canvas.addShape('circle', { | 
结果如图所示:
类型除了圆形circle,还支持椭圆ellipse、矩形rect(包括圆角)、直线line、折线polyline、多边形polygon、路径path,以及几何图形、图片、文本、DOM 节点等。
除了单独画图形 Shape,还支持增加分组 Group,如下:
| 1 | const group = canvas.addGroup(); | 
这样的好处是可以实现事件冒泡和委托,如下:
| 1 | // 事件冒泡 | 
源码
G 是一个用 lerna 搭建的仓库,底下包括 g-base、g-canva、g-svg、g-math、g-mobile、g-webgl 几个仓库。
g-base 包含了抽象画布 AbstractCanvas 之类的基类定义,以及在 g-base/lib/types 保存了相关 ts 定义。
g-canva、g-svg 则是两套分别基于 canvas 和 svg 的具体实现,两者在 draw 方法的实现上有差异。
g-math 提供几何图形的运算。
g-mobile、g-webgl 暂时还无内容。
G2
G2 是相对比较完善的图表库了,也是 AntV 团队 Star 数最高(10.3k)的作品了。
他是通过容器和数据源,配合图形语法,绘制出图表的。如下是创建 Chart 对象:
| 1 | import { Chart } from '@antv/g2'; | 
可以见到和 G 创建画布如出一辙。如下是载入数据源:
| 1 | const data = [ | 
接下来便是用 G2 的图形语法绘制图表。如下是绘制柱状图的一个例子:
| 1 | chart.interval().position('genre*sold'); | 
结果如图所示:
源码
G2 的容器就是 G 的画布,会根据 renderer 调用 getEngine 获取不同的引擎(canvas/svg)。
G2Plot
G2Plot 就是在 G2 封装的基础上做了写法的优化。
Ant Design Charts
Ant Design Charts 对我而言就是就是封装了一层自定义组件,让我可以不必再手动写 useEffect 等逻辑去手动更新 G2Plot 的 config 或 data。额外地,他还支持以下几个新功能:
- Tooltip 支持 ReactNode
-   额外的 downloadImage()、toDataURL()等 API
- 自定义 memoData 功能,按需控制图表 rerender
参考资料
未完待续