首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
【架构师(第一篇)】整体需求分析和架构设计
2
【架构师(第二篇)】脚手架架构设计和框架搭建
3
【架构师(第三篇)】脚手架开发之掌握Lerna操作流程
4
【架构师(第四篇)】脚手架开发之Lerna源码分析
5
【架构师(第五篇)】脚手架之import-local执行流程及简历设计
6
【架构师(第六篇)】脚手架之需求分析和架构设计
7
【架构师(第七篇)】脚手架之准备阶段编写
8
【架构师(第八篇)】脚手架之 commander 框架使用方法
9
【架构师(第九篇)】如何让 Node 环境支持 ES Module
10
【架构师(第十篇)】脚手架之注册命令及架构优化
11
【架构师(第十一篇)】脚手架之命令注册和执行过程开发
12
【架构师(第十二篇)】脚手架之命令行交互工具 inquirer.js 使用方法
13
【架构师(第十三篇)】脚手架之创建项目准备阶段开发
14
【架构师(第十四篇)】脚手架之 egg.js 和 mongodb 的使用
15
【架构师(第十五篇)】脚手架之创建项目模板开发
16
【架构师(第十六篇)】脚手架之创建项目模板的下载与更新
17
【架构师(第十七篇)】脚手架之 ejs 和 glob 的使用
18
【架构师(第十八篇)】脚手架之项目模板的安装
19
【架构师(第十九篇)】脚手架之组件库模板开发
20
【架构师(第二十篇)】脚手架之自定义模板及第一阶段总结
21
【架构师(第二十一篇)】编辑器开发之需求分析和架构设计
22
【架构师(第二十二篇)】编辑器开发之项目整体搭建
23
【架构师(第二十三篇)】编辑器开发之画布区域组件的渲染
24
【架构师(第二十四篇)】编辑器开发之添加模版到画布
25
【架构师(第二十五篇)】编辑器开发之属性编辑区域表单渲染
26
【架构师(第二十六篇)】编辑器开发之属性编辑同步渲染
27
【架构师(第二十七篇)】前端单元测试框架 Jest 基础知识入门
28
【架构师(第二十八篇)】 测试工具 Vue-Test-Utils 基础语法
29
【架构师(第二十九篇)】Vue-Test-Utils 触发事件和异步请求
30
【架构师(第三十篇)】Vue-Test-Utils 全局组件和第三方库 vuex | vue-router
31
【架构师(第三十一篇)】前端测试之 TDD 的开发方式
32
【架构师(第三十二篇)】 通用上传组件开发及测试用例
33
【架构师(第三十三篇)】 Vue 中的实例及本地图片预览
34
【架构师(第三十四篇)】 业务组件库开发之 vue3 的插件系统
35
【架构师(第三十五篇)】 业务组件库开发之使用 Rollup 进行打包
36
【架构师(第三十六篇)】 业务组件库开发之发布到 NPM
37
【架构师(第三十七篇)】 服务端开发之后端框架与数据库技术选型
38
【架构师(第三十八篇)】 服务端开发之本地安装最新版 MySQL 数据库
39
【架构师(第三十九篇)】 服务端开发之连接 MySQL 数据库
40
【架构师(第四十篇)】 服务端开发之连接 Mongodb 数据库
41
【架构师(第四十一篇)】 服务端开发之安装并连接 Redis数据库
42
【架构师(第四十二篇)】 服务端开发之常用的登录鉴权方式
43
【架构师(第四十三篇)】 服务端开发之单元测试和接口测试
44
【架构师(第四十四篇)】 服务端开发之 pm2 和 nginx 介绍
45
【架构师(第四十五篇)】 服务端开发之认识 Github actions
46
【架构师(第四十六篇)】 服务端开发之安装 Docker
47
【架构师(第四十七篇)】 服务端开发之认识 Docker
48
【架构师(第四十八篇)】 服务端开发之 Dockerfile
49
【架构师(第四十九篇)】 服务端开发之认识 Docker-compose
50
【架构师(第五十篇)】 服务端开发之自动发布到测试机
清单首页架构文章详情

【架构师(第十二篇)】脚手架之命令行交互工具 inquirer.js 使用方法


inquirer.js 基本用法

什么是 inquirer.js

inquirer.js 是一个用来实现命令行交互式界面的工具集合。它帮助我们实现与用户的交互式交流,比如给用户提一个问题,用户给我们一个答案,我们根据用户的答案来做一些事情。

它包含以下功能:

  • 可以向用户提出问题
  • 解析用户输入的答案
  • 对用户的输入进行验证
  • 提供错误回调

安装

代码语言:javascript
复制
npm i inquirer -S

使用

