如何使用 Inquirer.js 创建交互式命令行提示

介绍

Inquirer.js是一组常见的交互式命令行用户界面。这包括输入问题的答案或从列表中选择一个选项。

inquirer包提供了几个默认提示,并且是高度可配置的。它还可以通过插件接口进行扩展。它甚至支持承诺和async/await语法。

在本文中,您将安装并探索 Inquirer.js 的一些功能。

先决条件

如果你想跟随这篇文章,你需要:

本教程已通过 Node v15.14.0、npmv7.10.0 和v8.0.0 验证inquirer

步骤 1 — 设置项目

首先,打开终端窗口并创建一个新的项目目录:

mkdir inquirer-example

然后,导航到此目录:

cd inquirer-example

要开始向 Node.js 脚本添加提示,您需要安装inquirer包:

  • npm install inquirer

此时,您已准备好使用 Inquirer.js 的新项目。

第 2 步 – 创建提示

现在,index.js在您的项目目录中创建一个新文件并使用您的代码编辑器打开它。

在您的脚本中,请务必要求inquirer

索引.js
const inquirer = require('inquirer');

添加一个提示,询问用户他们最喜欢的爬行动物:

索引.js
const inquirer = require('inquirer');

inquirer
  .prompt([
    {
      name: 'faveReptile',
      message: 'What is your favorite reptile?'
    },
  ])
  .then(answers => {
    console.info('Answer:', answers.faveReptile);
  });

重新访问终端窗口并运行脚本:

  • node index.js

您将看到一个提示:

Output
? What is your favorite reptile?

提供答案将显示响应:

Output
? What is your favorite reptile? Crocodiles Answer: Crocodiles

您可以提供一个default值,允许用户在ENTER不提交任何答案的情况下按下

索引.js
const inquirer = require('inquirer');

inquirer
  .prompt([
    {
      name: 'faveReptile',
      message: 'What is your favorite reptile?',
      default: 'Alligators'
    },
  ])
  .then(answers => {
    console.info('Answer:', answers.faveReptile);
  });

再次运行脚本,您将看到一个提示:

Output
? What is your favorite reptile? (Alligators)

ENTER无应答将提交默认答案:

Output
? What is your favorite reptile? Alligators Answer: Alligators

现在,您可以创建提示并设置默认值。

第 3 步 – 创建多个提示

您可能已经注意到该.prompt()方法接受一个数组或对象。那是因为您可以将一系列提示问题串在一起,answers一旦所有提示都得到解决,所有答案都将作为变量的一部分按名称提供

index.js在您的代码编辑器中重新访问并添加一个提示,询问用户他们最喜欢的颜色:

索引.js
const inquirer = require('inquirer');

inquirer
  .prompt([
    {
      name: 'faveReptile',
      message: 'What is your favorite reptile?',
      default: 'Alligators'
    },
    {
      name: 'faveColor',
      message: 'What is your favorite color?',
      default: '#008f68'
    },
  ])
  .then(answers => {
    console.info('Answers:', answers);
  });

再次运行脚本,您将看到两个提示:

Output
? What is your favorite reptile? Alligators ? What is your favorite color? #008f68 Answers: { faveReptile: 'Alligators', faveColor: '#008f68' }

现在,您可以创建多个提示。

步骤 4 — 使用列表、原始列表、可扩展列表、复选框、密码和编辑器

inquirer支持的不仅仅是提示用户进行文本输入。作为示例,以下类型将单独展示,但您可以通过将它们传递到同一个数组中来将它们链接在一起。

列表

list类型允许您向用户提供一组固定的选项供您选择,而不是该input类型提供的自由表单输入

列表.js
const inquirer = require('inquirer');

inquirer
  .prompt([
    {
      type: 'list',
      name: 'reptile',
      message: 'Which is better?',
      choices: ['alligator', 'crocodile'],
    },
  ])
  .then(answers => {
    console.info('Answer:', answers.reptile);
  });

重新访问终端窗口并运行脚本:

  • node list.js

您将看到一个list提示:

Output
? Which is better? (Use arrow keys) ❯ alligator crocodile

用户可以ARROW UPARROW DOWN键来导航选择列表。jk键盘导航也可以。

原始列表

rawlist类型是类似list它显示一个选项列表并允许用户输入他们选择的索引(从 开始1):

