【NJ03】NodeJS基础篇—03 Node开发方向之CLI

862 阅读5分钟

前言

天天喊着CLI,那CLI到底是个啥??来来来,一起拼个单词,Command-Line Interface,翻译过来,叫命令行界面,也称为 CUI,字符用户界面

command-line组成

command [subCommand] [options] [arguments]

  • command:命令,比如 vue
  • [subCommand]:子命令,比如 vue create
  • [options]:选项,配置,同一个命令不同选项会有不一样的操作结果,比如 vue -h,vue -v
- 选项一般会有全拼与简写形式(具体看使用的命令帮 助),比如 --version = -v
    全拼:以 -- 开头 / 简写:以 - 开头
    
- 多个简写的选项可以连写,开头使用一个 - 即可;
- 选项也可以接受值,值写在选项之后,通过空格分隔。
需要注意的是,如果有接受值的选项需要放在最后,比如:
vue create -d -r <-r的值> myApp
vue create -dr <-r的值> myApp

- 若多个简写的选项中每个都有自己的接受值就不能连写。
  • [arguments]:参数,某些命令需要使用的值,比如 vue create myApp
选项与参数的区别:
    选项是命令内置实现,用户进行选择,
    参数一般是用户决定传入的值

强化ls

简化命令去除 node。
借助系统脚本批处理 (windows 下 bat脚本) 命令行直接你输入q(q.cmd 省略) ,就会执行node q.js

# q.cmd 脚本内容
@IF EXIST "%~dp0\node.exe" ( 
    "%~dp0\node.exe" "%~dp0\ls\q.js" %*
) ELSE (
    @SETLOCAL
    @SET PATHEXT=%PATHEXT:;.JS;=;% 
    node "%~dp0\ls\q.js" %*
)

第三方框架

  • commander 命令行开发工具
  • chalk 命令行样式风格控制器
  • inquirer 交互式命令行工具

commander

.parse(argv: string[])

解析执行传入的 argv 命令字符串,通常该命令字符串来自用户在命令行的输入,process.argv。
commander 同时会默认创建一个 -h, --help 的

commander.parse( process.argv );

.version(str, flags?)

设置版本信息,该方法会自动为命令注册一个 -V, --version的 option

  • str:版本号
  • flags:指定的 option选项,默认为:”-V, -- version” //默认 大写的V(Vue也是如此)
设置当前命令的版本
commander.version('v1.0.0', '-v, --version');

.option(flags, description?, fn?, defaultValue?)

设置命令选项

  • flags:选项配置标记名称,-n, --name [val]
  • description:选项使用说明,
  • fn:默认值,函数返回值为defaultValue,优先级 高于defaultValue
  • defaultValue:选项默认值,如果需要的话 option就是一个参数(非多个)(选项)
option('-p, --path <path>')

console.log(commander.path)

设置其他option,--name 后面的 [val] 是当前这个选项的参数值

[]表示可选,<>表示必填
设置成功以后,会在命令commander对象下增加一个与全局的同名的属性

如果第三个参数是一个函数的话,那么该函数会接受来自用户输入的值,并返回一个值作为 最后这个选项实际的值。

commander.option('-n, --name [val]', '设置名称', function(val) { console.log(val);
return val.toUpperCase();

});
//console.log( commander.name );

以列表的形式显示,如果选项配置不接收用户输入的值,那么这个选项 将以boolean的形式提供给后面命令使用

commander.option('-l, --list', '以列表的形式显示');

命令行:node ls -l //会在commander对象下添加list: true

选项配置属性 设置其他option,--name 后面的 [val] 是当前这个选项的参数值

.action(fn)

指定命令要执行的动作行为, 在action的回调函数的参数列表中就是command定义的参数。 该函数执行过程会接收到至少一个参数(默认 commander实例),如果命令中带有参数,则是对应的参数列表,参数的最后一个永远都是 commander 实例

commander.action(() => {
    // 设置命令的动作 
    console.log('Hello ' + commander.name);
});

.command(name, desc?, opts?)

子命令

  • name:命令的名称,也可以接受值 'create [appName]'
  • desc:简介
  • opts:配置
