inquirer 终端中和用户交互

title: inquirer 终端中和用户交互 id: 43e015160664fac475dadee44b46afdf tags: [] date: 2000/01/01 00:00:00 updated: 2023/03/04 19:29:12 isPublic: true --#|[分隔]|#--

inquirer 终端中和用户交互

普通开发时并不需要,但有些时候,比如开发了一个脚手架,需要在生成项目时,询问用户这个项目的名称、选用的插件、是否启用某项功能,这些时候就必须要和用户有一些交互了。

inquirer 就是比较好的一项交互工具,下面是他的主要功能。

基本使用

安装:

npm install inquirer

基本使用:

const inquirer = require('inquirer');

;(async () => {

  // 基本用法,传入对象数组,每个对象都是一次提问,按顺序提问
  let answers = await inquirer.prompt([
    {
      type: 'input', // 提示的类型,是 input 输入框
      message: '设置一个用户名:', // 要展示的问题提示
      name: 'name', // 用于存放用户回答的字段名
      default: '小明', // 默认值
    },
    {
      type: 'input', // 提示的类型,是 input 输入框
      message: '输入第二个名字:', // 要展示的问题提示
      name: 'name2', // 用于存放用户回答的字段名
      default: '大明', // 默认值
    },
  ])

  // 在 answers 中获取用户应答对象
  console.log(answers) // { name: '小明', name2: '大明' }
})()

效果:

Snipaste_2021-04-01_11-05-46.png

数组中每个对象,都是一个问题对象,问题对象中有以下字段:

下面开始使用具体例子来讲解。

input 输入字符串和输入校验

用于用户输入回车后,进行值的校验,不输入符合规则的值,就会一直卡住。

效果:

Snipaste_2021-04-01_11-15-40.png

number 输入内容自动转数字类型

和 input 类似,只不过这个会把输入的内容自动转为数字。

如果输入的是个非数字,或者无法转成数字,值会变成 NaN。

confirm 询问是否同意

打印一个询问,用户响应 y 或者 n,来拿到 bool 值。

效果:

Snipaste_2021-04-01_11-34-25.png

list 单选列表

提供一个列表给用户,用户使用上下箭头切换,回车选中。

效果:

Snipaste_2021-04-01_11-38-20.png

注意:出现备选列表时,列表的多种书写形式

这里插播一条关键点,所有类似 type: "list " 这种需要提供备选列表的问题对象,它提供数组的那一项(大多是 choices 这个字段),可以是字符串数组,也可以是对象数组。

choices 是字符串数组时,default 指定默认值、最终拿到的,都是数组中某一项。

choices 是对象数组时,对象中必须要有 name 字段,作用和字符串数组中的字符串一样。

如果对象还有 value 字段,那 name 字段只用作用户选择时的 label 提示最终值以 value 为准。

如以下例子中的两种方式:

rawlist 同list,但提供输入序号快捷选择

当 list 列表过于庞大,上下切换太慢,可以提供这种方式,用户可以直接通过输入数字的方式,快速切换。

但最终拿到的对象中的值,仍然是数字中的选项。

效果:

Snipaste_2021-04-01_11-40-44.png

checkbox 多选

上下移动箭头,使用空格键切换是否选中。

效果:

Snipaste_2021-04-01_12-17-53.png

password 输入隐藏形式的密码

输入密码时,输入的字段不会实时打印

效果:

Snipaste_2021-04-01_13-51-17.png

editor 启用 vim 编辑器进行长文本输入

偶尔需要用户输入大篇幅需要换行的内容,比如常见的比如 git merge 时,出了不自动合并的冲突,就会出现一个编辑器,让编写信息。

这里也可以:

效果:

Snipaste_2021-04-01_13-58-11.png

expand 自定义字母作为选择(不建议使用)

也是展示列表供用户选择,但用户交互不太友好,用户不容易懂。

效果:

Snipaste_2021-04-01_12-10-11.png

Last updated

Was this helpful?