模拟commander获取node命令行参数?

1,046 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情

前言

大家好,我是小阵 🔥,一路奔波不停的码字业务员
身为一个前端小菜鸟,总是有一个飞高飞远的梦想,因此,每点小成长,我都想要让它变得更有意义,为了自己,也为了更多值得的人
如果喜欢我的文章,可以关注 ➕ 点赞,与我一同成长吧~😋
加我微信:zzz886885,邀你进群,一起学习交流,摸鱼学习两不误🌟

开开心心学技术大法~~

开心

来了来了,他真的来了~

正文

node原生获取cli参数

node原生获取cli参数?什么意思?

假设有以下node命令

node indexjs -s hh -t yes

这里的-s hh-t yes就是通过node命令行传入到脚本中的参数。怎样在node脚本中拿到?

通过node本身暴露的process.argv可以拿到

比如我这里

image.png

打印的结果中后面的四个就是我们传入的参数

我们slice(2)一下就看的更明白了

image-20220627205225692

可以看到,我们自己通过node也是可以拿到想要的参数的。

用node原生实现一个简单功能

那假如实现一个简单功能。

输入一个字符串,然后根据输入的字符分隔,我们自己来实现的话很简单

const aStr = 'a,a,a,a,a'
const splitStr = ','
console.log(aStr.split(splitStr))

以上即可。

那怎样用node原生通过node命令行来实现下呢?

区分开两种入参

我们要区分的是aStrsplitStr

假设,我们传入的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)

打印的分类后是这样的

image-20220627213336544

请忽略我这里的路径

以上得知,其实已经拿到了参数了,我们只需要分别拿出options_a_s即可。

但是看上去参数不太好看,并且我们都知道commander可以允许-a--axxx这种方式,那怎样兼容这种传参呢?

丰富传参key值

我们需要本地维护一个这样的map,当然,如果像是commanderoptions手动传入的,则是会自动生成map,这个我们在后续手动实现commander的时候再来详细说明。

const presetMap = [
  [['-s', '--splitStr'], 'splitStr'],
  [['-a', '--aStr'], 'aStr'],
]

假设我们要定的key值分别为splitStraStr

我们还要基于这个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

我们打印的结果是 image-20220627212703219

可以看到我们已经很好的拿到了aStrsplitStr

接下来只需要用拿到的数据执行split方法即可

console.log('预期',options.aStr.split(options.splitStr));

image-20220627213110440

ok,到了这里已经完成了我们的目标。

那其实看到了这里,就不难得知commander是怎样进行封装的,后面我会再发布个简易版的 commander,敬请期待!

结语

如果文章真的有帮到你,希望可以多多点赞、收藏、关注支持一波呀!!小阵会很开心哒~

文章如有错误或不严谨之处,还望指出,感谢感谢!!!

加油!

往期好文推荐「我不推荐下,大家可能就错过了史上最牛逼vscode插件集合啦!!!(嘎嘎~)😄」