const subCommand = commander.command('create <a> <b> <c>'); 
// 在action的回调函数的参数列表中就是command定义的参数 
subCommand.action( (v1, v2, v3) => {
    console.log(v1, v2, v3); 
});

.description(str)

命令描述 .description('创建项目')

.alias(str)

设置命令别名 .alias('c')

.usage(str)

设置或获取当前命令的使用说明 .usage('使用说明')

chalk

安装

npm i chalk / yarn add chalk

使用

const chalk = require('chalk')

得到一个 chalk 对象,通过这个对象,我们就可以给控制台中的文字加上各种样式了,就像css一样.

chalk.<style>[.<style>...](string, [string...])

Styles

  • Modifiers 文字修饰:italic、bold、underline // 文字的修饰:斜体,加粗在windows下(cmd)下支持不是特别的好

  • Colors 文字颜色:red、green、yellow、 blue、cyan (写好的颜色有限)\

.hex('#DEADED')
.keyword('orange')
.rgb(15, 100, 204)
  • Background colors 背景颜色:bgRed、 bgGreen、bgYellow、bgBlue、bgCyan
.bgHex('#DEADED') .bgKeyword('orange') .bgRgb(15, 100, 204)
console.log(chalk.bold.red.bgGreen('Hello world!') + ' miaov');

inquirer

交互式命令,按questions顺序提问用户,收集用户 输入数据到answers对象中。 提问用户,与用户进行命令行的交互

安装&使用

npm i inquirer 
require('inquirer')

基本概念

  • quesitons // 交互提问, 设置需要交互的内容,例如 输入, 选择等
  • answers // 处理回答,设置处理函数
inquirer.prompt(questions).then(answers=>{
    ...
})

QUESITONS 提问配置

  • type 问题类型
  • name 数据属性
  • message 提示信息
  • default 默认值
  • choices 选项列表
  • validate 校验函数
  • filter 多虑器
  • transformer 转换器

问题类型

  • input 输入

    inquirer.prompt([
        {
            type: 'input',
            name: 'address',
            message: '地址',
        }  
    ])
    
    
      {
        type: 'input',
    
        name: 'username',\
        message: '请输入你的应用名称',\
        default: 'app',\
        validate(val) { // 对用户输入的数据或选择的数据进行验证
            if (val.trim() === '') { return '应用名称不能为空'; } }, 
            return true;
        },
        filter(val) { // 对用户输入的数据或选择的数据进行过滤 } 
            return val.toLowerCase();
        }
       },
    
  • number 数字

    {
        type: 'number',
        name: 'phone',
        message: '手机号'
    }
    
  • confirm 是否选择 (y/n)

    {
      type: 'confirm',
        name: 'out',
        message: '是否退出'
    }
    
    // y: 返回 true, n: 返回 false
    
  • list 选择列表

    {
        type: 'list',
        name: 'phone',
        message: '选择手机品牌',
            choices: [
                { name: '小米', value: 'mi' },
                { name: '华为', value: 'huawei' },
                { name: '苹果', value: 'apple' }
            ]
    
  • rawlist 带编号的选择列表

    {
        type: 'rawlist',
        name: 'num',
        message: '编号',
        choices: [
            { name: '1', value: 1 },
            { name: '2', value: 2 }
        ],
        default: 0 // 默认值为列表项编号,起始为 0
        
    }
    
  • expand 带缩写选择列表

    {
        type: 'expand',
        name: 'lang',
        message: "语言",
        choices: [
          { key: 'j', name: 'javascript', value: 1 },
            { key: 'h', name: 'html', value: 2 }
        ]
    }
    
  • checkbox 多选

      {
            type: 'checkbox',
            name: 'lang',
            message: '语言',
            choices: [
    
                { name: 'javascript', value: 1 },
                { name: 'php', value: 2 },
                { name: 'go', value: 3 },
                
            ],
        }
    
  • password 密码

    {
        type: 'password',
        name: 'pw',
        message: '密码',
    }
    
  • editor 文本编辑器

    {
        type: 'editor',
        name: 'content',
        message: '内容'
    }