Требования

  • рисование примитивных/произвольных/заготовленных фигур
  • параллельная работа с объектами разными пользователями
  • создание/изменение/удаление объектов
  • работа с текстом
  • курсоры пользователей
  • исчезающие чернила
  • undo/redo
  • подсветка авторов фигур
  • возможность рисования при демонстрации окна

Слои

Рендеринг доски

Интерфейс работы с доской

Объектная модель доски

Модель синхронизации

Транспорт

Presenter

Presenter

View

Viewer

INITIAL SYNC

Presenter

Participant

Viewer

Presenter

Participant

Viewer

Presenter

Participant

Viewer

Presenter

Participant

Viewer

Готовые решения

Рендеринг:

Konvajs, Fabricjs, Excalidraw, Tldraw

Интерфейс:

Excalidraw, Tldraw

Модель:

Excalidraw, Tldraw, Konvajs, Fabricjs

Синхронизация:

Yjs, Automerge

Транспорт:

jitsi & WebRTC

💩

💖

  • Закрывает сразу 3 слоя
    • Рендер
    • Интерфейс
    • Модель
  • Куча фич из коробки
    • Базовые инструменты рисования
    • Библиотека изображений
    • Готовый интерфейс для коллаборативного режима
    • Undo Redo
  • Нерасширяемый
    • Нельзя добавить свои инструменты
    • Нельзя гибко управлять элементами интерфейса
    • Нельзя отключить перемещение/масштабирование
  • Страшная реализация внутри
  • Кривой undo/redo в коллабе
  • React

Вывод: Невозможно/сложно реализовать все требования, зато дешево реализовать базовые

💩

💖

  • Закрывает 3 слоя
    • Рендер
    • Интерфейс
    • Модель
  • Модульная архитектрура под капотом, можно напилить свой интерфейс используя только tldraw/core
  • Можно запретить скрол и зум канваса в tldraw/core
  • Можно расширять набор объектов
  • Есть фичи для коллаба
  • Рендер в DOM через React DOM
  • React
  • Производительность????

💩

💖

  • Закрывает 2 слоя
    • Модель
    • Рендер
  • Typescript
  • Есть встроенный инструмент для перемещения и маштабирования объектов
  • Низкоуровневая - все базовые инструменты придется реализовывать с 0

Вывод:

Многое придется реализовывать самим

💩

💖

  • Закрывает 2.5 слоя
    • Модель
    • Рендер
    • Немножко интерфейс
  • Есть встроенные инструменты
    • произвольное рисование кистью + поддержка разных кистей
    • перемещение и трансформация
    • работа с вводом/редактированием текста
  • Расширяемость через наследование
  • Олдсукльная
    • плохая типизация
    • своя реализация ООП
  • Многое придется реализовывать самим
  • Сложная модель
  • Некоторые встроенные инструменты работают не та как хочется:
    • Рисование кистью создает объект только после отпускания мыши
    • Изменения текста оражаются в объекте только после расфокуса

но активно разрабатывается

версия с более современным API

Вывод:

Многое придется реализовывать самим, но меньше чем в konva)

💩

💖

  • Закрывает 1 + 1 слоя
    • Модель синхронизации
    • Транспорт
  • Надежная синхронность обусловленная матаном - CRDT
  • Куча плагинов для транспортного уровня
  • Есть плагин для undo/redo ✨ 
  • Библиотека на слуху, там где идет речь о поддержки коллаба
  • Сложная внутри - без бутылки водки не разберешься как она считает диффы и что она пересылает по сети.
  • При одновременной работе с объектом не мержит, а перезаписывает

Сложно, но гибко и расширяемо

Рендеринг:

Fabricjs

Интерфейс:

Fabricjs + Напилим свой

Модель:

Fabricjs + Свои расширения

Синхронизация + undo/redo:

Yjs

Транспорт: ?

jitsi либо Yjs + бэкенд

Рендеринг:

tldraw/core

Интерфейс:

tldraw или Напилить свой

Модель:

tldraw/core + Свои расширения

Синхронизация + undo/redo:

Yjs

Транспорт: ?

jitsi либо Yjs + бэкенд

Проще но не так гибко, придётся тащить реакт

Толк - рисовалка

By Andrey Osipov

Толк - рисовалка

  • 370