Melewati argumen baris perintah ke webpack.config.js

Saya memiliki webpack.config.js sederhana

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

Dan saya ingin meneruskan nilai untuk entrydan output melalui argumen baris perintah. Apakah itu mungkin dan bagaimana saya melakukannya?


person user1934212    schedule 22.05.2017    source sumber
comment
Sudahkah Anda mencoba menggunakan variabel lingkungan ?   -  person Orkun Tuzel    schedule 22.05.2017


Jawaban (6)


webpack.config.js juga dapat mengekspor fungsi env yang dapat mengembalikan objek conf. Oleh karena itu Anda dapat memiliki konfigurasi webpack seperti:

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

dan kemudian panggil webpack dari baris perintah (atau package.json) seperti ini:

webpack --env=production
person Axnyff    schedule 22.05.2017
comment
Ini tidak berfungsi dengan Webpack 1 kan? karena saya mendapat kesalahan karena file konfigurasi tidak mengembalikan objek - person Matias Fernandez Martinez; 11.09.2017
comment
@MatiasFernandezMartinez agak terlambat tapi ya mengekspor fungsi ditambahkan di webpack 3 atau 4 - person Bauhaus; 28.01.2019
comment
Tidak jelas dari jawaban Anda apakah argumen env ini ajaib atau kita dapat meneruskan parameter arbitrer, seperti --paramName1=value --paramName2=value - person Mikhail Batcer; 09.01.2020
comment
@MikhailBatcer Pertanyaan bagus. Tampaknya harus --env(.XXX). Lihat variabel lingkungan. Terima kasih kepada Orkun Tuzel - person Mojtaba; 02.10.2020

Anda dapat memberikan parameter khusus pada variabel env dari baris perintah, jadi untuk contoh ini Anda dapat memanggil:

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

dan menggunakannya di webpack Anda dengan melakukan

module.exports = env => ({
  entry: env.entry,
  output: {
    filename: env.output
  },
});
person adrian    schedule 26.11.2019
comment
Tidak jelas dari jawaban Anda apakah argumen env ini ajaib atau kita dapat meneruskan parameter arbitrer, seperti --paramName1=value --paramName2=value - person Mikhail Batcer; 09.01.2020
comment
Ini tidak berfungsi dengan Webpack 5+ - person Markus Knappen Johansson; 02.06.2021

Anda juga dapat meneruskan beberapa pasangan nilai kunci ke konfigurasi Anda menggunakan --env=key=value:

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

atau (untuk pengembangan dengan webpack-dev-server):

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

webpack.config.js akan terlihat seperti ini:

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),
    },
  }
}

Semua nilai yang diteruskan dengan cara ini tersedia sebagai objek di konfigurasi yang membuatnya mudah untuk digunakan.

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

Anda dapat menggunakan paket argv dan mengatur variabelnya. Anda harus melakukannya sebelum module.export.

person PRAISER    schedule 22.05.2017
comment
Terima kasih, saya pasti akan mencobanya. Namun adakah cara yang lebih mudah, tanpa memerlukan referensi paket tambahan? Bagaimanapun, webpack.config.js hanyalah kode javascript. - person user1934212; 22.05.2017
comment
Anda dapat meneruskan --env=test misalnya melalui baris perintah dan kemudian Anda dapat mengekspor fungsi env yang mengembalikan objek secara langsung webpack.js.org/configuration/configuration-types/ - person Axnyff; 22.05.2017
comment
Anda dapat membaca ini kemudian: justindavis .co/2014/11/24/ - person PRAISER; 22.05.2017
comment
Terima kasih @Axnyff: trik env sepertinya berhasil untuk saya. Jika Anda mempromosikannya ke jawaban yang lengkap, saya dapat menerimanya. - person user1934212; 22.05.2017
comment
Aku baru saja melakukannya, apakah ini masih baik untukmu? - person Axnyff; 22.05.2017
comment
@PRAISER Bisakah Anda menjelaskan lebih lanjut tentang ini - person Mikhail Batcer; 09.01.2020

Anda dapat menggunakan argumen --env CLI untuk meneruskan parameter arbitrer ke konfigurasi.

Misalnya perintah berikut:

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

Akan menghasilkan objek env berikut:

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

Yang kemudian dapat Anda gunakan dalam konfigurasi Anda seperti:

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

Baca selengkapnya di sini: Webpack - Variabel Lingkungan

person Yoav Kadosh    schedule 14.03.2021
comment
Jawaban lain di thread ini memiliki sintaks yang salah dan gagal menjelaskan bagaimana hal itu dapat digunakan untuk parameter sewenang-wenang. Jawaban saya mencakup keduanya. - person Yoav Kadosh; 14.03.2021
comment
@ user1934212 jawaban ini sangat jelas dan mendukung banyak variabel, saya akan menandainya sebagai benar. - person Peter Hayman; 16.06.2021

Menurut pendapat saya, cara termudah untuk menyampaikan argumen adalah dengan menggunakan Node.js. Webpack yang menerima argumen, Anda dapat menyimpan argumen baris perintah dalam variabel lingkungan khusus (yang hanya ada dalam sesi):

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

export default {
...

Kemudian di main.js (di mana pun Anda ingin menguraikannya), Anda mengambil argumen baris perintah dari variabel lingkungan khusus Anda.

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

Saat Anda akan mengambil semua argumen yang Anda teruskan ke Webpack, dengan menggunakan ini, Anda akan dapat menggunakan modul node apa pun (seperti yargs misalnya) tanpa kesulitan untuk menguraikannya (atau tentu saja melakukannya secara manual).

Jadi, Anda dapat melakukan hal seperti ini tanpa masalah apa pun:

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

dll.

person Patrice Thimothee    schedule 12.12.2020