玩转 Nodejs 命令行

背景

在做 cli 工具的时候,非常需要命令行相关的第三方库。一个比较稳健成熟的命令行应该考虑以下 4 种需求:

  1. 读取传入的各种参数,例如: --help, -v=123
  2. 逻辑处理和友好的 UI 交互,例如:提供列表选择
  3. 细致控制字体颜色和背景颜色
  4. 状态显示,例如:等待过程前面是转圈圈,完成过程前面自动换成对号

在开始前,安装一下需要用到的库:

npm install --save inquirer
npm install --save commander
npm install --save inquirer
npm install --save ora

下面的四个文件例子只需复制粘贴到文件通过node.js即可运行

读取参数: commander

这里用到的是 commander 这个库。它的文档地址是:https://www.npmjs.com/package/commander

请先看下面代码:

const program = require("commander");

// 分为2种操作, 2种操作互相冲突

// Options 操作
program
  .version("0.0.1")
  .option("-t, --types [type]", "test options")
  // option这句话必须加
  .parse(process.argv);

// Commands 操作
program
  // 命令与参数: <> 必填; [] 选填
  .command("exec <cmd> [env]")
  // 别名
  .alias("ex")
  // 帮助信息
  .description("execute the given remote cmd")
  // 没用,option和command是冲突的
  .option("-e, --exec_mode <mode>", "Which exec mode to use")
  // 执行的操作
  .action((cmd, env, options) => {
    // 参数可以拿到
    console.log(`env is ${env}`);
    console.log('exec "%s" using %s mode', cmd, options.exec_mode);
  })
  // 自定义help信息
  .on("--help", function() {
    console.log("自定义help信息");
  });

// 参数长度不够, 打印帮助信息
if (!process.argv.slice(2).length) {
  program.outputHelp();
}

if (program.types) {
  console.log(program.types);
}

// 解析命令行参数
program.parse(process.argv);

文档上基本都写明白了,但是有几个需要注意的点:

  1. 它主要提供 options 和 commands 两种操作,option 就是形如“-t,--types”这样的传参,commands 就是形如“exec”这样的传参。 不要混用两者?。
  2. 读取 commands 中传入的参数,写在 .action? 中;读取 options 传入的参数,是通过访问 program? 上的变量。除此之外,options 操作需要执行 ?.parse(process.argv) 解析命令行参数
  3. -V? 和 -h? 默认也是提供的,但是也可以通过自定义覆盖
  4. 一般都把 options 写在前面, 顺便标识版本号?;把 commands 写在后面;最后会判断一下参数长度,不够会自动输出打印信息

交互验证:inquirer

深入交互并且提供基于命令行的选择列表、弹框等 UI 视图,我们借助:inquirer 库。它的文档地址是:https://www.npmjs.com/package/inquirer

请看下面这段代码:

const inquirer = require("inquirer");
const program = require("commander");

program
  .version("1.0.0")
  .option("--sass [sass]", "启用sass")
  .option("--less", "启用less")
  .parse(process.argv);

program
  .command("module [moduleName]")
  .alias("m")
  .description("创建新模块")
  .action(option => {
    console.log(`option is ${option}`);
    console.log(`program.sass is ${program.sass}`);
    const config = {
      moduleName: null,
      des: "",
      sass: false,
      less: false
    };

    const promps = [];

    // type: input
    // 问答框类型
    if (config.moduleName !== "string") {
      promps.push({
        type: "input",
        name: "moduleName",
        message: "请输入模块名称",
        validate: function(input) {
          if (!input) {
            return "输入不能为空";
          }
          return true;
        }
      });
    }

    // type: list
    // 列表选择器类型
    if (!program.sass && !program.less) {
      promps.push({
        type: "list",
        name: "cssPretreatment",
        message: "想用什么css预处理器呢",
        choices: [
          {
            name: "Sass",
            value: "sass"
          },
          {
            name: "Less",
            value: "less"
          }
        ]
      });
    }

    inquirer.prompt(promps).then(function(answers) {
      console.log(answers);
    });
  });

program.parse(process.argv);

除去 commader 库的应用,inquirer 库的应用在 15~64 行。它首先会验证是否传入 module 参数,如果没有,那么以问答的形式引导用户输入;紧接着检查是否指定了 scss / less,如果没有指定,弹出列表选择器供用户选择。

整个过程中的交互体验还是非常好的,尤其是针对多个选项的时候的列表选择器,一目了然。

颜色控制:chalk

这个比较简单,写过 c 的同学应该知道控制命令行颜色,只需要 颜色宏定义 + 字体内容 拼接即可。所以这个库也是,提供更语义化的 api 将文本处理成拼接后的结果,然后交给控制台输出。

const chalk = require("chalk");
const print = console.log;
print(chalk.blue("Hello") + " World" + chalk.red("!"));
print(chalk.blue.bgRed.bold("Hello World!"));

