Требование объекта из другого файла в настоящее время удаляет значения ключа Regex - PullRequest
0 голосов
/ 25 сентября 2019

В настоящее время я выполняю итерацию по нескольким различным каталогам, требуя объекты конфигурации Webpack из этих различных каталогов и запускаю дочерний процесс в узле, который запускает компилятор Webpack с этим данным объектом конфигурации.

Когда я используюrequire (webpackConfigPath), он удаляет значения регулярного выражения для module: { rules : [ { test: /\.js$/, ...} ]} и заменяет их пустым объектом, выводя что-то похожее на это: module: { rules : [ { test: {}, ...} ]}

Может кто-нибудь дать мне указание о том, как глубококлонировать переменную из другого файла, не удаляя значения ключей RegExp и заменяя их пустыми объектами?

Пример использования:

const webpackConfigDir = path.resolve( __dirname, themeDir + '/webpack.config.js' )
let config = require( webpackConfigDir );

1 Ответ

0 голосов
/ 25 сентября 2019

В итоге я решил эту проблему, потребовав вместо этого функцию конструктора для конфигурации веб-пакета.

Пример:

webpack.config.js

const path = require("path");

const entryPath = path.resolve( __dirname, 'source/scripts/app.js' );
const outputPath = path.resolve( __dirname, 'dist/js' )

const constructConfig = function ( entryPath, outputPath )  {
    const config = {
        entry: ["@babel/polyfill", entryPath],
        output: {
            path: outputPath,
            filename: "scripts.js"
        },
        module: {
            rules: [
                {
                    test: /\.js$/,
                    use: "babel-loader",
                    exclude: /node_modules/
                }
            ]
        },
        plugins: [],
        devtool: 'source-map',
        externals: {
            jquery: 'jQuery'
        }
    }
    return config
}

module.exports = {
    constructor: constructConfig,
    entry: entryPath,
    output: outputPath
}

Затем я преобразовал конструкторфункции в строку, так как дочерние процессы узла не позволяют передавать функции, только объекты, насколько я могу сказать.

scripts.js:

    let configConstructor = require( webpackConfigDir ).constructor
    let entry = require( webpackConfigDir ).entry
    let output = require( webpackConfigDir ).output

    let processOptions = {
        constructor: configConstructor.toString(),
        entry: entry,
        output: output
    }

    process.send( processOptions )

В пределахЗапустив дочерний процесс, я преобразовал строку обратно в функцию, которая вызывается после возврата.

build.js:

const webpack = require("webpack");
const chalk = require('chalk');

async function build(config) {
    await webpack( config, (err, stats) => {
        if ( stats.hasErrors() ) {
            const errors = stats.toJson().errors

            errors.forEach( (error, i) => {
                console.log( chalk.white.bgRed.bold(`Error #${i + 1}: `) + chalk.white.bgRed(`${error}`) )
            })
        }
    })
}

process.on("message", async options => {
    const constructor = new Function( 'return ' + options.constructor )();
    const config = await constructor( options.entry, options.output )
    await build(config);
});

Это решение сработало для рассматриваемой проблемы, подумал, чтоподелиться в случае, если кто-нибудь сталкивается с подобной проблемой.В этом случае я пытался поделиться зависимостями проекта, но разрешил другую конфигурацию веб-пакета для каждого каталога.

...