入口先分析到这里,还是挺简单的。收获:
=
browser+mjs >
module >
browser+cjs >
main该如何找一个工程的入口文件呢,参考[[狀 package.json 正确配置入口文件]]文章可知,这里的入口是工程中的index.js
,它的主入口就是 all.js 文件。
export * from './lib/all.js'
src 源码目录如下,留到后面补文件注释。
├── Element.ts
├── Handler.ts
├── PainterBase.ts
├── Storage.ts
├── all.ts
├── animation
├── canvas
├── config.ts
├── contain
├── core
├── debug
├── dom
├── export.ts
├── global.d.ts
├── graphic
├── mixin
├── svg
├── svg-legacy
├── tool
└── zrender.ts
根据以上分析找到 all.ts 文件,这里做了一些初始化的事情:registerPainter,注册绘图工具,默认注册了 canvas 和 svg。
// src/all.ts
export * from './zrender';
export * from './export';
import {registerPainter} from './zrender';
import CanvasPainter from './canvas/Painter';
import SVGPainter from './svg/Painter';
registerPainter('canvas', CanvasPainter);
registerPainter('svg', SVGPainter);
从使用方式来看,zrender 导出了一个对象,这个对象上面有一个init的方法,接收一个DOM对象,所以让我们看看 init 方法做了什么吧。
zrender.init(document.getElementById("canvas"))
init
方法接受一个 dom 元素和一些 options,调用 init
方法会 return 一个实例化对象,内部将实例保存到全局变量 intstances
中。
// src/zrender.ts
export function init(dom?: HTMLElement | null, opts?: ZRenderInitOpt) {
const zr = new ZRender(zrUtil.guid(), dom, opts);
instances[zr.id] = zr;
return zr;
}
需要传入实例 id
export function getInstance(id: number): ZRender {
return instances[id];
}
/** Dispose self. */
dispose() {
this.animation.stop();
this.clear();
this.storage.dispose();
this.painter.dispose();
this.handler.dispose();
this.animation =
this.storage =
this.painter =
this.handler = null;
delInstance(this.id);
}
function delInstance(id: number) {
delete instances[id];
}
export function disposeAll() {
for (let key in instances) {
if (instances.hasOwnProperty(key)) {
instances[key].dispose();
}
}
instances = {};
}