# 如何实现命令行交互
命令行交互核心实现
核心目标:
实现命令行交互,如 List
- 键盘输入监听(readline)
- 命令行窗口尺寸运算
- 清屏
- 光标移动
- 输出流静默
- 输入输出流(stream)
- 事件库(events)
- ansi escaped code
# inquirer
库
- 表单式交互命令行集合库
# 基本使用
import inquirer from "inquirer";
inquirer
.prompt([
/** 文本输入 */
{
/**
* 交互类型 type
* Possible values: input, number, confirm, list, rawlist, expand, checkbox, password, editor
* */
type: "input",
name: "name", // 交互问题输入的变量值
message: "What is your name?", // 问题描述
default: "John Doe", // 默认值
// 验证输入是否符合要求
validate: (value) => {
if (typeof value !== "string") return "Name must be string";
return true;
},
// 对输入的值进行提示处理 (不影响最终结果)
transformer: (value) => value + " (input is your name)",
// 对输入的值进行处理 (影响最终结果)
filter: (value) => value.toLowerCase(),
},
/** 数字输入 */
{
type: "number",
name: "age",
message: "How old are you?",
default: "20",
},
/** 确认选择 */
{
type: "confirm",
name: "isStudent",
message: "Are you a student?",
default: true,
},
/** 列表单选 */
{
type: "list",
name: "gender",
message: "What is your gender?",
// choices: ["Male", "Female"],
choices: [
{ value: "Male", label: "Male" },
{ value: "Female", label: "Female" },
],
default: "Male",
},
])
.then((answers) => {
console.log(answers);
})
.catch((error) => {
if (error.isTtyError) {
// Prompt couldn't be rendered in the current environment
} else {
// Something else went wrong
}
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# 交互结果
➜ inquirer node index.js
✔ What is your name? sam (input is your name)
✔ How old are you? 21
✔ Are you a student? Yes
✔ What is your gender? Female
{ name: 'sam', age: 21, isStudent: true, gender: 'Female' }
1
2
3
4
5
6
2
3
4
5
6
# 交互命令行原理
- 技术栈:
readline/events/stream/ansi-escapes /rxjs