持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情
前言
大家好,我是小阵 🔥,一路奔波不停的码字业务员
身为一个前端小菜鸟,总是有一个飞高飞远的梦想,因此,每点小成长,我都想要让它变得更有意义,为了自己,也为了更多值得的人
如果喜欢我的文章,可以关注 ➕ 点赞,与我一同成长吧~😋
加我微信:zzz886885,邀你进群,一起学习交流,摸鱼学习两不误🌟
开开心心学技术大法~~
来了来了,他真的来了~
正文
node原生获取cli参数
node原生获取cli参数?什么意思?
假设有以下node命令
node indexjs -s hh -t yes
这里的-s hh
与-t yes
就是通过node命令行传入到脚本中的参数。怎样在node脚本中拿到?
通过node本身暴露的process.argv
可以拿到
比如我这里
打印的结果中后面的四个就是我们传入的参数
我们slice(2)
一下就看的更明白了
可以看到,我们自己通过node也是可以拿到想要的参数的。
用node原生实现一个简单功能
那假如实现一个简单功能。
输入一个字符串,然后根据输入的字符分隔,我们自己来实现的话很简单
const aStr = 'a,a,a,a,a'
const splitStr = ','
console.log(aStr.split(splitStr))
以上即可。
那怎样用node原生通过node命令行来实现下呢?
区分开两种入参
我们要区分的是aStr
和splitStr
假设,我们传入的node命令行为
node index.js -a a,a,a,a -s ,
那我们要解析的就是-a a,a,a,a
与-s ,
。
将传入的参数分类
const args = process.argv.slice(2);
const options = {}
console.log('args', args);
args.forEach((item, index) => {
if (!item) return;
const reg = /--(\w+)/
const shortReg = /-(\w+)/
if (reg.test(item) || shortReg.test(item)) {
const key = item
options[key] = args[index + 1]
args[index + 1] = null;
} else {
options['_origin'] = item[index + 1]
}
})
console.log('options', options)
打印的分类后是这样的
请忽略我这里的路径
以上得知,其实已经拿到了参数了,我们只需要分别拿出options
的_a
和_s
即可。
但是看上去参数不太好看,并且我们都知道commander
可以允许-a
和--axxx
这种方式,那怎样兼容这种传参呢?
丰富传参key值
我们需要本地维护一个这样的map
,当然,如果像是commander
的options
手动传入的,则是会自动生成map
,这个我们在后续手动实现commander
的时候再来详细说明。
const presetMap = [
[['-s', '--splitStr'], 'splitStr'],
[['-a', '--aStr'], 'aStr'],
]
假设我们要定的key值分别为splitStr
和aStr
。
我们还要基于这个map
拿到正确的key
const getOptionKey = function (str) {
let key = null;
for (let item of presetMap) {
if (item[0].includes(str)) {
key = item[1]
break;
}
}
return key
}
此时我们再将之前的赋值key的地方修改下
options[key] = args[index + 1]
这个时候应该就ok了,好了,我们验证下。
验证
我们用以下node来传参
node nodepkg/commander/原生node.js -s , -a a,b,c
我们打印的结果是
可以看到我们已经很好的拿到了aStr
和splitStr
接下来只需要用拿到的数据执行split
方法即可
console.log('预期',options.aStr.split(options.splitStr));
ok,到了这里已经完成了我们的目标。
那其实看到了这里,就不难得知commander
是怎样进行封装的,后面我会再发布个简易版的 commander
,敬请期待!
结语
如果文章真的有帮到你,希望可以多多点赞、收藏、关注支持一波呀!!小阵会很开心哒~
文章如有错误或不严谨之处,还望指出,感谢感谢!!!
往期好文推荐「我不推荐下,大家可能就错过了史上最牛逼vscode插件集合
啦!!!(嘎嘎嘎~)😄」