脚手架入门:命令注册和参数解析

223 阅读2分钟

我最近在学习慕课网前端架构师课程,学习起来还是有很多东西不是很熟悉。于是准备把每一次学习的内容输出以下,今天是第一天。

背景:

文件夹下有两个包,分别是simoon-testsimoon-test-lib,如图(1-1)。在simoon-test下,执行命令,解析参数解析。比如:node simoon-test init --name testnode simoon-test --version

1-1 simoon-test-lib文件的作用是接受simoon-test文件中解析参数的接收方。主要代码如下:

module.exports = {
    sum(a, b) {
        return a + b
    },
    init({ option, param }) {
        console.log('init')
        console.log('执行init方法', option, param)
    }
}

命令注册和参数解析

第一步:在simoon-test文件夹下,执行npm link simoon-test-lib

第二步:引入simoon-test-lib

在node中,require('process').argv,可以获取命令中的参数。

let argvs = require('process').argv;
console.log(argvs)

执行命令node bin/index.js init获得argvs的结果如下:

[ 
'/Users/mac/.nvm/versions/node/v10.15.3/bin/node',
  '/Volumes/其他资料/learn/慕课架构课/第一周/simoon-test/bin/index.js',
  'init',
  '--name',
  'test' 
]

在这里,能看到参数的第三个就是init,后面的是参数。所以我需要把argvs截取一下,获得options。

let command = argvs[2];
const options = argvs.splice(3);

在这里做一个判断,如果options的长度大于1,则执行simoon-test-lib中的方法。内部需要做一些简单的处理:

  • 从options中获取option和param
  • 把option中的--去除(比如 --name 变成 name)
  • 根据参数,执行simoon-test-lib中的方法
if (options.length > 1) {
    let [option, param] = options;
    option = option.replace('--', '');
    if (command) {
        if (lib[command]) {
            lib[command]({ option, param })
        } else {
            console.log('无效的命令')
        }
    } else {
        console.log('请输入命令')
    }
}

全局命令解析

有一种情况,比如vue --version,这种情况下,第三个参数就是--开头的参数。这种称作全局选项globalOption

在这种情况下需要单独处理。处理的方法如下:

let command = argvs[2];
if (command.startsWith('--') || command.startsWith('-')) {
    const globalOption = command.replace(/--|-/g, '')
    if (globalOption === 'version' || globalOption === 'V') {
        console.log('当前版本号是:v1.0.0')
    }
}

这里的意思是,如果发现argv的第三个参数是以--或者-开头的,将会替换掉--或者-。然后再做一些处理。

最后

今天就这么多,日拱一卒,不断精进(内卷)。

源码:github.com/haimingyue/…