Ответ 1
Я работал над проектом (частный, к сожалению), где я использовал D3 для представления редактора UML. Все использовало манипуляцию SVG, чтобы нарисовать SVG, представляющий UML.
Логика пользовательского интерфейса редактора была реализована в уникальном элементе React (UMLEditor), используя TypeScript и D3. Вы можете передать свойства редактора, чтобы установить изменения в UML, и обратные вызовы для возврата данных. Например, вы можете перетащить UML-класс (в 60 кадров в секунду), но пользовательский интерфейс запускает только два события (перетаскивание и падение) для ответа на обратные вызовы.
Клавиша состоит в том, чтобы иметь логику и события, отделенные от манипуляций пользовательского интерфейса, и иметь небольшое количество больших элементов реакции и не так много маленьких элементов.
Он может управлять UML с примерно 4K классами в 30 кадров в секунду.
Изменить. Позвольте определить небольшое приложение. У вас есть небольшие реагирующие компоненты со своими дочерними элементами, такие как корневой элемент приложения, панель навигации, окно просмотра и т.д.
Каждый элемент, кроме UMLEditor, оказывает небольшое влияние на производительность. Элемент UMLEditor - это сложный элемент без каких-либо проблемных детей. Каждый элемент пользовательского интерфейса внутри него визуализируется с использованием D3. Настоящий DOM UMLEditor содержит сложный элемент SVG, полностью управляемый с помощью D3.
Чтобы этот элемент взаимодействовал с React, мы передаем как реквизиты обратные вызовы для таких событий, как drag, drop, create new UML class... и один класс JavaScript со всей логикой визуализации D3.
Мы не передаем как поддержку всей конфигурации UML, так как это негативно скажется на производительности. Вместо этого, когда мы нуждались в нем для целей экспорта, класс JavaScript, переданный в качестве опоры, может дать всю конфигурацию UML с помощью метода.