繁体   English   中英

使用 Laravel Mix 导入和使用节点模块的正确方法

[英]Proper way to import and use node modules with Laravel Mix

我刚开始在项目中使用 Laravel (v 8.x) Mix,发现从节点模块实现 Javascript 令人沮丧。

首先,我的webpack.mix.js中有这个:

mix.js('node_modules/mxgraph/javascript/mxClient.min.js', 'public/js');
mix.js('resources/js/*.js', 'public/js').postCss('resources/css/app.css', 'public/css', [
    require('postcss-import'),
    require('tailwindcss'),
    require('autoprefixer'),
]).version();

接下来,我的app.js包含以下内容:

import Canvas from './canvas';

require('mxgraph');

const canvas = new Canvas();

...进口canvas.js

export default class Canvas {
    constructor() {
        this.container = document.getElementById('graphContainer');
        if (!mxClient.isBrowserSupported())
        {
            // Displays an error message if the browser is not supported.
            alert('Browser is not supported!');
        }
.
.
.
    }
}

...在我的 Blade 布局的脚本部分:

<script src="{{ mix('js/mxClient.min.js') }}" defer></script>
<script src="{{ mix('js/app.js') }}" defer></script>

当我加载页面时,我在控制台中收到以下错误:

Uncaught ReferenceError: mxClient is not defined
    at new Canvas (app.js:3866)
    at Module../resources/js/app.js (app.js:3813)
    at __webpack_require__ (app.js:114081)
    at app.js:114143
    at app.js:114149

var mxClient肯定存在于mxClient.min.js中,并且在Canvas中对它的引用发生在它加载之后。

我尝试了很多变体,但似乎没有任何效果。 任何指导将不胜感激。

所以,在玩了之后,我发现了你可以做什么。

组装一个文件

mxClient.min.jsapp.js放入一个文件中

mix.js(
    [
        "resources/js/app.js",
        "node_modules/mxgraph/javascript/mxClient.min.js",
    ],
    "public/js"
).postCss('resources/css/app.css', 'public/css', [
    require('postcss-import'),
    require('tailwindcss'),
    require('autoprefixer'),
]).version();

导入mxGraph和 Canvas

在你的app.js你可以把它

import "./canvas";

require("mxgraph");

const canvas = new Canvas();

npm run dev运行没有问题。

更新

我找到了一个(也许更容易)的选择。 不要在您的webpack.mix.js mxClient只需要您的app.js

// app.js

window.mxClient = new require("mxgraph")().mxClient;

let isBrowserSupported = mxClient.isBrowserSupported();

console.log(isBrowserSupported);

经过更多的探索和搜索,我找到了一种有效的方法。 这是基于我在这里找到的:

https://www.programmersought.com/article/85491421858/

我的实现似乎有点笨拙,但它确实有效,我现在可以继续我正在尝试使用 mxGraph 开发的项目。

因此,我不再在mxgraph中显式webpack.mix.js ,因此它现在恢复为 Laravel 默认值:

mix.js('resources/js/*.js', 'public/js').postCss('resources/css/app.css', 'public/css', [
    require('postcss-import'),
    require('tailwindcss'),
    require('autoprefixer'),
]).version();

我还删除了require('mxgraph'); 来自app.js ,所以它看起来像这样:

import Canvas from './canvas';

const canvas = new Canvas();

我的canvas.js现在看起来像这样:

import mx from 'mxgraph';

const mxgraph = mx({
    mxImageBasePath: './src/images',
    mxBasePath: './src'
});

window.mxGraph = mxgraph.mxGraph;
window.mxGraphModel = mxgraph.mxGraphModel;
window.mxEvent = mxgraph.mxEvent;
window.mxEditor = mxgraph.mxEditor;
window.mxGeometry = mxgraph.mxGeometry;
window.mxRubberband = mxgraph.mxRubberband;
window.mxDefaultKeyHandler = mxgraph.mxDefaultKeyHandler;
window.mxDefaultPopupMenu = mxgraph.mxDefaultPopupMenu;
window.mxStylesheet = mxgraph.mxStylesheet;
window.mxDefaultToolbar = mxgraph.mxDefaultToolbar;

const {mxGraph, mxClient, mxEvent, mxCodec, mxUtils, mxConstants, mxPerimeter, mxRubberband} = mxgraph;

export default class Canvas {
    constructor() {
        let container = document.getElementById('graphContainer');
        if (typeof(mxClient) !== 'undefined') {
            this.draw(container);
        }
    }

    draw (container) {
        if (! mxClient.isBrowserSupported())
        {
            // Displays an error message if the browser is not supported.
            mxUtils.error('Browser is not supported!', 200, false);
        }
        else
        {
            // Disables the built-in context menu
            mxEvent.disableContextMenu(container);

            // Creates the graph inside the given container
            var graph = new mxGraph(container);

            // Enables rubberband selection
            new mxRubberband(graph);

            // Gets the default parent for inserting new cells. This
            // is normally the first child of the root (ie. layer 0).
            var parent = graph.getDefaultParent();

            // Adds cells to the model in a single step
            graph.getModel().beginUpdate();
            try
            {
                var v1 = graph.insertVertex(parent, null, 'Hello,', 20, 20, 80, 30);
                var v2 = graph.insertVertex(parent, null, 'World!', 200, 150, 80, 30);
                var e1 = graph.insertEdge(parent, null, '', v1, v2);
              
            }
            finally
            {
                // Updates the display
                graph.getModel().endUpdate();
            }
        }
    }
}

draw()方法中的大部分代码取自 mxGraph “Hello World”演示( https://jgraph.github.io/mxgraph/docs/manual.ZFC35FDC70D5FC69D7A69883A822C

非常感谢@codedge 为您花时间帮助我!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM