การส่งผ่านอาร์กิวเมนต์บรรทัดคำสั่งไปยัง 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 ได้ คุณสามารถมีการกำหนดค่า webpack ได้เช่น:

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 ช้าไปหน่อย แต่ใช่ว่าการส่งออกฟังก์ชั่นได้ถูกเพิ่มเข้าไปใน webpack 3 หรือ 4 - person Bauhaus; 28.01.2019
comment
คำตอบของคุณไม่ชัดเจนนักว่าอาร์กิวเมนต์ env นี้มหัศจรรย์หรือเราสามารถส่งผ่านพารามิเตอร์ที่กำหนดเองได้ เช่น --paramName1=value --paramName2=value - person Mikhail Batcer; 09.01.2020
comment
@MikhailBatcer เป็นคำถามที่ดี ดูเหมือนว่าจะต้องเป็น --env(.XXX) ดูตัวแปรสภาพแวดล้อม ขอขอบคุณ: Orkun Tuzel - person Mojtaba; 02.10.2020

คุณสามารถระบุพารามิเตอร์ที่กำหนดเองบนตัวแปร env ได้จากบรรทัดคำสั่ง ดังนั้นสำหรับตัวอย่างนี้ คุณสามารถเรียก:

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

และใช้ใน webpack ของคุณโดยทำ

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 เป็นเพียงโค้ดจาวาสคริปต์ - person user1934212; 22.05.2017
comment
คุณสามารถส่ง --env=test สำหรับอินสแตนซ์ผ่านบรรทัดคำสั่ง จากนั้นคุณสามารถส่งออกฟังก์ชันของ env ซึ่งส่งคืน an แทนที่จะเป็นวัตถุโดยตรง 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-trick ดูเหมือนว่าจะได้ผลสำหรับฉัน หากคุณเลื่อนระดับให้เป็นคำตอบที่สมบูรณ์ฉันก็ยอมรับได้ - person user1934212; 22.05.2017
comment
ฉันเพิ่งทำไป มันยังโอเคสำหรับคุณหรือเปล่า? - person Axnyff; 22.05.2017
comment
@PRAISER คุณช่วยอธิบายรายละเอียดเกี่ยวกับเรื่องนี้หน่อยได้ไหม - person Mikhail Batcer; 09.01.2020

คุณสามารถใช้อาร์กิวเมนต์ --env CLI เพื่อส่งพารามิเตอร์ที่กำหนดเองไปยังการกำหนดค่าได้

ตัวอย่างเช่น คำสั่งต่อไปนี้:

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 คำตอบนี้ชัดเจนมากและรองรับตัวแปรหลายตัว ฉันจะทำเครื่องหมายว่าถูกต้อง - 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