背景
G 4.0 之前,整个 入口是统一的,通过 svg、canvas renderer 来区分,这种情况下做多引擎切换和按需是打包简单的。
G 4.0 之后,画布变成多个 entry,如何做到按需加载 SVG、Canvas 包由开发者来控制,以便 G2 层做到按需引入。
方案
概略来说,因为 G 层没有 renderer 管理的部分,所以有 G2 增加一个 G 版本管理的小模块,提供注册功能给开发者,内部仅消费。全量 G2 注册 svg、canvas 两个。
- engine 管理
在 G2 层增加 registerEngine,getEngine API 去注册和获取引擎,然后由开发者去注册 svg、canvas 版本的 G,注册的类是各个引擎的 Canvas。
const ENGINES = {};
export function getEngine(name: string) {
return ENGINES[name];
}
export function registerEngine(name: string, engine: G) {
ENGINES[name] = engine;
}
- 注册 engine
index.ts全量注册两个 G 版本。core.ts不注册任何 G。
import * as Canvas from '@antv/g-canvas';
import * as SVG from '@antv/g-svg';
import { registerEngine } from '@antv/g2/lib/core';
registerEngine('canvas', Canvas);
registerEngine('svg', SVG);
- Chart.ts消费 engine
import { getEngine } from './engine';
class Chart {
// ...
createCanvas() {
const renderer = this.renderer;
const G = getEngine(renderer);
this.canvas = new G.Canvas({
width: this.width,
height: this.height,
// ...
});
}
// ...
}
- G 层要求
- g-canvas 和 g-svg 的 export 保持一模一样
- g-base 中 export G 的类型定义
弊 & 优
- 弊端
因为 G 多 entry 导致上层需要
- 做一个 engine 管理的东西,有点冗余
- 需要 G2 层额外提供 engine 管理的两个方法
- 代码写法上的问题
- 优点
开发者可以完全自定义加载,按需打包上也会做的比较好一些。