Laravel Mix 和 Monaco 编辑器

Laravel Mix and Monaco Editor

首先说我对Webpack不是很精通,所以,这可能是一个微不足道的问题。

我正在尝试通过 monaco-editor-webpack-plugin 在 Laravel 项目中使用 Monaco。由于插件需要修改 webpack.config.js 并且 Laravel 使用 webpack.mix.js,通过摆弄我设法想出了以下配置:

/* eslint-disable import/no-extraneous-dependencies */

const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');

const mix = require('laravel-mix');

/*
 |--------------------------------------------------------------------------
 | Mix Asset Management
 |--------------------------------------------------------------------------
 |
 | Mix provides a clean, fluent API for defining some Webpack build steps
 | for your Laravel applications. By default, we are compiling the CSS
 | file for the application as well as bundling up all the JS files.
 |
 */

mix.js('resources/js/app.js', 'public/js')
    .sass('resources/scss/app.scss', 'public/css')
    .webpackConfig({
        plugins: [
            new MonacoWebpackPlugin({
                languages: ['css', 'html', 'javascript', 'json', 'scss', 'typescript'],
            }),
        ],
    });

现在,一切正常,文件得到编译,编辑器按预期工作。我遇到的问题是编辑器编译的文件正在 /public 目录中生成。例如:/public/editor.worker.js/public/0.js

我真的很想避免这种情况,而是在 /public/js/vendor/monaco 中编译这些文件。我试图将 output 配置更改为 /public/js/vendor/monaco 但它会将所有内容(css、字体等)编译到该目录中。

有没有办法说“嘿,我想要那些 Monaco 文件,而其他一切保持原样?”。

有一个 built-in laravel-mix 函数 copy 可以提供帮助。您可以做的是,保留输出原样,并在处理后将该输出文件复制到所需的目录中。以下是您可以如何做到这一点。

mix.js('resources/js/app.js', 'public/js')
    .sass('resources/scss/app.scss', 'public/css')
    .webpackConfig({
        plugins: [
            new MonacoWebpackPlugin({
                languages: ['css', 'html', 'javascript', 'json', 'scss', 'typescript'],
            }),
        ],
    })
    .copy('SOURCE_PATH', 'DESTINATION_PATH');

使用链式 copy 函数调用定义要复制的所有文件。或者,还有另一种 laravel-mix 方法 copyDirectory(fromDir, toDir) 来复制整个目录。

对于更高级的用法,您可以根据给定的混合 Promise 分辨率手动对资产执行 post-processing,

mix.then(function () {
  //Perform post-processing on generated assets
}) //Will be triggered each time Webpack finishes building.

在这里,您可以使用 fs module

自由处理 copy/delete/rename 资产

或者,供应商提取可能会有所帮助。您可以通过在数组中传递库名称,使用 extract()Monaco 编辑器获取到 vendor.js 文件。它会将 vendor.js 文件输出到 public 目录中,然后在 copy() 函数之后可能会帮助您复制该文件。