Contents

nodejs的命令行参数解析工具有很多,比如:argparse、optimist、yars、commander。optimist和yargs内部使用的解析引擎正是minimist,如果你喜欢轻量级的技术,那么minimist足够简单好用,代码量也很少(只有几百行),非常适合研读。

minimist的特性比较全面:

  • short options
  • long options
  • Boolean 和 Number类型的自动转化
  • option alias

先看一下minimist整体的解析过程,代码大致是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for (var i = 0; i < args.length; i++) {
var arg = args[i];
if (/^--.+=/.test(arg)) {
...
} else if (/^--no-.+/.test(arg)) {
...
} else if (/^--.+/.test(arg)) {
...
} else if (/^-[^-]+/.test(arg)) {
...
} else {
...
}
}

解析过程中,minimist会依次匹配不同的模式,从long options到short options,匹配之后再进行相应的解析工作。

我们可以写一个简单地例子来试试minimist:

1
2
3
4
// test.js
var args = require('minimist')(process.argv.slice(2));
console.log(args.hello);
1
2
3
4
5
6
$ node test.js --hello=world
// world
$ node test.js --hello world
// world
$ node test.js --hello
// true 注意:不是空字符串而是true

从上面的例子可以看到,minimist和optimist一样会把参数解析成一个字典。但是最后一次的值与前两次不太一样。去掉world之后,hello的值变成了true一般情况下,如果参数后面没有跟着的value的话,minimist会把参数的值解析成true。不过,minimist在解析接口当中提供的string选项来修改上面的解析过程。string选项可以传入一个数组,数组中的参数会被一直解析成字符串。我们修改一下上面的test.js

1
2
3
4
5
var args = require('minimist')(process.argv.slice(2), {
string: ["hello"]
});
console.log(args.hello);
1
2
3
4
$ node test.js --hello world
// world
$ node test.js --hello
// ""

string选项当中添加了hello之后,hello的值会一直解析成字符串,如果去掉了world,那么hello将解析成空字符串。

minimist还支持boolean选项,与string选项相反,在boolean选项当中的参数,会被一直解析成truefalse,比如下面的例子:

1
2
3
4
5
6
var args = require('minimist')(process.argv.slice(2), {
boolean: ["hello"]
});
console.log(args.hello);
console.log(args._);
1
2
3
4
5
6
$ node test.js --hello world
// true
// [ 'world' ]
$ node test.js
// false
// []

hello将一直被解析成truefalse,添加的world会保存到args_选项里面。

除了stringboolean以外,minimist还提供了defaultalias两个选项,分别用来设定默认值和option alias。

Contents