如何在Webpack项目中导入XML编码的mxGraph?

皮鲁卡

语境

在将大型AngularJS / RequireJS项目迁移到Webpack的过程中,我遍历了应用程序的不同部分并修改了依赖项,以便一切正常。好吧,除了mxGraph之外的所有东西。

问题

我无法解码XML编码的图。我将问题追溯到mxCodec.prototype.decode,它依赖于全局范围内的所有函数,使用解码XML名称window[objectName]以找到相关的函数来实例化对象。

当Webpack将mxGraph作为模块加载时,这些对象不是全局window对象,也不包含在对象中,因此解码不起作用。

此外,该应用程序严重依赖于mxGraph,并且已在不同的模块中使用,因此不能仅将其导入一个地方。

有谁知道如何使它工作?

预先感谢您的帮助。

组态

mxGraph正在通过Webpack的exports-loader导入,其配置与

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数组...但是此解决方案似乎非常人为...
  • 我也没有遵循这个模板
皮鲁卡

我可以通过遵循上述的第一次尝试使其工作,即编写我自己的“ mxWrapper”库。它是为满足如此简单的需求而设计的,但是它可以工作。

基本思路:

import { 
  mxCell, mxCellPath, mxGeometry, mxGraphModel, mxCodec as _mxCodec, ...
} from 'mx';

// Overridden in our application
var mxCodec = _mxCodec;

var KNOWN_OBJECTS = {
  mxCell: mxCell,
  mxCellPath: mxCellPath,
  mxGeometry: mxGeometry,
  mxGraphModel: mxGraphModel,
  ...
  Array: Array,
  array: Array,
}

/**
 * Function: decode
 *
 * Decodes the given XML node. The optional "into"
 * argument specifies an existing object to be
 * used. If no object is given, then a new instance
 * is created using the constructor from the codec.
 *
 * The function returns the passed in object or
 * the new instance if no object was given.
 *
 * Parameters:
 *
 * node - XML node to be decoded.
 * into - Optional object to be decodec into.
 */
mxCodec.prototype.decode = function (node, into) {
  var obj = null;

  if (node != null && node.nodeType == mxConstants.NODETYPE_ELEMENT) {
    var ctor = null;

    try {
      ctor = KNOWN_OBJECTS[node.nodeName];
    }
    catch (err) {
      // ignore
    }

    var dec = mxCodecRegistry.getCodec(ctor);

    if (dec != null) {
      obj = dec.decode(this, node, into);
    }
    else {
      obj = node.cloneNode(true);
      obj.removeAttribute('as');
    }
  }

  return obj;
};


export {
  mxCell, mxCellPath, mxGeometry, mxGraphModel, ...
};

我仍然很开放,对更好的想法感兴趣...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在项目中导入角材料?

如何在STACKBLITZ JS项目中导入真棒字体?

如何在Maven项目中导入普通枚举?

如何在scalajs项目中的“ Build.scala”中导入“ %%%”?

如何在我的Maven项目中导入FFMPEG库?

如何在vuejs项目中导入和使用luxon?

如何在Swift项目中导入LinkedIn SDK?

无法在 vue webpack 项目中导入 Ace 文档对象?

在vue-cli Webpack项目中导入Font Awesome

如何在我的Maven项目中导入所有提供的Wildfly库?

如何在Vuejs项目中导入具有相同名称的多个组件?

如何在Angular 4项目中导入waveurfer.js?

如何在Eclipse项目中导入javax.servlet API?

如何在Swift项目中导入目标C头文件

如何在Ionic / Angular项目中导入和使用GSAP?

KMM如何在当前项目中导入生成的Greeting类?

如何在Objective-C项目中导入和使用Swift Pod框架

如何在我的Angular 7项目中导入农业网格企业

如何在WPF项目中导入windows.media.capture?

如何在Vue Nuxt项目中导入整个SCSS文件夹?

如何在ES6项目中导入npm模块?

如何在打字稿项目中导入外部 javascript 库

如何在角度项目中导入PDFjs-dist以了解pdf文件的视口

如何在 angular scss 项目中导入 ngx-datatable css 样式

如何在 Flutter 项目中导入 AWS Cognito 用户池?

GraalVM:如何在单个项目中导入不同语言的库?我正在使用 IntelliJ

如何在本地文件中导入数组以在 Vue 3 TypeScript 项目中使用?

如何在webpack中导入jQuery

如何在IntelliJ中导入Gradle项目?