跳到主要内容

Ydesign

Ydesign 是一套用于构建「Canva / 创客贴一类在线设计编辑器」的 JavaScript SDK。它不是一个成品应用,而是一组开箱即用的 JS 模块、组件库与画布渲染引擎,帮助开发者在几天之内搭起一款功能完整、可深度定制的设计编辑器。

🎯 典型场景:电商商品自定义、社交媒体设计工具、印刷物料生产、证件照编辑器、海报 / 横幅生成器、企业内部 VI 模板…… 具体可以看案例展示


为什么要再造一个编辑器?

市面上已有一些优秀的画布底层库(如 fabric.jsKonva),以及闭源的商业 SaaS 方案(如 Polotno)。但自研过程中遇到的问题仍然明显:

  • 底层库只解决"渲染":选中、吸附、标尺、辅助线、撤销重做、图层、组合、滤镜、裁剪、消除笔……这些业务能力仍需要你一行行去写。
  • 商业 SaaS 不够自由:定制界面、替换组件、接私有化的素材 / AI 能力时束手束脚。
  • React / Vue 落地需要胶水:fabric 是命令式的,React / Vue 是声明式的,如何把画布状态同步到 UI、如何做响应式,每个团队都要踩一遍坑。

Ydesign 的目标

  • ✅ 提供成熟的画布业务封装(20+ Handler:滤镜、裁剪、辅助线、标尺、历史、锁、组、快捷键、AI 消除笔等),开箱即用
  • ✅ 保持架构清晰、分层明确,上层 UI 完全可替换、可裁剪
  • ✅ 用 MobX + MST 做数据层,让 React / Vue 写起来像"声明式"的 fabric
  • ✅ 以 Monorepo + 多包 形式分发,React / Vue / Headless 各取所需

三个包组成一个生态

Ydesign 仓库是一个 pnpm + turborepo 的 Monorepo,按职责拆为三个独立发布的 npm 包:

                    ┌─────────────────────────────┐
│ @ydesign/core │
│ 画布渲染核心 │
│ (纯 TS + fabric.js v6) │
└──────────────┬──────────────┘

┌─────────────────┴─────────────────┐
│ │
┌───────────▼───────────┐ ┌───────────▼───────────┐
│ @ydesign/react-editor │ │ @ydesign/vue-editor │
│ React 版 UI 层 │ │ Vue 版 UI 层(规划) │
│ React 18 + Antd v6 │ │ Vue 3 + Ant Design V │
└───────────────────────┘ └───────────────────────┘

每一层都可以独立使用,互相之间通过公共的 @ydesign/core 桥接。

@ydesign/core

画布渲染核心

纯 TypeScript 实现的画布业务引擎零 UI 依赖、不写一行 CSS。它接受一份 Fabric canvas,在其之上抽象出 20+ 个独立 Handler(每个 Handler 负责一块业务),由顶层 Editor 类统一管理。

能力域代表性 Handler
画布基础WorkareaHandler / ZoomHandler / RendererHandler / RulerHandler / ResizeHandler
对象与图层ObjectsHandler / LayerHandler / AlignmentHandler / LockHandler / GuidelinesHandler
交互EventHandler / HotkeyHandler / CustomHandler
历史HistoryHandler / SceneHandler
图片与 AIImageCropHandler / ImageFiltersHandler / ImageStrokeHandler / InpaintHandler

适合只要画布不要 UI 的场景(你自己做 UI)、或者想扩展新元素类型(比如二维码、条形码)。

@ydesign/react-editor

React 版 UI 层(已发布)

基于 React 18 + Ant Design v6 + MobX + mobx-state-tree 构建,是 Ydesign 目前最成熟、推荐首选的 UI 层。内部遵循「MST store 单一数据源 + observer 响应式渲染」模式,让开发者写组件几乎不用关心 fabric 的命令式事件流。

提供:

  • <Workspace /> 画布工作区
  • <Toolbar /> 顶部工具栏(按选中元素类型自动切换)
  • <SidePanel /> 左侧业务面板(10 个内置面板:模板 / 文字 / 图片 / 形状 / 上传 / 背景 / 图层 / 尺寸 / 证件照 / AI 消除笔)
  • <ZoomButtons /> 缩放控件
  • createStore / createDesignEditorApp 等入口工厂

@ydesign/vue-editor

Vue 版 UI 层(规划中)

基于 Vue 3 + Composition API + Pinia,与 React 版在能力、API 命名、JSON schema 上完全对齐。当前仍在设计阶段,优先级在 v1.0 稳定发布后。

两个 UI 层共享同一个 @ydesign/core,这意味着:

  • 在 React 版导出的设计稿 JSON,可以直接被 Vue 版打开(反之亦然)
  • 画布能力只需要维护一份,两套 UI 并行演进
  • 团队可以按前端栈选型,不被锁死

详情见 Vue 集成 页面的路线图。


分层原则