过程控制:ora

它实现的核心功能是控制台刷新,我可以用它来做“下载进度条”(一直更新 text 属性即可)。当然,项目中用它来做状态提示,它会在语句前面给个转圈圈的 icon,还会有对号、错误等终止状态 icon。

看下面这段代码,假想现在是在下载*。可以跑一下下面代码,mac 下比 windows 下好太多**。

const ora = require("ora");

const spinner = ora({
  text: "链接网络中"
}).start(); // 开始状态 => 加载状态

setTimeout(() => {
  spinner.color = "yellow";
  spinner.text = "网速有点慢";
}, 1000); // 还是 加载状态, 更新文案和颜色

setTimeout(() => {
  spinner.succeed("下载成功"); // 加载状态 => 成功状态
}, 2000);

主要使用了 commander.js && inquirer.js && chalk.js 这三个库。

推荐

阿里开发团队一篇靠谱的文档: 非常推荐

不推荐

commander.js文档:看了后很多疑惑。。。

原文地址:https://www.cnblogs.com/jing-tian/p/12121981.html

时间: 2024-08-30 01:58:40

玩转 Nodejs 命令行的相关文章

NodeJs命令行新建项目实例

安装Nodejs: 下载地址:http://nodejs.org/download/ 设置环境变量,例如我将nodejs装在D:/program文件夹下,则设以下为系统环境变量 D:\Program\nodejs 安装Express开发框架: //命令行输入命令 npm install -g express npm install -g express-generator 新建项目 //命令行输入命令 express -t ejs newsproject 按照提示进入项目目录,运行npm安装 /

前端技术之:如何创建一个NodeJs命令行交互项目

方法一:通过原生的NodeJs API,方法如下: #!/usr/bin/env node # test.js var argv = process.argv; console.log(argv) 通过以下命令执行: node test.js param1 --param2 -param3 结果输出如下: [ '/usr/local/Cellar/node/10.10.0/bin/node', 'test.js', 'param1', '--param2', '-param3' ] 可见,arg

玩转shell命令行

移动光标快捷键 ctrl+f 向前移动一个字符 ctrl+b 向后移动一个字符 ctrl+a 移动到当前行首home ctrl+e 移动到当前行尾end alt+f 向前移动一个单词 alt+b 向后移动一个单词 ctrl+l 清屏,并在屏幕最上面开始一个新行 编辑命令行快捷键 ctrl+d 删除当前的字符(光标处在一个空白的命令行上,将会退出shell) alt+d 删除从光标到当前单词结尾的部分 ctrl+w 删除从光标到当前单词开始部分 ctrl+k 删除文本直到行的末尾 ctrl+u 删

nodejs 命令行、自定义

一.必备插件 1. babel:es6语法支持,需要babel-perset-es2015(转换成es5执行).babel.babel-core(程序执行) 2. commander:自定义命令插件,提供参数的传递等 3. liftoff:实现对命令窗口的输入监听,以及命令格式化规格. 4. minimist:读取命令行参数插件 以上插件都可以通过npm直接安装. 二.示例代码分析: 2.1. cli.js var liftOff = require("liftoff");import

nodejs 命令行获取入参

安装:npm install yargs --save-dev Example index.js const argv = yargs.alias('n', 'name').alias('p', 'port').alias('t', 'tpl').argv console.log(argv.name); 命令行输入: $ node index.js -n fuck -p 8080 -tpl components 原文地址:https://www.cnblogs.com/CyLee/p/84344

一幅图告诉你所有的NodeJS命令行调试语句

NodeJS提供脚本调试. 输入node debug xx.js即可进入调试模式.

一张地图,告诉你NodeJS命令行调试器语句

NodeJS提供脚本调试. 进入node debug xx.js您可以进入调试模式. 版权声明:本文博客原创文章,博客,未经同意,不得转载.

nodejs 命令行交互

人机交互 function readSyncByfs(tips) { tips = tips || '> '; process.stdout.write(tips); process.stdin.pause(); const buf = Buffer.allocUnsafe(10000); let response = fs.readSync(process.stdin.fd, buf, 0, 10000, 0); process.stdin.end(); return buf.toString

详解NodeJS和命令行程序

源起 植根于Unix系统环境下的程序,很多都把贯彻Unix系统设计的哲学作为一种追求.Unix系统管道机制的发明者Douglas McIlroy把Unix哲学总结为三点: 专注做一件事,并做到极致.程序协同工作.面向通用接口,如文本数据流.随着Unix/Linux系统在服务器上影响力越发强大,以及各种跨平台解决方案的发展,这种哲学也被带到了各种平台上.若干年前,笔者第一次接触NodeJS和其包管理解决方案NPM时候,就感觉到其官方倡导的风格,和Unix系统哲学非常契合.近年来,随着NodeJS在