node.js的命令行參數(shù)解析工具有很多跌榔,比如:argparse异雁、optimist、yars僧须、commander纲刀。optimist和yargs內(nèi)部使用的解析引擎正是minimist,如果你喜歡輕量級(jí)的技術(shù)担平,那么minimist足夠簡(jiǎn)單好用示绊,代碼量也很少(只有幾百行)芥挣,非常適合研讀。
minimist的特性比較全面:
- short options
- long options
- Boolean 和 Number類型的自動(dòng)轉(zhuǎn)化
- option alias
先看一下minimist整體的解析過(guò)程耻台,代碼大致是:
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 {
...
}
}
解析過(guò)程中空免,minimist會(huì)依次匹配不同的模式,從long options到short options盆耽,匹配之后再進(jìn)行相應(yīng)的解析工作蹋砚。
我們可以寫一個(gè)簡(jiǎn)單地例子來(lái)試試minimist:
// test.js
var args = require('minimist')(process.argv.slice(2));
console.log(args.hello);
$ node test.js --hello=world
// world
$ node test.js --hello world
// world
$ node test.js --hello
// true 注意:不是空字符串而是true
從上面的例子可以看到,minimist和optimist一樣會(huì)把參數(shù)解析成一個(gè)字典摄杂。但是最后一次的值與前兩次不太一樣坝咐。去掉world
之后,hello
的值變成了true
析恢。一般情況下墨坚,如果參數(shù)后面沒(méi)有跟著的value的話,minimist會(huì)把參數(shù)的值解析成true映挂。不過(guò)泽篮,minimist在解析接口當(dāng)中提供的string
選項(xiàng)來(lái)修改上面的解析過(guò)程。string
選項(xiàng)可以傳入一個(gè)數(shù)組柑船,數(shù)組中的參數(shù)會(huì)被一直解析成字符串帽撑。我們修改一下上面的test.js
var args = require('minimist')(process.argv.slice(2), {
string: ["hello"]
});
console.log(args.hello);
$ node test.js --hello world
// world
$ node test.js --hello
// ""
在string
選項(xiàng)當(dāng)中添加了hello
之后鞍时,hello
的值會(huì)一直解析成字符串亏拉,如果去掉了world
,那么hello
將解析成空字符串逆巍。
minimist還支持boolean
選項(xiàng)及塘,與string
選項(xiàng)相反,在boolean
選項(xiàng)當(dāng)中的參數(shù)锐极,會(huì)被一直解析成true
或false
笙僚,比如下面的例子:
var args = require('minimist')(process.argv.slice(2), {
boolean: ["hello"]
});
console.log(args.hello);
console.log(args._);
$ node test.js --hello world
// true
// [ 'world' ]
$ node test.js
// false
// []
hello
將一直被解析成true
或false
溪烤,添加的world
會(huì)保存到args
的_
選項(xiàng)里面味咳。
除了string
和boolean
以外庇勃,minimist還提供了default
和alias
兩個(gè)選項(xiàng)檬嘀,分別用來(lái)設(shè)定默認(rèn)值和option alias。