Передача аргументов командной строки в webpack.config.js

У меня есть простой webpack.config.js

module.exports = {
  entry: "./app.js",
  output: {
    filename: "bundle.js"
  },
}

И я хочу передать значения для entryи output через аргументы командной строки. Возможно ли это и как мне это сделать?


person user1934212    schedule 22.05.2017    source источник
comment
Пробовали ли вы использовать переменные среды?   -  person Orkun Tuzel    schedule 22.05.2017


Ответы (6)


webpack.config.js также может экспортировать функцию env, которая может возвращать объект conf. Поэтому вы можете иметь конфигурацию веб-пакета, например:

module.exports = env => {
    return {
        entry: env === "production" ? "./app.js": "app-dev.js",
        output: {
          filename: "bundle.js"
        },
    }
};

а затем вызовите webpack из командной строки (или package.json) следующим образом:

webpack --env=production
person Axnyff    schedule 22.05.2017
comment
Это не работает с Webpack 1, верно? потому что он выдает мне ошибки, что файл конфигурации не возвращает объект - person Matias Fernandez Martinez; 11.09.2017
comment
@MatiasFernandezMartinez немного опоздал, но да, экспорт функции был добавлен либо в веб-пакет 3, либо в 4. - person Bauhaus; 28.01.2019
comment
Из вашего ответа неясно, является ли этот аргумент env волшебным или мы можем передавать произвольные параметры, например --paramName1=value --paramName2=value - person Mikhail Batcer; 09.01.2020
comment
@MikhailBatcer Хороший вопрос. Кажется, это должно быть --env(.XXX). См. переменные среды. Благодаря Оркун Тузел - person Mojtaba; 02.10.2020

Вы можете указать пользовательские параметры для переменной env из командной строки, поэтому для этого примера вы можете вызвать:

webpack --env.entry='./app.js' --env.output='bundle.js'

и используйте их в своем веб-пакете, выполнив

module.exports = env => ({
  entry: env.entry,
  output: {
    filename: env.output
  },
});
person adrian    schedule 26.11.2019
comment
Из вашего ответа неясно, является ли этот аргумент env волшебным или мы можем передавать произвольные параметры, например --paramName1=value --paramName2=value - person Mikhail Batcer; 09.01.2020
comment
Это не работало с Webpack 5+ - person Markus Knappen Johansson; 02.06.2021

Вы также можете передать несколько пар ключ-значение в свою конфигурацию, используя --env=key=value:

webpack --env=mode=production --env=branch=develop

или (для разработки с помощью webpack-dev-server):

webpack serve --env=mode=production --env=branch=develop

webpack.config.js будет выглядеть так:

module.exports = (env) => {
  const mode = env.mode === 'prod' ? 'dev';
  const branch = env.branch ? env.branch : 'develop';

  return {
    entry: mode === 'prod' ? './app.js': 'app-dev.js',
    output: {
      filename: 'bundle.js',
      path: 'dist/' + branch),
    },
  }
}

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

{ 
  WEBPACK_BUNDLE: true,
  mode: 'production',
  branch: 'feature-x',
  foo: 'bar'
}
person Pateta    schedule 03.02.2021

Вы можете использовать пакет argv и установить переменные. Вы должны сделать это до module.export.

person PRAISER    schedule 22.05.2017
comment
Спасибо, обязательно попробую. Но нет ли более простого способа без дополнительной ссылки на пакет? В конце концов, webpack.config.js — это просто код javascript. - person user1934212; 22.05.2017
comment
Вы можете передать --env=test, например, через командную строку, а затем вы можете экспортировать функцию env, которая возвращает вместо прямого объекта webpack.js.org/configuration/configuration-types/ - person Axnyff; 22.05.2017
comment
Тогда вы можете прочитать это: justindavis .co/2014/11/24/ - person PRAISER; 22.05.2017
comment
Спасибо @Axnyff: мне кажется, что трюк с env работает. Если вы продвигаете его до полного ответа, я могу его принять. - person user1934212; 22.05.2017
comment
Я только что сделал, это все еще нормально для вас? - person Axnyff; 22.05.2017
comment
@PRAISER Не могли бы вы рассказать об этом подробнее? - person Mikhail Batcer; 09.01.2020

Вы можете использовать аргумент CLI --env для передачи произвольных параметров в конфигурацию.

Например, следующая команда:

webpack --env entry=./entry.js --env output=./output.js

Создаст следующий объект env:

{entry: './entry.js', output: './output.js'}

Который вы затем можете использовать в своей конфигурации следующим образом:

module.exports = env => ({
  entry: env.entry,
  output: {
    filename: env.output
  },
});

Подробнее читайте здесь: Webpack — переменные среды

person Yoav Kadosh    schedule 14.03.2021
comment
Другие ответы в этой теме имеют неправильный синтаксис и не объясняют, как его можно использовать для произвольных параметров. Мой ответ охватывает оба. - person Yoav Kadosh; 14.03.2021
comment
@user1934212 user1934212 этот ответ очень ясен и поддерживает несколько переменных, я бы отметил его как правильный. - person Peter Hayman; 16.06.2021

На мой взгляд, самый простой способ передачи аргументов — использовать Node. Поскольку Webpack получает аргументы, вы можете сохранить аргументы командной строки в специальной переменной среды (которая существует только в рамках сеанса):

// webpack.config.js 
process.env.MY_APPLICATION_NAME_ARGS = JSON.stringify(process.argv)

export default {
...

Затем в main.js (в любом месте, где вы хотите их проанализировать) вы извлекаете аргументы командной строки из выделенной переменной среды.

// main.js
const myArgs = JSON.parse(env.MY_APPLICATION_NAME_ARGS )

Поскольку вы будете получать все аргументы, которые вы передали Webpack, используя это, вы сможете безболезненно использовать любые модули узла (например, yargs) для их анализа (или, конечно, делать это вручную).

Таким образом, вы сможете делать такие вещи без каких-либо проблем:

webpack ... --opt1 the_value --custom1 something
yarn run dev --opt1 the_value --custom1 something

и т. д.

person Patrice Thimothee    schedule 12.12.2020