Inquirer
常见交互式命令行用户界面的集合。
在你自己的终端中试试吧!
npx @inquirer/demo@latest
安装
npm | yarn |
---|---|
|
|
[!注意] Inquirer 最近进行了彻底的重写,以减小包的大小并提高性能。之前版本的包仍在维护(虽然不再积极开发),并提供了数百个社区贡献的提示,这些提示可能尚未迁移到最新的 API。如果你正在寻找这些,之前的包在这里。
使用方法
import { input } from '@inquirer/prompts';
const answer = await input({ message: '输入你的名字' });
提示
输入
import { input } from '@inquirer/prompts';
查看文档获取使用示例和选项文档。
选择
import { select } from '@inquirer/prompts';
查看文档获取使用示例和选项文档。
复选框
import { checkbox } from '@inquirer/prompts';
查看文档获取使用示例和选项文档。
确认
import { confirm } from '@inquirer/prompts';
查看文档获取使用示例和选项文档。
搜索
import { search } from '@inquirer/prompts';
查看文档获取使用示例和选项文档。
密码
import { password } from '@inquirer/prompts';
查看文档获取使用示例和选项文档。
展开
import { expand } from '@inquirer/prompts';
查看文档获取使用示例和选项文档。
编辑器
在临时文件上启动用户首选编辑器的实例。一旦用户退出编辑器,临时文件的内容将被读取作为答案。使用的编辑器由读取 $VISUAL 或 $EDITOR 环境变量来确定。如果这两个都不存在,则使用操作系统默认的编辑器(Windows 上为 notepad,Mac 或 Linux 上为 vim)。
import { editor } from '@inquirer/prompts';
查看文档获取使用示例和选项文档。
数字
与 input
提示非常相似,但具有内置的数字验证配置选项。
import { number } from '@inquirer/prompts';
查看文档获取使用示例和选项文档。
原始列表
import { rawlist } from '@inquirer/prompts';
查看文档获取使用示例和选项文档。
创建你自己的提示
高级用法
所有 inquirer 提示都是接受两个参数的函数。第一个参数是提示配置(每个提示都是唯一的)。第二个参数提供上下文或运行时配置。
上下文选项包括:
属性 | 类型 | 必需 | 描述 |
---|---|---|---|
input | NodeJS.ReadableStream | 否 | 标准输入流(默认为 process.stdin ) |
output | NodeJS.WritableStream | 否 | 标准输出流(默认为 process.stdout ) |
clearPromptOnDone | boolean | 否 | 如果为true,我们将在回答提示后清除屏幕 |
示例:
import { confirm } from '@inquirer/prompts';
const allowEmail = await confirm(
{ message: '您允许我们向您发送电子邮件吗?' },
{
output: new Stream.Writable({
write(chunk, _encoding, next) {
// 执行某些操作
next();
},
}),
clearPromptOnDone: true,
},
);
取消提示
所有提示函数都返回一个可取消的promise。这种特殊的promise类型有一个cancel
方法,可以取消并清理提示。
调用cancel
时,答案promise将被拒绝。
import { confirm } from '@inquirer/prompts';
const answer = confirm(...); // 注意:对于这个你不能使用 `await`
answer.cancel();
使用方法
在对象中获取答案
当询问多个问题时,您可能不想在每个地方都为每个答案保留一个变量。在这种情况下,您可以将答案放在一个对象中。
import { input, confirm } from '@inquirer/prompts';
const answers = {
firstName: await input({ message: "您的名字是什么?" }),
allowEmail: await confirm({ message: '您允许我们向您发送电子邮件吗?' }),
};
console.log(answers.firstName);
有条件地提问
也许某些问题取决于其他问题的答案。
import { input, confirm } from '@inquirer/prompts';
const allowEmail = await confirm({ message: '您允许我们向您发送电子邮件吗?' });
let email;
if (allowEmail) {
email = await input({ message: '您的电子邮件地址是什么' });
}
在超时后获取默认值
import { setTimeout } from 'node:timers/promises';
import { input } from '@inquirer/prompts';
const ac = new AbortController();
const prompt = input({
message: '输入一个值(5秒后超时)',
});
prompt
.finally(() => {
ac.abort();
})
// 静默取消错误。
.catch(() => {});
const defaultValue = setTimeout(5000, 'timeout', { signal: ac.signal }).then(() => {
prompt.cancel();
return '已超时!';
});
const answer = await Promise.race([defaultValue, prompt]);
用作预提交/git钩子,或脚本
默认情况下,从husky
/lint-staged
等工具运行的脚本可能不会在交互式shell中运行。在非交互式shell中,Inquirer无法运行,用户也无法向进程发送按键事件。
为了使其工作,您必须确保启动一个tty
(或"交互式"输入流)。
如果这些脚本在您的package.json
中设置,您可以像这样定义流:
"precommit": "my-script < /dev/tty"
或者如果在shell脚本文件中,您可以这样做:(在Windows上这可能是您唯一的选择)
#!/bin/sh
exec < /dev/tty
node my-script.js
等待配置
也许某些问题配置需要等待一个值。
import { confirm } from '@inquirer/prompts';
const answer = await confirm({ message: await getMessage() });
社区提示
如果您创建了一个很酷的提示,发送PR添加它到下面的列表中!
交互式列表提示
使用箭头键 + 回车或按与选项相关的键来选择。
? 选择一个选项:
> 运行命令 (D)
退出 (Q)
动作选择提示
从列表中选择一个项目,并通过按键选择要采取的动作。
? 选择一个文件 打开 <O> 编辑 <E> 删除 <X>
❯ image.png
audio.mp3
code.py
表格多选提示
从表格显示中选择多个答案。
在选项之间选择?(按 <空格> 选择,<上下键> 移动行,
<左右键> 移动列)
┌──────────┬───────┬───────┐
│ 1-2 of 2 │ 是? │ 否? |
├──────────┼───────┼───────┤
│ 选项 1 │ [ ◯ ] │ ◯ |
├──────────┼───────┼───────┤
│ 选项 2 │ ◯ │ ◯ |
└──────────┴───────┴───────┘
切换提示
用切换来确认。使用箭头键 + 回车选择选项。
? 您要继续吗? 否 / 是
可排序复选框提示
与内置的复选框提示相同,但也允许使用ctrl+上/下重新排序选项。
? 您想合并哪些PR以及按什么顺序?(按 <空格> 选择,<a> 切换全部,<i> 反转选择,<ctrl+上> 向上移动项目,<ctrl+下> 向下移动项目,然后按 <回车> 继续)
❯ ◯ PR 1
◯ PR 2
◯ PR 3
一个支持多选和过滤/搜索的inquirer选择。
? 选择您的操作系统、IDE、编程语言等。(按 <tab> 选择/取消选择,<退格键> 删除已选选项,<回车> 选择选项)
>> vue
>[ ] vue
[ ] vuejs
[ ] fuelphp
[ ] venv
[ ] vercel
(使用箭头键显示更多选项)
文件选择器提示
一个文件选择器,您可以在目录之间自由导航,选择要允许的文件类型,并且它是完全可定制的。
? 选择一个文件:
/main/path/
├── folder1/
├── folder2/
├── folder3/
├── file1.txt
├── file2.pdf
└── file3.jpg (不允许)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
使用 ↑↓ 在列表中导航
按 <esc> 导航到父目录
按 <回车> 选择文件或导航到目录
许可证
版权所有 (c) 2023 Simon Boudrias (twitter: @vaxilart)
根据MIT许可证授权。