# 如何实现命令行交互

  • 命令行交互核心实现

    核心目标:实现命令行交互,如 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

# 交互结果

➜  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

# 交互命令行原理

  • 技术栈:

readline/events/stream/ansi-escapes /rxjs