介绍
命令行参数是一种为命令提供额外输入的方法。您可以使用命令行参数为 Node.js 脚本增加灵活性和自定义。
在本文中,您将了解参数向量、检测参数标志、处理多个参数和值以及使用commander
包。
先决条件
要完成本教程,您需要:
- Node.js 的本地开发环境。遵循如何安装 Node.js 并创建本地开发环境。
本教程已通过 Node v16.10.0、npm
v7.12.2 和commander
v7.2.0 验证。
使用参数向量
Node.js 支持传递参数的列表,称为参数向量。参数向量是process.argv
Node.js 脚本中可用的数组。
该数组包含传递给脚本的所有内容,包括 Node.js 可执行文件以及脚本的路径和文件名。
如果您要运行以下命令:
- node example.js -a -b -c
您的参数向量将包含五个项目:
[
'/usr/bin/node',
'/path/to/example.js',
'-a',
'-b',
'-c'
]
至少,不带任何参数运行的脚本仍将包含数组中的两个项目,node
可执行文件和正在运行的脚本文件。
通常,参数向量与参数计数( argc
)配对,它告诉您传入了多少个参数。 Node.js 缺少这个特定变量,但我们总是可以获取length
参数向量数组的 :
if (process.argv.length === 2) {
console.error('Expected at least one argument!');
process.exit(1);
}
这个例子的代码将检查length
的argv
。长度2
表示仅存在node
可执行文件和脚本文件。如果没有参数,它将打印出消息:Expected at least one argument!
和exit
。
使用参数标志
让我们考虑一个显示默认消息的示例。但是,当存在特定标志时,它将显示不同的消息。
if (process.argv[2] && process.argv[2] === '-f') {
console.log('Flag is present.');
} else {
console.log('Flag is not present.');
}
此脚本检查我们的参数向量中是否有第三项。索引是2
因为 JavaScript 中的数组是零索引的。如果存在第三个项目并且等于-f
它会改变输出。
以下是不带参数运行脚本的示例:
- node example.js
以及生成的输出:
OutputFlag is not present.
以下是使用参数运行脚本的示例:
- node example.js -f
以及生成的输出:
OutputFlag is present.
我们不必限制自己修改条件控制结构,我们也可以使用传递给脚本的实际值:
const custom = (process.argv[2] || 'Default');
console.log('Custom: ', custom);
此脚本不是基于参数的条件,而是采用传入的值("Default"
在缺少参数时默认为)并将其注入脚本输出。
对值使用多个参数
我们已经编写了一个接受参数和一个接受原始值的脚本,那么在我们想要将值与参数结合使用的情况下呢?
为了让事情更复杂一点,让我们也接受多个参数:
// Check to see if the -f argument is present
const flag = (
process.argv.indexOf('-f') > -1 ? 'Flag is present.' : 'Flag is not present.'
);
// Checks for --custom and if it has a value
const customIndex = process.argv.indexOf('--custom');
let customValue;
if (customIndex > -1) {
// Retrieve the value after --custom
customValue = process.argv[customIndex + 1];
}
const custom = (customValue || 'Default');
console.log('Flag:', `${flag}`);
console.log('Custom:', `${custom}`);
通过使用indexOf
而不是依赖特定的索引值,我们可以在参数向量中的任何位置查找参数,而不管顺序如何!
以下是不带参数运行脚本的示例:
node example.js
以及生成的输出:
OutputFlag: Flag is not present.
Custom: Default
以下是使用参数运行脚本的示例:
- node example.js -f --custom Override
以及生成的输出:
OutputFlag: Flag is present.
Custom: Override
现在,您的命令行脚本可以接受多个参数和值。
使用 commander
当参数输入非常具体时,上述示例有效。但是,用户可能会尝试使用带和不带等号 (-nJaneDoe
或--name=JohnDoe
) 的参数、带引号的字符串来传递带空格 ( -n "Jane Doe"
) 的值,甚至使用别名来提供简写和简写版本的参数。
这就是commander
图书馆可以提供帮助的地方。
commander
是一个流行的 Node.js 库,其灵感来自同名的 Ruby 库。
首先,在您的项目目录中,初始化您的项目:
- npm init
然后,安装commander
:
- npm install commander@7.2.0
让我们以前面的例子为例,将它移植到使用中commander
:
const commander = require('commander');
commander
.version('1.0.0', '-v, --version')
.usage('[OPTIONS]...')
.option('-f, --flag', 'Detects if the flag is present.')
.option('-c, --custom <value>', 'Overwriting value.', 'Default')
.parse(process.argv);
const options = commander.opts();
const flag = (options.flag ? 'Flag is present.' : 'Flag is not present.');
console.log('Flag:', `${flag}`);
console.log('Custom:', `${options.custom}`);
commander
通过处理process.argv
和添加参数和任何相关值作为我们commander
对象中的属性来完成所有艰苦的工作。
我们可以轻松地对脚本进行版本控制并使用-v
或报告版本号--version
。我们还得到了一些友好的输出,通过传递--help
参数来解释脚本的用法,如果您碰巧传递了一个未定义的参数或缺少传递的值,它将抛出错误。
结论
在本文中,您了解了参数向量、检测参数标志、处理多个参数和值以及使用commander
包。
虽然您可以使用自己的命令行参数快速创建脚本,但您可能需要考虑使用commander
或者Inquirer.js
是否需要更高的健壮性和可维护性。