代码语言:javascript
复制
// 引入 inquirer
const inquirer = require('inquirer');
// 启动 inquirer
inquirer
  // 交互内容
  .prompt([
  ])
  // 收集用户答案后的回调,会以键值对的方式存储在这里
  .then((answers) => {
  })
  // 捕获错误的回调
  .catch((error) => {
  });

default,choices,validate,filter 以及when 的值为函数时,可以异步调用,也可以返回一个Promise或者使用this.async()方法来获得一个回调,然后使用最终值来调用它。

代码语言:javascript
复制
{
  filter() {
    return new Promise();
  },

  validate: function (input) {
    var done = this.async();
    setTimeout(function() {
      if (typeof input !== 'number') {
        done('You need to provide a number');
        return;
      }
      done(null, true);
    }, 3000);
  }
}

属性

这里暂时只做介绍,后面会结合代码演示所有属性的使用方法。

type

表示提问的类型,包括:

  • input
  • number
  • confirm
  • list
  • rawlist
  • expand
  • checkbox
  • password
  • editor

name

存储当前问题回答的变量;

message

问题的描述;

default

默认值;

choices

列表选项,在某些 type 下可用,并且包含一个分隔符( separator );

validate

对用户的回答进行校验,只有返回 true 的时候才会向下进行;

filter

对用户的回答进行过滤处理,返回处理后的值,会修改用户提交的值;

transformer

对用户回答的显示效果进行处理(如:修改回答的字体或背景颜色),但不会影响最终的答案的内容;

when

根据前面问题的回答,判断当前问题是否需要被回答;

pageSize

修改某些 type 类型下的渲染行数;

prefix

修改 message 默认前缀;

suffix

修改 message 默认后缀;

mask

修改 typepassword 时的显示模式。

交互类型

input

输入交互,完整代码如下,但是我会一个个属性的添加进行演示。

代码语言:javascript
复制
inquirer
  .prompt([
    {
      type: 'input',
      message: '请输入姓名',
      name: 'name',
      default: '一尾流莺',
      validate: (answer) => {
        if (answer.length < 2) {
          return '名字不可以少于两个字符';
        }
        console.log();
        return true;
      },
      transformer: (a) => {
        return `最帅的人是 : ${a}`;
      },
      filter: (a) => {
        return `最帅的人是 : ${a}`;
      },
      prefix: '🟢',
      suffix: '🟡',
    },
  ])
  .then((answers) => {
    console.log('🚀🚀 ~ answers', answers);
  })
  .catch((error) => {
    console.log('🚀🚀 ~ error', error);
  });

当前只设置了如下属性

  • type:交互类型,输入类
  • message:问题描述,命令行展示的内容
  • name:字段值,将来会把用户的输入赋值给这个属性定义的字段

接下来我们设置一个 default 属性,可以看到问题后面出现了括号,括号里面就是我们设定的默认值,如果什么都不输入,直接回车的话,就会使用默认值作为答案。

  • default:默认值

接下来我们设置一个 validate 属性,用来对答案进行验证,不符合条件的时候,会进行提示,符合条件就可以通过。

  • validate:对用户的回答进行校验,只有返回 true 的时候才会向下进行,返回其他内容会作为提示输出在页面中

接下来我们再设置一个 transformer 属性,这个属性用于修改答案内容的显示,但不会修改实际的答案,可以看到最终回调中输出的答案依旧是 “一尾流莺”,但是界面显示的 “最帅的人是:一尾流莺”

  • transformer:对用户回答的显示效果进行处理,但不会影响最终的答案的内容

接下来我们设置一个 filter 属性,这个属性会修改实际的答案,可以看到我们输入的是 “一尾流莺”,但是回调中输出的是 “最帅的人是:一尾流莺”

  • filter:对用户的回答进行过滤处理,返回处理后的值,会修改用户提交的值

接下来我们分别设置前缀和后缀,可以看到我在问题的前面加了一个绿色的圆,问题的后面加了一个黄色的圆。

  • prefix:修改 message 默认前缀
  • suffix:修改 message 默认后缀

number

数字交互,输入的内容会自动转换为 number 类型,如果输入的不是数字,会被转换成 NaN

代码语言:javascript
复制
inquirer
  .prompt([
    {
      type: 'number',
      message: '请输入年龄',
      name: 'age',
    },
  ])
  .then((answers) => {
    console.log('🚀🚀 ~ answers', answers);
  })
  .catch((error) => {
    console.log('🚀🚀 ~ error', error);
  });

PS:这里可以利用 validate 属性对用户输入进行校验。

confirm

确认交互,默认值在界面上会以大写字母的方式进行展示。

代码语言:javascript
复制
inquirer
  .prompt([
    {
      type: 'confirm',
      message: '是否单身?',
      name: 'single',
      default: 'true',
    },
  ])
  .then((answers) => {
    console.log('🚀🚀 ~ answers', answers);
  })
  .catch((error) => {
    console.log('🚀🚀 ~ error', error);
  });

