NPM 制作命令行工具 - 进阶辅助库

一、简介

  • 通过 NPM 制作命令行工具 - 入门案例 已经基本知道如何制作命令行工具了,现在就是内部命令处理。

  • 如果不使用第三方插件辅助,那就只能对传入的参数进行一个一个判断处理,添加注释,这是很麻烦的,所以,就有了一些比较好用的辅助插件,列举下一些常用的。

二、常用辅助插件

  • Commander

    • Commander 是一个轻巧的 nodejs 模块,提供了用户命令行输入和参数解析强大功能。Commander 源自一个同名的 Ruby 项目。

    • 辅助文档

      Commander 快速上手

      Commander 使用教程

      Commander 详细使用

    • 安装

      $ npm i commander
      
    • 常用举例

      #!/usr/bin/env node
      
      const {
              
               program } = require('commander')
      const {
              
               version } = require('./package.json')
      
      // 当前路径
      console.log(process.cwd())
      
      // 配置版本号
      program.version(version)
      
      // 介绍命令的使用
      // program.usage('可以介绍命令的用法,进行举例')
      
      // 配置帮助提示,可以通过 $ dzm-cli --help 查询对应的 option 配置项,不包含子命令的 option 配置项
      program.option('-d, --dzm [type]', 'Add cheese with optional type')
      // 配置帮助提示并支持监听
      program
        .option('-x, --xyq [type]', 'Add cheese with optional type')
        .action((opts, cmd) => {
              
              
          // opts:跟下面解析用户传入的参数结果一样,是个对象,会包含所有的用户传入参数
          // cmd:整个命令对象
          console.log('【option 输出】:', opts)
        })
      
      // 配置子命令
      program
        // 子命令名称
        .command('create <app-name>')
        .description('create a new project')
        // 子命令支持的属性,可以通过 $ dzm-cli create -h 查询对应的 option 配置项
        .option('-f, --force, overwrite target derectory if it exists')
        // .usage('可以介绍命令的用法,进行举例')
        .action((value, cmd) => {
              
              
          // value:只会输出 <app-name> 的值
          // cmd:子命令如果传入了子命令的 option 属性指令,这里就会带出,否则不带,是个空
          console.log('【command 输出】:', value, cmd)
        })
      
      // 接收传入的值
      // program
      //   .argument('<username>', 'user to login')
      //   .argument('\[password]', 'password for user, if required', 'no password given')
      //   .action((username, password) => {
              
              
      //     console.log('username:', username)
      //     console.log('password:', password)
      //   })
      
      // 监听 --help 指令,可以补充说明文档 
      program.on('--help', function () {
              
              
        console.log('如果觉得说明文档不全,可以这里追加补充!')
      })
      
      // 解析用户传入的参数
      // 1、先调用 parse,会将传入的参数,针对上面配置的指令与子命令进行分析,改执行的执行,该转成参数的转成参数
      program.parse(process.argv)
      // 2、用户传入的所有参数
      const opts = program.opts()
      // 用户传入的参数
      // 执行 $ dzm-cli -d 123 456,输出的结果为:{ dzm: '123' } [ '456' ]
      // -d 后面的 123 为指令 dzm 的参数,后面多余的 456 则为附带的参数值,两者可混合存在
      console.log('【argv | opts 输出】:', opts, program.args)
      
  • TerminalKit

    • terminal-kit 简化了与用户交互的许多东西,可以专注于在程序中开发重要的内容,有很多适合终端工具包的例子。

      例如:如果需要从网上下载一些内容,那么就需要向用户显示进度条等等。

    • 主要功能:

        文字样式(像 chalk)
        编辑屏幕
        进度条
        用户输入
      

      input-field-doc4.gif

      record.gif

      single-column-menu-doc1.gif

    • 辅助文档

      TerminalKit 表单输出、询问

      TerminalKit 官方使用文档

    • 进度条案例

      #!/usr/bin/env node
      
      // Require the lib, get a working terminal
      var terminal = require('terminal-kit').terminal;
      
      var progressBar;
      var progress = 0;
      
      function updateProgress() {
              
              
        // 产生一个随机的进度值
        progress += Math.random() / 10;
        progressBar.update(progress);
      
        // 检查是否完成
        if (progress >= 1) {
              
              
          setTimeout(function () {
              
              
            terminal('\n');
            process.exit();
          }, 250);
        }
        else {
              
              
          setTimeout(updateProgress, 100 + Math.random() * 500);
        }
      }
      
      progressBar = terminal.progressBar({
              
              
        width: 80,
        title: 'Downloading file:',
        eta: true,
        percent: true
      });
      
      updateProgress();
      
  • Validator

    • validator 可以进行一系列常见的字符串验证(例如:电子邮件地址电话号码IP地址等)。每当从用户那里获得输入时,这样的软件包都是必不可少的。用户会犯错误,并会在文本框中输入一些非常奇怪的东西,所以需要一个验证输入的包,避免数据损坏或服务器崩溃。

    • 以下是一些常用的验证器:

      isEmail(str [, options])
      isIP(str [, version])
      isMobilePhone(str, locale)
      isURL(str [, options])
      
    • validator 也提供检测器,可以对输入字符串进行规范化、删除或转义。例如对用户提交的内容进行清理,避免输入恶意的 HTMLJavaScript 代码。

    • 下面是常用的检测器:

      blacklist(input, chars)
      escape(input)
      normalizeEmail(email [, options])
      whitelist(input, chars)
      

      normalizeEmail() 方法它能够确保电子邮件地址都是小写字母,甚至可以删除需要忽略的字符。假设你有电子邮件 [email protected]normalizeEmail() 会将其标准化为 [email protected]

猜你喜欢

转载自blog.csdn.net/zz00008888/article/details/130992211