跳到主要内容

自研vsKonva-Fabric-Pixi

缺的不是 API,是 场景图、命中、历史记录、导出。库能买到这些,也会把你锁进它的对象模型和渲染循环。

1. 怎么选

需求倾向
少量自定义绘制 + 自己已有 scene自研 Canvas 2D
需要变换手柄、成组、序列化,产品就是编辑器Konva 或 Fabric
大量精灵、粒子、交互游戏Pixi(WebGL,2D context 不够)
必须无障碍、可选文本不要这些库当 DOM
导出要像素级自己控滤镜自研或只把库当预览
type Stack = "custom-2d" | "konva" | "fabric" | "pixi";

export function chooseRenderer(input: {
editorChrome: boolean;
spriteCount: number;
pixelFilters: boolean;
existingSceneGraph: boolean;
}): Stack {
if (input.spriteCount > 5_000) return "pixi";
if (input.existingSceneGraph && !input.editorChrome) return "custom-2d";
if (input.pixelFilters && !input.editorChrome) return "custom-2d";
if (input.editorChrome) return "konva";
return "custom-2d";
}

数字是量级信号,不是基准。5k 简单矩形在 2D 上可能仍够;5k 带阴影滤镜的照片就不行。

2. 各库实际买到什么

Konva
场景图 + 层 + 变换器(Transformer)成熟。事件是它自己的,和 Pointer Events 不完全同一套。导出 toDataURL 仍受 taint 约束。适合白板/设计工具原型。自定义像素滤镜要跳出节点树自己搞离屏。

Fabric.js
对象模型偏「画布上的图元」,序列化 JSON 开箱即有。文本编辑比 Konva 顺。版本跨越时对象 schema 要自己迁移。大列表(几百复杂 path)会在 JS 对象和 2D 光栅之间两头烧。

PixiJS
渲染器是 WebGL/WebGPU,不是 CanvasRenderingContext2D。你在本体系学的 CTM/willReadFrequently 不能 原样搬过去。粒子、骨骼、滤镜 shader 才是它的主场。UI 编辑器硬用 Pixi 会把简单矩形变成纹理上传问题。

Paper.js / Rough.js / Svg.js
Paper 是矢量运算友好;Rough 是风格化描边。它们解决的是几何/风格,不是高 DPI 产品壳。可以当生成 path 的库,光栅仍走你自己的 ctx。

3. 自研时不要重新发明的部分

即使不用 Konva,也要有:

  • 相机与锚点缩放
  • 指针状态机 + capture
  • 命令栈撤销
  • 分层(静态/动态)
  • 导出走干净表面

库内部仍是立即模式。把「用了 Konva」当成「不用懂 backing store」会在 Retina 和导出上翻车。DPR、taint、OffscreenCanvas 规则不变。

4. 失败形态

症状原因
上了 Fabric 仍然糊没设其 pixelRatio / 没跟 DPR
Pixi 里 getImageData那是 GL 读回,成本模型全变
库的 toJSON 当唯一数据源业务字段丢失,协作 crdt 对不上
两个 rAF 循环库有自己的 stage.draw,外面又写了一个

权威资料

核对日期:2026-08-26