list

列表选择交互,这里涉及到了两个新属性。

代码语言:javascript
复制
inquirer
  .prompt([
    {
      type: 'list',
      message: '请选择你的老婆',
      name: 'wife',
      default: 0,
      choices: [
        {
          value: 1,
          name: '赵今麦',
        },
        {
          value: 2,
          name: '谭松韵',
        },
        {
          value: 3,
          name: '毛晓彤',
        },
        {
          value: 4,
          name: '新垣结衣',
        },
      ],
      pageSize: 2,
    },
  ])
  .then((answers) => {
    console.log('🚀🚀 ~ answers', answers);
  })
  .catch((error) => {
    console.log('🚀🚀 ~ error', error);
  });
  • choices:列表选项,在某些 type 下可用,并且可以包含一个分隔符( separator )

如果设置了分隔符,那么会将选项进行分割。

  • pageSize: 修改某些 type 类型下的渲染行数

如果设置了 pageSize,剩下的选项会隐藏,并且通过上下键进行切换。

rawlist

这个和 list 差不多,只不过多了一个可以通过输入索引来进行选择的功能,当然也可以通过上下按键进行选择。

代码语言:javascript
复制
inquirer
  .prompt([
    {
      type: 'rawlist',
      message: '请选择你的老婆',
      name: 'wife',
      default: 0,
      choices: [
        {
          value: 1,
          name: '赵今麦',
        },
        {
          value: 2,
          name: '谭松韵',
        },
        {
          value: 3,
          name: '毛晓彤',
        },
        {
          value: 4,
          name: '新垣结衣',
        },
      ],
    },
  ])
  .then((answers) => {
    console.log('🚀🚀 ~ answers', answers);
  })
  .catch((error) => {
    console.log('🚀🚀 ~ error', error);
  });

expand

这个也和 list 差不多,提供简写,但是语法有一些差别。输入 h 可以查看所有选项。

代码语言:javascript
复制
inquirer
  .prompt([
    {
      type: 'expand',
      message: '请选择一个颜色',
      name: 'color',
      default: 'R',
      choices: [
        {
          key: 'R',
          value: 'red',
        },
        {
          key: 'G',
          value: 'green',
        },
        {
          key: 'B',
          value: 'blue',
        },
      ],
    },
  ])
  .then((answers) => {
    console.log('🚀🚀 ~ answers', answers);
  })
  .catch((error) => {
    console.log('🚀🚀 ~ error', error);
  });

checkbox

多选交互,通过 空格 进行选中操作,回车 进行确认操作,通过给选项添加 checked:true 来进行默认选中的操作。通过 a 进行全选,通过 i 进行反选。

代码语言:javascript
复制
inquirer
  .prompt([
    {
      type: 'checkbox',
      message: '请选择你的老婆们:',
      name: 'wifes',
      choices: [
        {
          value: 1,
          name: '赵今麦',
          checked: true,
        },
        {
          value: 2,
          name: '谭松韵',
        },
        {
          value: 3,
          name: '毛晓彤',
        },
        {
          value: 4,
          name: '新垣结衣',
        },
      ],
    },
  ])
  .then((answers) => {
    console.log('🚀🚀 ~ answers', answers);
  })
  .catch((error) => {
    console.log('🚀🚀 ~ error', error);
  });

password

密码交互,可以隐藏用户输入的内容,通过 mask 属性来修改显示方式,一种是 隐藏 输入,一种是用 * 代替输入。

代码语言:javascript
复制
inquirer
  .prompt([
    {
      type: 'password',
      message: '请输入密码1:',
      name: 'password1',
    },
    {
      type: 'password',
      message: '请输入密码2:',
      name: 'password2',
      mask: true,
    },
  ])
  .then((answers) => {
    console.log('🚀🚀 ~ answers', answers);
  })
  .catch((error) => {
    console.log('🚀🚀 ~ error', error);
  });

editor

打开一个文本编辑器,用来输入一些复杂的内容,按回车打开编辑器。

when

最后来学习一下 when 属性的用法。

when 的回调参数是前面所有问题的答案,只有返回值为 true 的时候,才会出现 when 类型的交互。

代码语言:javascript
复制
inquirer
  .prompt([
    {
      type: 'confirm',
      message: '是否单身?',
      name: 'single',
      default: true,
    },
    {
      type: 'confirm',
      message: '是否需要女朋友?',
      name: 'girl',
      when: function (answers) {
        // 当 single 为 true 的时候才会提问当前问题
        return answers.single;
      },
    },
  ])
  .then((answers) => {
    console.log('🚀🚀 ~ answers', answers);
  })
  .catch((error) => {
    console.log('🚀🚀 ~ error', error);
  });

inquirer 的用法还是比较简单的,到这里基本就可以满足日常开发中大多数的交互需求了。

下一篇
举报
领券