Контекст
В рамках переноса большого проекта AngularJS / RequireJS в Webpack я рассмотрел различные части приложения и адаптировал зависимости, чтобы все работало.Ну, все, кроме mxGraph.
Проблема
Я не могу декодировать XML-кодированные графики.Я проследил проблему до mxCodec.prototype.decode
, которая полагается на все функции, находящиеся в глобальной области, декодируя имена XML с помощью window[objectName]
, чтобы найти соответствующую функцию для создания экземпляров объектов.
Когда mxGraph загружается какВ модуле Webpack объекты не являются глобальными и не включены в объект window
, следовательно, декодирование не работает.
Кроме того, приложение в значительной степени зависит от mxGraph и используется в различных модулях, поэтомуне может быть импортирован только в одном месте.
Кто-нибудь знает, как заставить это работать?
Заранее спасибо за вашу помощь.
Конфигурация
mxGraph импортируется с помощью загрузчика экспорта в Webpack, конфигурация которого выглядит примерно так:
rules: {
test: path.resolve(__dirname, 'node_modules/mxgraph/javascript/mxClient.min.js'),
use: [
'exports-loader?' + [
// handler
'mxHandle', 'mxVertexHandler', 'mxEdgeSegmentHandler',
// io
'mxCodec', 'mxCodecRegistry',
// layout
'mxHierarchicalLayout', 'mxSwimlaneLayout',
'mxCircleLayout', 'mxCompactTreeLayout', 'mxCompositeLayout', 'mxFastOrganicLayout', 'mxGraphLayout',
'mxLayoutManager', 'mxParallelEdgeLayout', 'mxPartitionLayout', 'mxRadialTreeLayout', 'mxStackLayout',
// model
'mxCell', 'mxCellPath', 'mxGeometry', 'mxGraphModel',
'mxClient',
// shapes
'mxActor', 'mxArrow', 'mxArrowConnector', 'mxCloud', 'mxConnector', 'mxCylinder', 'mxDoubleEllipse', 'mxEllipse', 'mxHexagon', 'mxLabel', 'mxLine',
'mxMarker', 'mxPolyline', 'mxRectangleShape', 'mxRhombus', 'mxRubberband', 'mxStencil', 'mxStencilRegistry', 'mxSwimlane', 'mxText', 'mxTriangle',
// util
'mxConstants', 'mxEvent', 'mxUndoManager', 'mxUtils', 'mxDivResizer', 'mxImage', 'mxPoint', 'mxRectangle', 'mxLog',
// view
'mxGraph', 'mxEdgeStyle', 'mxCellRenderer', 'mxCellOverlay', 'mxCellState',
].join(','),
]
}
, это уродливо, но позволяет приложению красиво импортировать mxGraph с синтаксисом, аналогичным import { mxArrow } from 'mx'
.
Попытки
- Я пытался решить эту проблему, оборачивая mxGraph в пользовательскую библиотеку "mxWrapper", которая переопределяет функцию
mxCodec.prototype.decode
п, но это вызывает проблемы дальше по линии с ребрами, которые имеют контрольные точки.Возможно, мое переопределение не обрабатывает массивы mxPoint правильно ... но это решение кажется очень надуманным ... - Я также следовал этому шаблону безрезультатно