Skip to content

Free-Canvas 是一款高性能在线画布编辑器,支持流程图、UML、思维导图等多种图形绘制。项目采用 React + TypeScript,结合 Pixi.js 实现极致渲染性能,适合大规模节点场景。Free-Canvas is a high-performance online canvas editor that supports the drawing of various graphics such as flowcharts, UML, mind maps, etc.

License

Notifications You must be signed in to change notification settings

MU-ty/free-canvas

Repository files navigation

新对话

画布编辑器项目

Free-Canvas 是一款高性能在线画布编辑器,支持多种图形渲染、图形属性更改、支持流程图、UML、md列表等多种图形绘制以及画布交互、元素编辑、调参工具栏等功能。项目采用 React + TypeScript,结合 Pixi.js 实现极致渲染性能,适合大规模节点场景。

GitHub License React TypeScript PixiJS

image 画布编辑器外观

✨ 核心特色

  • 🚀 高性能渲染:WebGL 加速,50-100 倍性能提升,支持 100+ 元素流畅操作
  • 📐 智能流程图解析:支持 Mermaid、Markdown、PlantUML 自动转换为流程图
  • 📝 完整的 Undo/Redo:双栈设计,快照去重,一次点击对应一步历史
  • 📍 指南线 + 吸附系统:智能对齐,提升设计效率
  • 💾 数据持久化:自动保存到 LocalStorage,支持 JSON 导出
  • ⌨️ 丰富快捷键:Ctrl+Z/Y、Ctrl+C/V、编组解组、层级调整等

🎯 项目特性

✅ 已实现功能

基础渲染

  • ✅ 多种图形:矩形、圆角矩形、圆形、三角形、箭头线
  • ✅ 图形属性:背景色、边框宽度、边框颜色、圆角半径
  • ✅ 图片支持:PNG、JPEG 导入,3 种滤镜(灰度、褐色、模糊)
  • ✅ 富文本渲染:多种字体、字号、颜色、BIUS 样式、背景色

画布交互

  • ✅ 无限缩放:鼠标滚轮缩放(支持 TB、LR、BT、RL 多种方向)
  • ✅ 画布平移:Alt + 鼠标拖拽
  • ✅ 元素选择:单击、框选、Shift 多选
  • ✅ 拖拽移动:流畅的拖拽体验(优化后 <1ms 更新)
  • ✅ 指南线吸附:智能对齐到边缘、中心、间距
  • ✅ 吸附点显示:拖拽时显示吸附目标

高级编辑功能

  • ✅ 编组/解组:多个元素编组为一个整体,保持层级关系
  • ✅ 层级调整:置顶、置底、上移、下移
  • ✅ 旋转编辑:精确旋转角度设置
  • ✅ 属性面板:实时编辑元素的所有属性
  • ✅ 箭头绑定:箭头线自动跟随连接的图形

智能流程图解析

  • Mermaid 支持graph TD: A[节点] --> B 自动转流程图
  • Markdown 列表:缩进列表自动解析为树形图
  • PlantUML/UML:类图、关系自动识别
  • 自动布局:Sugiyama 分层算法智能排列

数据管理

  • ✅ 自动保存:防抖保存到 LocalStorage
  • ✅ JSON 导出:完整导出画布内容
  • ✅ PDF 导出:支持生成 PDF 文件
  • ✅ 数据恢复:刷新页面内容不丢失

撤销重做

  • ✅ 完整 Undo/Redo:双栈设计,最多 50 条历史
  • ✅ 快照去重:相同状态不重复记录
  • ✅ 批量优化:拖拽操作只记录起点和终点
  • ✅ 视口恢复:缩放和平移也可以撤销重做

快捷键

  • Ctrl/Cmd + Z:撤销
  • Ctrl/Cmd + Shift + ZY:重做
  • Ctrl/Cmd + C/V:复制粘贴
  • Ctrl/Cmd + G:编组
  • Ctrl/Cmd + Shift + G:解组
  • Ctrl/Cmd + [/]:旋转 90°
  • Ctrl/Cmd + Alt + Arrow:层级调整
  • Delete/Backspace:删除
  • Escape:取消选择

🚀 技术栈

技术 版本 用途
React 19 UI 框架
TypeScript 5.9 类型安全
PixiJS 8 WebGL 2D 渲染
Vite 7.2 构建工具
jsPDF 3.0 PDF 生成
React Compiler 1.0 自动优化渲染

📊 性能指标(实测数据)

拖拽单个 500×500 矩形

指标 优化前 优化后 改进
响应延迟 100-150ms 16-33ms ⬇️ 85%
帧率 30-40 FPS 58-60 FPS ⬆️ 80%
单次更新 50-100ms <1ms ⬆️ 100x
事件频率 100+ Hz 60 Hz ⬇️ 40%

多元素场景(3-5 个元素)

  • 优化前:20-30 FPS,明显卡顿 ❌
  • 优化后:55-60 FPS,流畅操作 ✅

📦 安装和运行

安装依赖

npm install

运行开发服务器

npm run dev

构建生产版本

