Моя третья последующая статья в опасном мире сетевых визуализаций, еще одна полоса неустанных исследований с собственным привкусом острых ощущений. Если вы никогда не слышали о mxGraph , значит, он устарел, погребен под тысячелетним жаргоном.
Порожденный из JGraph (Java), mxGraph основан на JavaScript, большая часть его кодовой базы на основе JGraph. С точки зрения происхождения он примерно начался в конце 2005 года и стал EOL после 2020 года, как гласит примечание Github:
NOTE 09.11.2020 : Development on mxGraph has now stopped, this repo is effectively end of life.
Вы все еще можете найти его корнем в JGraph, также известном как. Diagrams.net, который работает как на компьютере, так и в Интернете. Одной из интересных частей этой библиотеки является формат файла на основе XML, который безупречно работает с файлами диаграмм, созданными в 2005 году.
Что такое mxGraph? 🤨
В двух словах, это библиотека разработчика JavaScript, предназначенная для предоставления компонентов plug-and-play для рисования, перемещения и взаимодействия с элементами контекстной диаграммы или графика со свойствами. Он написан на чистом JavaScript, без транспиляторов или NPM-зависимостей. Простой ванильный редактор mxGraph выглядит так:
В крайнем левом углу находится библиотека Stencils (Shapes) или объекты-узлы, которые можно размещать, взаимодействовать и соединять, холст для рисования посередине и крайняя правая панель свойств для холста для рисования или выбранного объекта-узла. Узлы, размещенные и соединенные на холсте макета, отображаются как SVG, но в фоновом режиме склеиваются в формате файла XML.
Понимание структуры библиотеки mxGraph 🧐
Прежде чем совершить гигантский скачок, было важно знать точную структуру этой библиотеки. Несколько каталогов и файлов для редактора холста, библиотеки трафаретов (форм), взаимодействия, ввода/вывода (IO), утилит, а также того, как они просматриваются на холсте. Подводя итог, проверьте вывод tree
:
. ├── editor ├── handler ├── io ├── layout ├── model ├── shape ├── util ├── view └── mxClient.js 11 directories, 143 files
Инициализация mxGraph выполняется с помощью mxClient.js
файла, который включает в себя все необходимые заводские настройки, шаблоны (фигуры), взаимодействия, прослушиватели событий, элементы меню, панели инструментов и холст макета. Прошерстив сотни файлов, я близко изучил архитектуру. Большая часть компонентов основана на объекте-прототипе JavaScript, который может быть унаследован или переопределен. Косметические изменения в значительной степени зависели от того, как и где их переопределить, не затрагивая ядро.
mxGraph против VueJS 🤦🏻
Facepalming в значительной степени соответствует моей первой реакции, когда я читал о требованиях к PoC-дизайнеру. На клиенте было запущено приложение Python (Django) для управления/предоставления кластеров, поддерживаемых через реестр поставщиков, сетевых и облачных объектов. Весь рабочий процесс можно сжать на диаграмме ниже (создано с помощью диаграммы.io)
Хотя конструктор PoC действует как визуальный инструмент построения SDN, он все же должен использовать объекты узла (Stencils), их свойства по умолчанию, операции кластера, которые предоставляют, останавливают, завершают и замораживают экземпляр в API Python (JSON). Когда проект кластера готов с постоянными свойствами и коннекторами, которые могут быть динамическими, шаблон сохраняется в формате XML (в кодировке base64) с использованием еще одного Python API.
Впереди была цепочка геркулесовых трудов — создание динамических элементов управления для свойств с сохраняемостью, привязкой событий, гладкой передачей знаний и устойчивой кодовой базой — это лишь некоторые из них. VueJS обеспечивает правильную симметрию между удобочитаемым кодом, архитектурой plug-and-play, сохраняемостью сеанса (связывание данных через модели) и более того — отсутствие зависимостей от сборщиков.
Развязка mxGraph — первый геркулесов труд 💪🏻
Разделяй и властвуй! Наука дедукции не может ошибиться, проверяя эту гипотезу. Работа в режиме бога 🤞🏻 Сначала я решил отделить макет mxGraph. Разбивая его с осторожными надрезами, разбивая его только на холст макета. Надрез находится в файлах EditorUI.js
и Editor.js
(и еще нескольких):
Комментирование избавило от меню, панели инструментов и боковых панелей. То, как вы включаете, инициализируете и переопределяете, имеет первостепенное значение. Моя иерархия включения выглядит так:
Обратите внимание на строки 97 и 98, вроде как получилось 😊. Дальнейшие шаги стали более понятными, все, что мне нужно было сделать, это переопределить и включить файлы после mxClient.js
, в лучшем случае они просто клонируются и/или модифицируются для дооснащения.
СОВЕТ ПРОФЕССИОНАЛА: не путайте оригинал, даже если это песня 80–90-х годов!
Сказать, что это был своего рода взлом, но правильный. Позднее были введены небольшие дополнения для Stencils и Properties с использованием VueJS x-template
синтаксического сахара. Шаблон компонента с несколькими элементами управления:
Это примерно дало мне возможность создавать динамические свойства с синтаксисом на основе шаблона, а также позволяло динамическое связывание с Python API (JSON):
Мне удалось собрать воедино всю библиотеку трафаретов (фигур), свойства динамических узлов/коннекторов с помощью Python API. Библиотека трафаретов по умолчанию и свойства объекта узла/соединителя нуждались в предварительной инициализации:
Модернизация mxGraph с помощью VueJS — второй геркулесов труд 💪🏻
Теперь, когда все навороты на месте, пришло время расстелить красную ковровую дорожку. В большинстве частей редактора mxGraph потребовались косметические изменения (пользовательские трафареты и боковая панель свойств), в результате чего:
Во вселенной ГИС непространственные атрибуты относятся к расширенным данным о географическом местоположении, точно так же настраиваемые свойства сохраняются внутри тега <CustomData>
XML (как JSON), что является одной из удобных функций mxGraph. Исходный XML-код графа будет выглядеть так:
Этот <CustomData>
также используется для привязки модели VueJS. Преобразование между объектами XML и JSON происходит с помощью кодека. Определение кодека CustomData(value)
:
Когда вы нажимаете на объект/коннектор узла, кодек анализирует его, возвращая все объекты привязки свойств для модели VueJS. Часть привязки свойств определена в файле Properties.js
как:
Собираем все вместе — третий геркулесов труд 💪🏻
В ход пошло много архитектурного мышления — это не софтбол, крученый мяч или жесткий мяч, это один камень Атласа за другим, только сильные люди могут выжить. Чтобы превратить обычную библиотеку компонентов диаграмм в полноценный проектировщик SDN PoC, пришлось пройти полуночные марафоны до последнего рубежа:
Три месяца неустанной погони, несколько управленческих искр с потерями — да, я научился смягчать это 😉. Пока клиент доволен, я могу с этим жить. В любом случае, всегда был и был о моем пути разработчика.
Рекомендации
- https://github.com/jgraph
- https://www.diagrams.net
- https://github.com/jgraph/mxgraph
- https://jgraph.github.io/mxgraph/javascript/examples/grapheditor/www/index.html
- https://jgraph.github.io/mxgraph/docs/js-api/files/index-txt.html
- https://www.greekmythology.com/Myths/Heroes/Heracles/heracles.html
Для просмотра онлайн-демонстрации обращайтесь по адресу: [email protected].