用一句话说清 Ydesign 的分层哲学:画布业务在 core,UI 在上层;UI 只读 store,state 单向流动

┌──────────────────────────────────────────────────────────────┐
│ React 组件 / Vue 组件(你的应用) │
└──────────────────────────┬───────────────────────────────────┘
│ observer 订阅 / actions 修改

┌──────────────────────────────────────────────────────────────┐
│ MST store(单一数据源) │
│ width / height / fonts / selectedElementsIds… │
└──────────────────────────┬───────────────────────────────────┘
│ store.editor.xxxHandler.xxx()

┌──────────────────────────────────────────────────────────────┐
│ @ydesign/core · Editor + 20+ Handler │
└──────────────────────────┬───────────────────────────────────┘


fabric.Canvas(fabric.js v6)

这种分层意味着:

  • 🎨 想要把 UI 换成 Solid / 原生 Web Components?重写 UI 层即可,core 完整复用
  • 🧩 想嵌入自家 UI 组件体系(Chakra / MUI)?替换 react-editor 里的局部面板
  • 🎯 只需要 headless 画布?直接用 @ydesign/core,UI 完全自研

快速上手

🚀 想用一条命令直接生成可运行的项目?请看 快速开始 · 使用脚手架。下面介绍的是把 Ydesign 接入已有项目的方式。

安装

# React 项目:安装完整 UI 版(推荐)
npm install @ydesign/react-editor

# 只要画布能力(Headless / Vue / Angular 项目)
npm install @ydesign/core

# Vue 项目(规划中,敬请期待)
# npm install @ydesign/vue-editor

一键启动一个完整编辑器

import { createDesignEditorApp } from '@ydesign/react-editor';
import '@ydesign/react-editor/style.css';

const { store, root } = createDesignEditorApp({
container: document.getElementById('root')!,
key: 'YOUR_API_KEY',
// 按需裁剪面板
sections: ['templates', 'text', 'photos', 'shapes', 'background', 'layers'],
});

// store 是 MST 实例,可用来读写状态
store.setSize({ width: 1200, height: 800 });

组合使用(保留最大自由度)

当你想把工具栏、侧边栏、画布自由布局:

import { DesignEditorContainer, SidePanelWrap, WorkspaceWrap, createStore, SidePanel } from '@ydesign/react-editor';
import Workspace from '@ydesign/react-editor/canvas/workspace';
import Toolbar from '@ydesign/react-editor/toolbar';
import ZoomButtons from '@ydesign/react-editor/toolbar/zoom-buttons';
import '@ydesign/react-editor/style.css';

export const App = () => {
const store = createStore({ key: 'YOUR_API_KEY' });

return (
<DesignEditorContainer>
<SidePanelWrap>
<SidePanel store={store} />
</SidePanelWrap>
<WorkspaceWrap>
<Toolbar store={store} />
<Workspace store={store} />
<ZoomButtons store={store} />
</WorkspaceWrap>
</DesignEditorContainer>
);
};

直接使用 Core(Headless)

如果你只需要画布能力、UI 完全自研:

import { Editor } from '@ydesign/core';

const editor = new Editor({
id: 'my-canvas',
container: document.getElementById('stage')!,
config: {
size: { width: 1920, height: 1080 },
},
});

// 添加一个文字
editor.objectsHandler.add({
type: 'text',
text: 'Hello Ydesign',
left: 100,
top: 100,
fill: '#111',
});

// 绑定快捷键
editor.hotkeyHandler.bind({
'ctrl+z,command+z': () => editor.historyHandler.undo(),
'ctrl+shift+z,command+shift+z': () => editor.historyHandler.redo(),
});

技术栈

@ydesign/core@ydesign/react-editor@ydesign/vue-editor
画布底层fabric.js v6共用 core共用 core
框架纯 TS,零依赖React 18Vue 3
组件库Ant Design v6Ant Design Vue(规划)
状态管理内部 StateMobX + mobx-state-treePinia(规划)
样式styled-components + Tailwind v4规划中
图标lucide-react + Antd Icons规划中
语言TypeScript 5TypeScript 5TypeScript 5
状态公开预览(0.1.x)公开预览(0.2.x)🚧 规划中

工具链:pnpm workspace + turborepo + tsup + tsc


与同类方案对比

维度Ydesign纯 fabric.jsKonvaPolotno
渲染层fabric.js v6自研自研(闭源)
上层业务封装✅ 20+ Handler
开箱即用 UI✅ Antd 组件✅ Blueprint
支持框架React ✅ + Vue 🚧 + Headless ✅纯 JS纯 JS + react-konva / vue-konva仅 React
响应式数据流✅ MobX + MST✅ MST
Core / UI 分包✅ 3 包分发❌(单包)
开源可定制❌(商业授权)
TypeScript✅ 全链路⚠️ 类型不全

下一步

遇到问题或有功能建议?欢迎到 GitHub Issues 提。想投票决定路线图?路线图页面见。