Глобальные переменные Webpack / process.env - PullRequest
0 голосов
/ 21 марта 2020

У меня есть сервер Webpack, который принимает параметры, компилирует код и возвращает его в виде строки (не только локальный инструмент или инструмент сборки конвейера, но и реальный производственный сервис). Мне нужны стати c опции / флаги функций, чтобы решить, какой код оставить и какую функцию использовать.

Насколько я знаю, у меня есть 2 варианта: DefinePlugin и EnvironmentPlugin.

Но Ввод / вывод Webpack является асинхронным, как и мои журналы обработки запросов c.

Есть ли вероятность, что если процесс асинхронный, 1. наборы запросов «глобальные параметры», начинается компиляция, 2. приходит запрос и устанавливает его «глобальные параметры», и 1. компиляция запроса продолжается, и использует 2. параметры запроса ?

или определяются как глобальные / Переменные process.env относятся только к указанной компиляции c? Оба плагина?

// inside Webpack config

// option 1
new webpack.DefinePlugin({
  OPTION1: JSON.stringify(option1),
  OPTION2: JSON.stringify(option2),
});

// option 2
process.env.OPTION1 = option1;
process.env.OPTION2 = option2;
new webpack.EnvironmentPlugin(['OPTION1', 'OPTION2']);


// Webpack programmatic API
const compiler = webpack(config);
compiler.run(...);


// in code
// if OPTION1 is falsey, this block
// isn't added to final bundle
if (OPTION1) {
  // dynamic import/require fancy feature X
}

Ответы [ 2 ]

1 голос
/ 21 марта 2020

process.env распространяется на весь процесс, поэтому в зависимости от того, как реализован EnvironmentPlugin, он либо считывает переменные среды только один раз (при запуске) или всякий раз, когда вызывается (что вызывает проблему, о которой вы беспокоитесь). Так что EnvironmentPlugin не является хорошим выбором здесь.

Однако, с DefinePlugin вся конфигурация, кажется, содержится в плагине, поэтому она должна быть безопасной. Просто убедитесь, что для каждого запроса создан новый объект компилятора.

0 голосов
/ 21 марта 2020

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

Сначала сделайте конфигурацию webpack функцией, принимающей аргументы:

module.exports = ({param1, param2, param3}) => {
  return {
    mode: 'production',
    context: path.resolve(__dirname),
    entry: `${param1}.js`,
    output: {path: param2, filename: `${param3}.js`},
    module: {
        rules: [
        ]
    },
    plugins: [

    ]
  };
};

И, во-вторых, когда вы вызываете compiler.run просто передать эти аргументы в конфигурацию webpack:

let webpackConfig = require('./webpack-config-file.js')({
  param1: "argument-for-webpack-config",
  param2: "argument-for-webpack-config",
  param3: "argument-for-webpack-config"
});

const compiler = webpack(webpackConfig);
  compiler.run((err, stats) => {
    if (err || stats.hasErrors()) {
      // show errors
    }
      // do something
 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...