方式一:process.argv
在编写 npm 包时,可以使用 Node.js 中的 process 对象来解析 CLI 入参。
process 对象包含了当前 Node.js 进程的相关信息,其中 argv
属性存储了从命令行传入的参数。argv 是一个数组,其中第一个元素是 Node.js 的执行路径,第二个元素是当前执行的 JavaScript 文件路径,从第三个元素开始则是传入的命令行参数。
以下是一个简单的示例,演示如何使用 process.argv
解析 CLI 入参:
//node myScript.js arg1 arg2 arg3
//node myScript.js --name=value
//node myScript.js -f
console.log(process.argv);
// 输出:[ 'node', '/path/to/myScript.js', 'arg1', 'arg2', 'arg3' ]
// 获取命令行参数
const args = process.argv.slice(2); // 去掉前两个元素(执行路径和脚本路径)
console.log(args); // 输出:['arg1', 'arg2', 'arg3']
// 解析参数
const options = {};
args.forEach(arg => {
if (arg.startsWith('--')) {
// 形如 --name=value
const [name, value] = arg.slice(2).split('=');
options[name] = value || true;
} else if (arg.startsWith('-')) {
// 形如 -f
const name = arg.slice(1);
options[name] = true;
} else {
// 位置参数
options._ = options._ || [];
options._.push(arg);
}
});
console.log(options);
// 输出:
// {
// _: [ 'arg1', 'arg2', 'arg3' ],
// name: 'value',
// f: true
// }
这是一个简单的命令行参数解析器,它可以处理位置参数、带有值的长选项(如 --name=value
)、不带值的短选项(如 -f
)等情况。根据具体的需求,你可以对其进行扩展和定制。
方式二:node:util.parseArgs
node:util.parseArgs
是 Node.js 内置模块 util
中的一个方法,用于解析命令行参数。这个方法可以帮助你将命令行参数解析成一个对象,其中键是参数名,值是参数值。
下面是一个简单的示例:
const { parseArgs } = require('node:util');
// 假设命令行参数为: node script.js --port=3000 --host=localhost --debug
const args = parseArgs(process.argv.slice(2));
console.log('Parsed arguments:', args);
// { port: '3000', host: 'localhost', debug: true }
在这个示例中,我们假设命令行参数为 node script.js --port=3000 --host=localhost --debug
。我们使用 process.argv.slice(2)
来获取除了前两个元素(node
和脚本路径)之外的所有参数,并将它们传递给 parseArgs
方法进行解析。解析后的参数将存储在 args
对象中。
parseArgs
函数除了解析命令行参数外,还支持定义命令行选项(options)。这些选项可以用来指定命令行参数的格式、默认值以及其他属性。下面是一个示例代码:
const { parseArgs } = require('util');
const options = [
{ name: 'port', type: 'number', defaultValue: 3000, description: 'The port to listen on' },
{ name: 'host', type: 'string', defaultValue: 'localhost', description: 'The host address' },
{ name: 'debug', type: 'boolean', defaultValue: false, description: 'Enable debug mode' }
];
const args = process.argv.slice(2);
const parsedArgs = parseArgs(args, options);
console.log('Parsed arguments:', parsedArgs);
在这个示例中,我们定义了一个名为 options
的数组,其中包含了三个命令行选项:port
、host
和 debug
。每个选项都有一个 name
属性表示选项的名称,一个 type
属性表示选项的数据类型,一个 defaultValue
属性表示选项的默认值,以及一个 description
属性表示选项的描述信息。
然后我们调用 parseArgs
函数来解析命令行参数,并传入了 options
数组作为第二个参数。这样一来,解析后的结果将会包含我们定义的选项信息,以及命令行参数的其他信息。
方式三:yargs.parse
yargs.parse()
是 yargs
库的一个方法,用于解析命令行参数并返回解析结果。它接收一个可选的命令行参数数组作为参数,并返回一个包含解析结果的对象。yargs 是 Webpack 使用的方式。
以下是使用 yargs.parse()
方法的示例代码:
const yargs = require('yargs');
// 解析命令行参数
// yargs.parse(process.argv.slice(2))
const argv = yargs.parse(['--name', 'Alice', '--greeting', 'Hi']);
// 输出解析结果
console.log(argv);
// { name: 'Alice', greeting: 'Hi' }
在这个示例中,我们手动提供了一个命令行参数数组 ['--name', 'Alice', '--greeting', 'Hi']
,然后通过 yargs.parse()
方法解析了这些参数。解析结果将会是一个对象,其中包含了对应的选项值。
另外,使用 yargs
可以轻松地定义命令行工具的命令、选项和参数,并且可以通过链式调用的方式对其进行配置和定制,使得命令行工具的开发更加便捷和灵活。
以下是一个简单的使用 yargs
的示例:
const yargs = require('yargs');
// 定义命令行工具的命令和选项
const argv = yargs
.command('hello', '打印欢迎信息', function (yargs) {
// 子命令 hello 的配置
return yargs.option('name', {
describe: '要打招呼的名字',
type: 'string',
demandOption: true, // 是否必需
});
}, function (argv) {
// hello 命令的处理函数
console.log(`Hello, ${argv.name}!`);
})
.help() // 添加帮助信息
.argv; // 解析命令行参数
在上面的示例中,我们首先引入了 yargs
模块,然后通过 command
方法定义了一个名为 hello
的命令,该命令用于打印欢迎信息。在命令的配置函数中,我们通过 option
方法定义了一个名为 name
的选项,表示要打招呼的名字,并指定了选项的描述、类型和是否必需。然后,在命令的处理函数中,我们使用 argv.name
获取了命令行参数中的名字,并打印出欢迎信息。最后,通过 help
方法添加了帮助信息,使得用户可以通过命令行工具的 --help
选项获取命令的使用帮助。
总的来说,yargs
是一个功能强大、易用灵活的命令行参数解析库,适用于各种命令行工具的开发场景。
方式四:commander
commander
提供了一种简洁而强大的方式来创建命令行工具。commander
可以帮助你定义和解析命令行选项和参数,支持指令配置。
下面是一个使用 commander
创建简单命令行工具的示例:
const { program } = require('commander');
program
.option('-p, --port <port>', 'Set the server port')
.option('-h, --host <host>', 'Set the server host')
.option('-d, --debug', 'Output extra debugging');
program.parse(process.argv);
const options = program.opts();
console.log('Options:', options);
在这个示例中,我们使用 commander
定义了三个选项:--port
、--host
和 --debug
。用户可以在命令行中使用这些选项来设置服务器的端口、主机和调试模式。
下面是 @vue/cli
实现:
program
.version(`@vue/cli ${require('../package').version}`)
.usage('<command> [options]')
program
.command('create <app-name>')
.descriptioin('create a new project powered by vue-cli-service')
.option('-p --preset <presetName>', 'xxx')
.option('...')
.action(name, options) => {
if (minimist(process.argv.slice(3))._.length > 1) {
console.log(chalk.yellow('\n Info: You provided more than one argument. The first one will be used as the app\'s name, the rest are ignored.'))
}
// ...
require('../lib/create')(name, options)
}
解释:
program.version(`@vue/cli ${require('../package').version}`)
这行代码定义了命令行工具的版本号。
program..usage('<command> [options]')
这行代码定义了命令行工具的用法。<command>
表示命令的名称,[options]
表示命令的选项。
program.command('create <app-name>')
这行代码定义了一个名为 create
的命令,其中 <app-name>
表示命令的参数,即要创建的项目名称。
program.descriptioin('create a new project powered by vue-cli-service')
这行代码为 create
命令添加了描述信息,说明了这个命令的作用。
program.option('-p --preset <presetName>', 'xxx')
这行代码定义了一个选项 -p
或 --preset
,并指定了该选项的描述信息为 'xxx'
。该选项可以用来指定预设名称。
program.action(name, options) => {}
这是 create
命令的执行函数,当用户在命令行中输入了 create
命令时,该函数将被调用执行。在函数内部,首先通过 minimist(process.argv.slice(3))._.length
判断用户输入的参数数量,如果大于 1,则打印一条警告信息。然后调用 require('../lib/create')(name, options)
来执行具体的创建项目的逻辑。
总的来说,以上配置定义了一个 create
命令,该命令用于创建一个新的项目,并提供了一个名为 preset
的选项用来指定预设名称。
chalk:上色
如果你想要给命令行输出添加颜色,你可以使用 chalk
这个库。chalk
提供了一种简单的方式来为控制台输出添加颜色和样式。
例如:
const chalk = require('chalk');
console.log(chalk.green('This is green text'));
console.log(chalk.blue.bold('This is bold blue text'));
console.log(chalk.bgRed.white('This is red background with white text'));
chalk
提供了许多方法来设置不同的颜色和样式,你可以根据需要选择适合的颜色来美化你的命令行输出。