原始列表.js
const inquirer = require('inquirer');

inquirer
  .prompt([
    {
      type: 'rawlist',
      name: 'reptile',
      message: 'Which is better?',
      choices: ['alligator', 'crocodile'],
    },
  ])
  .then(answers => {
    console.info('Answer:', answers.reptile);
  });

重新访问终端窗口并运行脚本:

  • node list.js

您将看到一个rawlist提示:

Output
? Which is better? 1) alligator 2) crocodile Answer:

提交无效值将导致"Please enter a valid index"错误。

可扩展列表

expand类型让人联想到一些命令行应用程序,这些应用程序向您提供映射到可以输入的功能的字符列表。expandprompts 最初将向用户显示可用字符值的列表,并在按下键时为其提供上下文:

展开.js
const inquirer = require('inquirer');

inquirer
  .prompt([
    {
      type: 'expand',
      name: 'reptile',
      message: 'Which is better?',
      choices: [
        {
          key: 'a',
          value: 'alligator',
        },
        {
          key: 'c',
          value: 'crocodile',
        },
      ],
    },
  ])
  .then(answers => {
    console.info('Answer:', answers.reptile);
  });

重新访问终端窗口并运行脚本:

  • node expand.js

您将看到一个expand提示:

Output
? Which is better? (acH)

默认情况下,H包含代表选项"Help",在输入H和点击时ENTER将切换到选项列表,由它们的字符索引,然后可以输入以进行选择。

Output
? Which is better? (acH) a) alligator c) crocodile h) Help, list all options Answer:

提交无效值将导致"Please enter a valid command"错误。

复选框

checkbox类型也相似list它允许您选择多个选项,而不是单个选择。

复选框.js
const inquirer = require('inquirer');

inquirer
  .prompt([
    {
      type: 'checkbox',
      name: 'reptiles',
      message: 'Which reptiles do you love?',
      choices: [
        'Alligators', 'Snakes', 'Turtles', 'Lizards',
      ],
    },
  ])
  .then(answers => {
    console.info('Answer:', answers.reptiles);
  });

重新访问终端窗口并运行脚本:

  • node checkbox.js

您将看到一个checkbox提示:

Output
? Which reptiles do you love? (Press <space> to select, <a> to toggle all, <i> to invert selection) ❯◯ Alligators ◯ Snakes ◯ Turtles ◯ Lizards

与其他list类型类似,您可以使用箭头键进行导航。要进行选择,您可以点击SPACE也可以使用 选择全部a或使用 反转您的选择i

Output
Answer: [ 'Alligators', 'Snakes', 'Turtles', 'Lizards' ]

与其他提示类型不同,此提示类型的答案将返回一个数组而不是字符串。即使用户选择不选择任何项目,它也将始终返回一个数组。

密码

password类型将隐藏用户的输入。这允许用户提供不应被看到的敏感信息:

const inquirer = require('inquirer');

inquirer
  .prompt([
    {
      type: 'password',
      name: 'secret',
      message: 'Tell me a secret',
    },
  ])
  .then(answers => {
    // Displaying the password for debug purposes only.
    console.info('Answer:', answers.secret);
  });

重新访问终端窗口并运行脚本:

  • node password.js

您将看到一个password提示:

Output
? Tell me a secret [hidden]

输入对用户隐藏。

编辑

editor类型允许用户将其默认文本编辑器用于较大的文本输入。

编辑器.js
const inquirer = require('inquirer');

inquirer
  .prompt([
    {
      type: 'editor',
      name: 'story',
      message: 'Tell me a story, a really long one!',
    },
  ])
  .then(answers => {
    console.info('Answer:', answers.story);
  });

重新访问终端窗口并运行脚本:

  • node editor.js

您将看到一个editor提示:

Output
? Tell me a story, a really long one! Press <enter> to launch your preferred editor.

inquirer将尝试根据$EDITOR$VISUAL环境变量的值在用户系统上打开文本编辑器如果两者都不存在,则将使用vim(Linux) 和notepad.exe(Windows) 代替。

结论

在本文中,您安装并探索了 Inquirer.js 的一些功能。此工具可用于从用户检索信息。

使用一些插件继续学习inquirer-autocomplete-promptinquirer-search-list、 和inquirer-table-prompt

觉得文章有用?

点个广告表达一下你的爱意吧 !😁