【发布时间】:2017-10-22 03:22:19
【问题描述】:
我有一个简单的 webpack.config.js
module.exports = {
entry: "./app.js",
output: {
filename: "bundle.js"
},
}
我想通过命令行参数传递entry和output的值。这可能吗?我该怎么做?
【问题讨论】:
标签: javascript webpack
我有一个简单的 webpack.config.js
module.exports = {
entry: "./app.js",
output: {
filename: "bundle.js"
},
}
我想通过命令行参数传递entry和output的值。这可能吗?我该怎么做?
【问题讨论】:
标签: javascript webpack
webpack.config.js 还可以导出一个 env 的函数,该函数可以返回一个 conf 对象。因此,您可以有一个 webpack 配置,例如:
module.exports = env => {
return {
entry: env === "production" ? "./app.js": "app-dev.js",
output: {
filename: "bundle.js"
},
}
};
然后像这样从命令行(或 package.json)调用 webpack:
webpack --env=production
【讨论】:
env 参数是否神奇或者我们可以传递任意参数,例如--paramName1=value --paramName2=value
您可以通过在命令行上传递环境变量来提供自定义参数。 Webpack 版本 4 和 5 之间的语法发生了变化。对于此示例,您将调用:
对于Webpack 5:
webpack --env entry='./app.js' --env output='bundle.js'
对于Webpack 4:
webpack --env.entry='./app.js' --env.output='bundle.js'
对于这两个版本,您可以通过以下方式访问 Webpack 配置中的环境变量
module.exports = env => ({
entry: env.entry,
output: {
filename: env.output
},
});
【讨论】:
env 参数是否神奇或者我们可以传递任意参数,例如--paramName1=value --paramName2=value
您还可以使用--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'
}
【讨论】:
您可以使用--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 - Environment Variables
【讨论】:
您可以使用argv 包并设置变量。必须在module.export 之前完成。
【讨论】:
在我看来,传递参数最简单的方法是使用 Node.js。 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
等等
【讨论】: