介绍
Inquirer.js是一组常见的交互式命令行用户界面。这包括输入问题的答案或从列表中选择一个选项。
该inquirer
包提供了几个默认提示,并且是高度可配置的。它还可以通过插件接口进行扩展。它甚至支持承诺和async/await
语法。
在本文中,您将安装并探索 Inquirer.js 的一些功能。
先决条件
如果你想跟随这篇文章,你需要:
- Node.js 的本地开发环境。遵循如何安装 Node.js 并创建本地开发环境。
本教程已通过 Node v15.14.0、npm
v7.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
:
const inquirer = require('inquirer');
添加一个提示,询问用户他们最喜欢的爬行动物:
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
不提交任何答案的情况下按下:
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
在您的代码编辑器中重新访问并添加一个提示,询问用户他们最喜欢的颜色:
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
类型提供的自由表单输入:
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 UP
和ARROW DOWN
键来导航选择列表。j
和k
键盘导航也可以。
原始列表
该rawlist
类型是类似list
。它显示一个选项列表并允许用户输入他们选择的索引(从 开始1
):
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
类型让人联想到一些命令行应用程序,这些应用程序向您提供映射到可以输入的功能的字符列表。expand
prompts 最初将向用户显示可用字符值的列表,并在按下键时为其提供上下文:
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
。它允许您选择多个选项,而不是单个选择。
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
。
OutputAnswer: [ '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
类型允许用户将其默认文本编辑器用于较大的文本输入。
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-prompt
、inquirer-search-list
、 和inquirer-table-prompt
。