Skip to content

API 设计 ​

API Reference 列的是“有哪些导出”。这里说明公开面为什么只有这些形状,以及哪些行为属于 稳定契约。

完整的逐模块签名和诊断码见 API Reference。

公开面的形状 ​

类别例子用途
纯函数阶段parseDocument、bindDocument、resolveTheme、四个 layout 原子、buildScene一段输入,一段输出
纯转换函数diffScene、hitTest、polylineD、resolveToken不持有状态
状态口createRegistry、emptyRegistry、createDomHost显式创建,不靠全局变量
组合根createPipeline、createDrawHandle缓存阶段 / 接上宿主
类型契约ShapeSpec、EdgeSpec、LayoutEngine、Router扩展点

核心原则:

  1. 正交:一个导出只做一件事。
  2. 原子:每段都能单独调用和测试。
  3. 可组合:前一段输出直接作为后一段输入。

统一返回模型 ​

ts
type Result<T> =
  | { ok: true; value: T; diagnostics: Diagnostic[] }
  | { ok: false; diagnostics: Diagnostic[] };
情况结果
无法产出可信值ok: false
可以回落ok: true + warning
调用方传错类型TypeScript 编译错误

调用方必须同时看 ok 和 diagnostics。成功不代表没有警告。

主入口与子路径 ​

入口内容约束
@ggn/drawcontract、bind、theme、registry、layout、scene、build、svg、pipeline、handle主入口不接触 DOM
@ggn/draw/contractschema / parse / 文档类型按需加载
@ggn/draw/registry注册表与扩展契约按需加载
@ggn/draw/layout四个几何原子、引擎、路由按需加载
@ggn/draw/sceneScene、diff、hitTest按需加载
@ggn/draw/svgrenderToSvg按需加载
@ggn/draw/domcreateDomHost直接操作 DOM
@ggn/draw/measure-canvasCanvas 度量器直接操作 Canvas

子路径与主入口是同一套实现,不是两套 API。

稳定的扩展契约 ​

契约负责边界
ShapeSpecschema、container、measure、anchors、render只看自己的 box / props / anchors / style
EdgeSpec线、标签、marker只看 route / props / style
MarkerSpec端点装饰只看连接点、角度、大小
LayoutEngine节点摆放只消费测量后的节点树、边、布局意图与上一帧
Router折点与标签落点只消费盒子、端口、容器与边
TextMeasurer文本尺寸不参与布局顺序
DrawHost场景落到介质不计算几何

扩展点按值传入。注册表不可变,with 返回新实例;冲突默认抛 RegistryConflictError。

明确不做的 API ​

不做原因
renderToSvg(document)会藏掉中间结果,无法单独替换和测试
EdgeSpec.route路由属于 layout,不属于边画法
DrawDocument.theme同一份文档需要能切换主题
全局可变注册表多个图、多个产品会互相污染
在 draw 内注册 UML 语义领域形状属于上层库

props 的一致性 ​

节点注册项可以提供同步 Standard Schema。bind 阶段校验并补默认值,产出的 BoundDocument 同时供 layout 与 build 使用。非法 props 只在 bind 报一次。

稳定性边界 ​

  • Scene 是宿主契约,场景节点字段和 key 规则属于稳定面。
  • LayoutResult 是中间结果,字段可扩展但已有字段语义稳定。
  • 内置 token 名是主题契约;具体默认色值不承诺永久不变。
  • 自定义 ShapeSpec 不能在 render 里读取文档或别的节点。
  • Scene patch 支持 create / update / move / remove;按 key 对齐,不依赖绝对序号。
  • Pipeline 缓存是实现细节,但 frame 中的 stage stats 与缓存语义属于可观察行为。
  • 公开 API 的增删遵循 semver;实验性能力先放文档和测试,不直接扩大主入口。

MIT License