从0开发一个高性能前端脚手架-第七篇-脚手架命令注册

165 阅读2分钟

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

image.png 上几篇文章讲解了脚手架的准备阶段

接下来开始进行脚手架命令的注册阶段

我们使用Node第三方库 commander 来进行命令的注册

先看个commander的示例

const commander = require('commander')
const program = new commander.Command()
const pkg = require('./package.json')

program
  .name(Object.keys(pkg.bin)[0])
  .usage('<command> [options]')
  .version(pkg.version)
  .option('-d,--debug','是否开启调试模式'false)
  .option('-e, --envName <envName>', '获取环境变量名称')
  .parse(process.argv);

在终端输入,就能看到我们注册的--debug命令

cli --help

image.png

下面开始命令注册

命令注册

// 命令注册
function registryCommand(){
    program
        .name(Object.keys(pkg.bin)[0])
        .usage('<command> [options]')
        .version(pkg.version)
        .option('-d, --debug','是否开启调试模式', false);
    
    // 开启debug模式
    program.on('option:debug', function(){
        if(program._optionValues.debug){
            process.env.LOG_LEVEL = 'verbose'
        }else{
            process.env.LOG_LEVEL = 'info'
        }
        log.level = process.env.LOG_LEVEL;
        log.verbose('test')
    })
    // 对未知命令监听
    program.on('command:*', function(obj){
        console.log(obj)
        const availableCommands = program.commands.map(cmd => cmd.name())
        console.log(colors.red(`未知的命令:${obj[0]}`))
        if(availableCommands.length > 0){
            console.log(colors.red(`可用命令:${availableCommands.join(',')}`))
        }
    })
    // 没有输入命令,进行提示
    if(program.args && program.args.length < 1){
        program.outputHelp()
        console.log()
    }
    program.parse(process.argv)
}

在这里进行了4个命令的注册,下面分别讲解下

是否开启debug模式

program
        .name(Object.keys(pkg.bin)[0])
        .usage('<command> [options]')
        .version(pkg.version)
        .option('-d, --debug','是否开启调试模式', false);

通过在option中,第一个参数是命令,-d和--debug是相等的,-d是--debug的缩写。第二个参数是对这个命令的描述。第三个参数是默认值,这里为false,表示默认不开启调试模式。

开启debug模式

// 开启debug模式
    program.on('option:debug', function(){
        if(program._optionValues.debug){
            process.env.LOG_LEVEL = 'verbose'
        }else{
            process.env.LOG_LEVEL = 'info'
        }
        log.level = process.env.LOG_LEVEL;
        log.verbose('test')
    })

这里我们使用commander的高级命令: option: debug。在这个回调函数中,可以通过program._optionValues.debug来获取是否开启debug模式,如果开启,则将环境变量中的LOG_LEVEL变成verbose,否则变成info,也就是普通模式。最后我们需要将环境变量的Log_LEVEL赋值给自定义log库的log.level。这样就实现了开始degbu模式。

对未知命令的监听

// 对未知命令监听
    program.on('command:*', function(obj){
        console.log(obj)
        const availableCommands = program.commands.map(cmd => cmd.name())
        console.log(colors.red(`未知的命令:${obj[0]}`))
        if(availableCommands.length > 0){
            console.log(colors.red(`可用命令:${availableCommands.join(',')}`))
        }
    })

这里也是使用commander高级用法:command:* ,通过这个能获取所有注册的命令。只要不在这里的命令,统一视为未知命令,并给用户进行提示。

没命令进行提示

// 没有输入命令,进行提示
    if(program.args && program.args.length < 1){
        program.outputHelp()
        console.log()
    }

这里可以通过program.args来获取输入的命令,如果长度为0,则表示没有输入命令。然后可以通过program.outputhelp()获取帮助文档,给用户显示出来目前已经注册的命令。