npm run build

预览生产版本

npm run preview

🎮 使用说明

基本操作

操作 方法
创建元素 点击顶部工具栏的图形/文本/图片按钮
单选 单击元素
多选 拖拽框选或 Shift + 单击
移动 选中后直接拖拽
旋转 使用旋转手柄或属性面板输入角度
缩放 使用角落和边中点的控制柄
改属性 在右侧属性面板修改

画布操作

缩放        → 鼠标滚轮上下滚动
平移        → Alt + 鼠标拖拽
重置视图    → 点击工具栏重置按钮

快捷键速查表

撤销/重做      → Ctrl/Cmd + Z / Ctrl/Cmd + Shift + Z
复制/粘贴      → Ctrl/Cmd + C / Ctrl/Cmd + V
编组/解组      → Ctrl/Cmd + G / Ctrl/Cmd + Shift + G
旋转 90°       → Ctrl/Cmd + [ / Ctrl/Cmd + ]
置顶/置底      → Ctrl/Cmd + Alt + ↑ / ↓
上移/下移      → Ctrl/Cmd + Alt + → / ←
删除           → Delete / Backspace
取消选择       → Escape

📁 项目结构

Free-Canvas/
├── src/
│   ├── components/                  # React 组件库
│   │   ├── CanvasView.tsx           # 画布主组件(事件处理、交互)
│   │   ├── App.tsx                  # 应用主体(快捷键、状态分发)
│   │   ├── Toolbar.tsx              # 工具栏(创建元素、导出等)
│   │   ├── PropertyPanel.tsx        # 属性面板(元素编辑)
│   │   ├── GuideLineRenderer.tsx    # 指南线组件
│   │   ├── SnapCirclesRenderer.tsx  # 吸附点显示
│   │   ├── ArrowHandles.tsx         # 箭头控制柄
│   │   ├── ResizeHandles.tsx        # 尺寸缩放柄
│   │   ├── TextEditor.tsx           # 文本编辑器
│   │   ├── RichTextEditor.tsx       # 富文本编辑器
│   │   ├── MiniMap.tsx              # 小地图预览
│   │   ├── ContextMenu.tsx          # 右键菜单
│   │   └── MermaidDialog.tsx        # Mermaid 导入对话框
│   │
│   ├── hooks/
│   │   └── useCanvasState.ts        # 核心状态管理(1100+ 行)
│   │       ├─ 元素管理:增删改查
│   │       ├─ 历史管理:Undo/Redo 双栈
│   │       ├─ 编辑操作:拖拽、旋转、编组
│   │       └─ 交互支持:批量更新、快照去重
│   │
│   ├── renderer/
│   │   └── PixiRenderer.ts          # PixiJS 渲染引擎(650+ 行)
│   │       ├─ 完整渲染:render()
│   │       ├─ 增量更新:updateElementTransform()
│   │       ├─ 批量优化:updateElementsTransform()
│   │       └─ 形状绘制:各类图形的渲染逻辑
│   │
│   ├── utils/
│   │   ├── mermaidParser.ts         # Mermaid 流程图解析
│   │   ├── markdownParser.ts        # Markdown 列表解析
│   │   ├── umlParser.ts             # PlantUML/UML 解析
│   │   ├── graphLayout.ts           # Sugiyama 分层布局算法
│   │   ├── mermaidToCanvas.ts       # 图转画布元素
│   │   ├── guideLines.ts            # 指南线计算逻辑
│   │   ├── arrowSnap.ts             # 箭头吸附逻辑
│   │   ├── helpers.ts               # 通用工具函数
│   │   ├── textStyles.ts            # 文本样式处理
│   │   └── storage.ts               # LocalStorage 操作
│   │
│   ├── types/
│   │   └── index.ts                 # 全局类型定义
│   │       ├─ CanvasElement:元素基类
│   │       ├─ ShapeElement:图形元素
│   │       ├─ TextElement:文本元素
│   │       ├─ ImageElement:图片元素
│   │       ├─ GroupElement:编组元素
│   │       └─ ViewportState:视口状态
│   │
│   ├── assets/                      # 静态资源
│   ├── App.css                      # 应用样式
│   ├── index.css                    # 全局样式
│   ├── main.tsx                     # 入口文件
│   └── index.html
│
├── package.json                     # 项目依赖配置
├── tsconfig.json                    # TypeScript 配置
├── vite.config.ts                   # Vite 构建配置
├── eslint.config.js                 # ESLint 规则
│
│
└── README.md                        # 本文件

🏗️ 核心架构与技术深度

数据流架构

用户交互事件
    ↓
CanvasView 组件(事件捕获)
    ↓
useCanvasState Hook(状态管理)
    ├─ 元素状态:elements[]
    ├─ 选中状态:selectedIds[]
    ├─ 视口状态:viewport
    └─ 历史状态:pastRef, futureRef
    ↓
PixiRenderer(WebGL 渲染)
    ↓
画布显示

关键算法

