inquirer.js 交互式命令行工具

| Inquirer 简介

简化询问终端用户问题,解析,验证答案,提供错误反馈等等功能。

Inquirer.js 是非常容易去处理以下几种事情的:

  • 提供错误回调
  • 询问操作者问题
  • 获取并解析用户输入
  • 检测用户回答是否合法
  • 管理多层级的提示

由于交互的问题种类不同,inquirer 为每个问题提供很多参数:

  • type:表示提问的类型,包括:input, confirm, list, rawlist, expand, checkbox, password, editor;
  • name: 存储当前问题回答的变量;
  • message:问题的描述;
  • default:默认值;
  • choices:列表选项,在某些 type 下可用,并且包含一个分隔符(separator);
  • validate:对用户的回答进行校验;
  • filter:对用户的回答进行过滤处理,返回处理后的值;
  • transformer:对用户回答的显示效果进行处理(如:修改回答的字体或背景颜色),但不会影响最终的答案的内容;
  • when:根据前面问题的回答,判断当前问题是否需要被回答;
  • pageSize:修改某些 type 类型下的渲染行数;
  • prefix:修改 message 默认前缀;
  • suffix:修改 message 默认后缀。

| 使用

安装:npm install inquirer

// 基本结构
const inquirer = require('inquirer');
const promptList = [
  // 具体交互内容
];
inquirer.prompt(promptList).then((answers) => {
  console.log(answers); // 返回的结果
});
// input
// 新建 serve.js
const inquirer = require('inquirer');
const promptList = [
  {
    type: 'input',
    message: '设置一个用户名:',
    name: 'name',
    default: 'test_user', // 默认值
  },
  {
    type: 'input',
    message: '请输入手机号:',
    name: 'phone',
    validate: function (val) {
      if (val.match(/\d{11}/g)) {
        // 校验位数
        return val;
      }
      return '请输入11位数字';
    },
  },
];

inquirer.prompt(promptList).then((answers) => {
  console.log(answers); // 返回的结果
});
// 运行
node serve.js
// confirm
// 示例1
var inquirer = require('inquirer')
inquirer.prompt([ {
  type: 'confirm',
  name: 'test',
  message: 'Are you handsome?',
  default: true
}]).then((answers) => { console.log('结果为:') console.log(answers)})
// 示例2
const promptList = [{
    type: "confirm",
    message: "是否使用监听?",
    name: "watch",
    prefix: "前缀"
},{
    type: "confirm",
    message: "是否进行文件过滤?",
    name: "filter",
    suffix: "后缀",
    when: function(answers) { // 当 watch 为 true 的时候才会提问当前问题
        return answers.watch
    }
}];
// list
const promptList = [
  {
    type: 'list',
    message: '请选择一种水果:',
    name: 'fruit',
    choices: ['Apple', 'Pear', 'Banana'],
    filter: function (val) {
      // 使用 filter 将回答变为小写
      return val.toLowerCase();
    },
  },
];
// rawlist
const promptList = [
  {
    type: 'rawlist',
    message: '请选择一种水果:',
    name: 'fruit',
    choices: ['Apple', 'Pear', 'Banana'],
  },
];
// expand
const promptList = [
  {
    type: 'expand',
    message: '请选择一种水果:',
    name: 'fruit',
    choices: [
      {
        key: 'a',
        name: 'Apple',
        value: 'apple',
      },
      {
        key: 'O',
        name: 'Orange',
        value: 'orange',
      },
      {
        key: 'p',
        name: 'Pear',
        value: 'pear',
      },
    ],
  },
];
// checkbox
const promptList = [
  {
    type: 'checkbox',
    message: '选择颜色:',
    name: 'color',
    choices: [
      {
        name: 'red',
      },
      new inquirer.Separator(), // 添加分隔符
      {
        name: 'blur',
        checked: true, // 默认选中
      },
      {
        name: 'green',
      },
      new inquirer.Separator('--- 分隔符 ---'), // 自定义分隔符
      {
        name: 'yellow',
      },
    ],
  },
];
// 分页显示 checkbox
const promptList = [
  {
    type: 'checkbox',
    message: '选择颜色:',
    name: 'color',
    choices: ['red', 'blur', 'green', 'yellow'],
    pageSize: 2, // 设置行数
  },
];
// password
const promptList = [
  {
    type: 'password', // 密码为密文输入
    message: '请输入密码:',
    name: 'pwd',
  },
];
// editor
const promptList = [
  {
    type: 'editor',
    message: '请输入备注:',
    name: 'editor',
  },
];