1. Sugiyama 分层布局(用于流程图)

  • 时间复杂度:O(n + e)
  • 步骤:拓扑排序 → 减少交叉 → 分配坐标
  • 应用:Mermaid、Markdown、UML 解析后自动排列

2. Undo/Redo 双栈

  • 结构:pastRef(撤销栈)+ futureRef(重做栈)
  • 优化:快照去重、批量更新、防递归
  • 性能:O(1) 栈操作,O(n) 快照应用

3. 指南线吸附

  • 算法:计算元素间距离,识别对齐目标
  • 复杂度:O(n²) 最坏情况,O(n log n) 使用空间分区
  • 功能:边缘、中心、间距等多种对齐

4. 增量渲染 + RAF 节流

  • 问题:100+ Hz 鼠标事件 × 全量重新渲染 = 卡顿
  • 解决:RAF 同步到 60 Hz + 只更新转换矩阵
  • 效果:响应延迟降低 85%,帧率提升 80%

元素系统

// 基类
CanvasElement {
  id: string
  type: ElementType
  x, y, width, height: number
  rotation: number
  zIndex: number
}

// 派生类型
ShapeElement       图形(矩形、圆形等)
TextElement        文本(富文本支持)
ImageElement       图片(支持滤镜)
GroupElement       编组(包含子元素)

🎨 核心特性详解

1. 智能流程图解析

支持三种输入格式自动转换为可视化流程图:

Mermaid 格式

graph TD
    A[开始] --> B{决策}
    B -->|是| C[继续]
    B -->|否| D[返回]
Loading

Markdown 列表

- 项目启动
  - 需求分析
    - 用户调研
  - 设计阶段
- 开发阶段
  - 前端开发
  - 后端开发

PlantUML 类图

class Animal {
  - name: String
  + speak()
}
class Dog {
  + bark()
}
Animal <|-- Dog

2. 高性能渲染

优化策略

  • 使用 PixiJS WebGL 而非 Canvas 2D(10+ 倍性能提升)
  • 增量渲染:只更新改变的属性
  • RAF 节流:同步到 60 Hz 屏幕刷新
  • 转换优化:更新矩阵而非重新创建图形

实现代码位置

  • 完整渲染:src/renderer/PixiRenderer.tsrender()
  • 增量更新:updateElementTransform()updateElementsTransform()
  • 事件优化:src/components/CanvasView.tsxhandleMouseMove()

3. 完整的 Undo/Redo

特点

  • 双栈设计:pastRef(撤销栈)+ futureRef(重做栈)
  • 快照去重:相同状态不重复记录
  • 批量优化:高频操作(拖拽)只记录起点和终点
  • 历史限制:最多保留 50 条记录,防止内存溢出
  • 全状态恢复:包含 elements、selectedIds、viewport

使用示例

// 记录快照
commitSnapshot(elements, selectedIds, viewport);

// 撤销
undo();  // 返回上一状态

// 重做
redo();  // 前进一步

4. 指南线与吸附系统

功能

  • 拖拽时自动显示参考线
  • 支持多种对齐方式:边缘、中心、间距
  • 吸附点清晰可见
  • 智能距离阈值(默认 10px)

算法

  • 计算选中元素与其他元素的相对位置
  • 检测是否满足吸附条件(距离 < 阈值)
  • 显示参考线,自动调整位置

5. 箭头线和元素绑定

特性

  • 箭头线支持自由两端
  • 可绑定到其他图形的边缘
  • 移动图形时箭头自动跟随
  • 支持各种箭头样式和曲率

🚀 快速开始

1. 克隆并安装

# 克隆项目
git clone https://github.com/your-repo/Free-Canvas.git
cd Free-Canvas

# 安装依赖
npm install

2. 开发模式

# 启动开发服务器
npm run dev

# 打开浏览器访问 http://localhost:5173

3. 构建生产版本

# 编译打包
npm run build

# 预览生产版本
npm run preview

4. 代码检查

# ESLint 检查
npm run lint

# TypeScript 类型检查
npx tsc --noEmit

🤝 参与贡献

欢迎提交 Issue、PR 和建议!

贡献流程

  1. Fork 本仓库
  2. 创建特性分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 开启 Pull Request

代码规范

  • TypeScript 严格模式
  • ESLint 代码检查(自动格式化)
  • React Hooks 最佳实践
  • 完善的代码注释

📄 许可证

本项目采用 MIT License 许可证。

🙏 致谢

感谢以下开源项目的支持:

  • PixiJS - 强大的 WebGL 2D 渲染引擎
  • React - 用于构建 UI 的 JavaScript 库
  • TypeScript - JavaScript 的超集,提供类型安全
  • Vite - 下一代前端构建工具
  • jsPDF - PDF 生成库

⬆ 回到顶部

Made with ❤️ by MU-ty

About

Free-Canvas 是一款高性能在线画布编辑器,支持流程图、UML、思维导图等多种图形绘制。项目采用 React + TypeScript,结合 Pixi.js 实现极致渲染性能,适合大规模节点场景。Free-Canvas is a high-performance online canvas editor that supports the drawing of various graphics such as flowcharts, UML, mind maps, etc.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages