npm 包 cli-questions 使用教程

阅读时长 14 分钟读完

npm 包是 Node.js 生态系统中非常重要的模块,cli-questions 便是其中之一。cli-questions 封装了控制台交互式问题的功能,这对于 Node.js 命令行工具来说非常有用。

本文将介绍 cli-questions 的使用方法,并提供示例代码。我们将详细地介绍该库的核心特点和使用技巧,以帮助您更轻松地使用这个库来构建强大的命令行程序。

安装

使用 npm 安装 cli-questions,命令如下:

基础用法

cli-questions 提供了一个 Question 类来表示问题,通过构造函数传入问题的参数,可以配置该问题的各种属性(例如问题文本、问题类型、问题答案、检验规则等)。在提问前,必须将该问题添加到问题数组中。

下面我们来看一个最简单的示例:

-- -------------------- ---- -------
----- --------- - -------------------------

----- -------- ------ -
  ----- ---- - --- --------------------
    ----- ----- -- ---- -------
    ----- --------
  ---

  -----------------------------

  ----- ------ - ----- -------------------

  ------------------ --------------------------
-

-------

在这个示例中,我们创建了一个 input 类型的问题,用于询问用户的名字。在添加这个问题后,我们通过 prompt() 函数启动这个问题,等待用户的回答。用户输入完成后,我们通过 ${result[name.symbol]} 取出该问题的答案,输出用户的名字。

需要注意的是,prompt() 函数返回一个 Promise,所以我们需要使用 await 关键字来等待用户的回答。

示例代码

接下来我们将通过示例代码来详细介绍 cli-questions 的使用,包括问题的类型、答案的检验、多个问题的组合、问题的提示等等。

基础问题类型

input 类型

input 类型的问题用于询问用户输入任意字符串。示例代码如下:

-- -------------------- ---- -------
----- --------- - -------------------------

----- -------- ------ -
  ----- ---- - --- --------------------
    ----- ----- -- ---- -------
    ----- --------
  ---

  -----------------------------

  ----- ------ - ----- -------------------

  ------------------ --------------------------
-

-------

在这个示例中,我们使用了 input 类型的问题,用于询问用户的名字。在 Question 的构造函数中,我们通过 text 属性来设置问题的文本。

number 类型

number 类型的问题用于询问用户输入数字。示例代码如下:

-- -------------------- ---- -------
----- --------- - -------------------------

----- -------- ------ -
  ----- --- - --- --------------------
    ----- ---- --- --- ------
    ----- ---------
  ---

  ----------------------------

  ----- ------ - ----- -------------------

  ---------------- --- --------------------- ----- -------
-

-------

在这个示例中,我们使用了 number 类型的问题,用于询问用户的年龄。需要注意的是,这个问题要求用户输入数字类型的数据,如果用户输入的是字符串类型,那么将会抛出错误。

confirm 类型

confirm 类型的问题用于询问用户“是”或“否”的确认问题。示例代码如下:

-- -------------------- ---- -------
----- --------- - -------------------------

----- -------- ------ -
  ----- --------- - --- --------------------
    ----- ---- --- ----------
    ----- ----------
  ---

  ----------------------------------

  ----- ------ - ----- -------------------

  -- -------------------------- -
    ---------------- --- -----------
  - ---- -
    ---------------- --- --- -----------
  -
-

-------

在这个示例中,我们使用了 confirm 类型的问题,用于询问用户是否已婚。在 Question 的构造函数中,我们使用了 type 属性来设置问题的类型为 confirm

list 类型

list 类型的问题用于提供多个选项供用户选择。示例代码如下:

-- -------------------- ---- -------
----- --------- - -------------------------

----- -------- ------ -
  ----- ------ - --- --------------------
    ----- ----- -- ---- -------- --------
    ----- -------
    -------- -
      ------
      --------
      -------
    --
  ---

  -------------------------------

  ----- ------ - ----- -------------------

  ----------------- -------- ----- -- ----------------------------
-

-------

在这个示例中,我们使用了 list 类型的问题,用于提供多种颜色给用户选择。在 Question 的构造函数中,我们使用了 choices 属性来设置问题的可选项。如果用户选择了其中的某个选项,那么 result 中该问题的答案将会是选中的选项。

password 类型

password 类型的问题用于询问用户要输入的密码。示例代码如下:

-- -------------------- ---- -------
----- --------- - -------------------------

----- -------- ------ -
  ----- -------- - --- --------------------
    ----- ------- ----- ---- -----------
    ----- -----------
    --------- ------- -- -
      -- ------------- - -- -
        ------ --------- ------ -- -- ----- - -------------
      -
      ------ -----
    --
  ---

  ---------------------------------

  ----- ------ - ----- -------------------

  ----------------- -------- -- ------------------------------
-

-------

在这个示例中,我们使用了 password 类型的问题,用于询问用户输入密码。在 Question 的构造函数中,我们使用了 type 属性来设置问题的类型为 password,同时使用 validate 属性来验证用户输入的密码,要求用户输入的密码长度至少为 6 个字符。

答案的检验

在前面的示例中,我们已经提到了 validate 属性了。validate 属性是一个回调函数,用于验证用户输入的答案是否符合要求。如果答案无效,那么返回一个错误信息;如果答案有效,那么返回 true

下面,我们举个例子。在这个例子中,我们要求用户输入一个字符串,要求字符串长度要大于等于 6 个字符。如果用户的输入字符串长度小于 6,那么会提示错误信息,要求用户重新输入。

-- -------------------- ---- -------
----- --------- - -------------------------

----- -------- ------ -
  ----- --------- - --- --------------------
    ----- ------- ----- - ---------
    ----- --------
    --------- ------- -- -
      -- ------------- - -- -
        ------ ---- ------ ------ -- -- ----- - -------------
      -
      ------ -----
    --
  ---

  ----------------------------------

  ----- ------ - ----- -------------------

  ----------------- ------ -- -------------------------------
-

-------

需要注意的是,如果用户输入的答案无效,那么 cli-questions 不会返回任何值,而是会提示用户重新输入。如果用户连续三次输入无效的答案,那么程序将会退出(或抛出异常)。

多个问题的组合

在实际的应用中,我们可能需要问多个问题来获取多个答案。在 cli-questions 中,我们可以使用 addQuestions() 方法来添加多个问题。cli-questions 会按照添加问题的顺序依次显示问题。

下面,我们举个例子,让用户依次输入姓名、年龄和性别。

-- -------------------- ---- -------
----- --------- - -------------------------

----- -------- ------ -
  ----- ---- - --- --------------------
    ----- ----- -- ---- -------
    ----- --------
  ---
  ----- --- - --- --------------------
    ----- ---- --- --- ------
    ----- ---------
  ---
  ----- ------ - --- --------------------
    ----- ----- -- ---- ---------
    ----- -------
    -------- -
      -------
      ---------
    --
  ---

  ---------------------------- ---- --------

  ----- ------ - ----- -------------------

  ------------------ ----------------------- --- --- --------------------- ----- --- --- ----------------------------
-

-------

在这个示例中,我们依次添加了三个问题,然后使用 prompt() 方法来一次性获取用户的所有答案。需要注意的是,cli-questions 会按照问题的添加顺序逐个显示问题,并且不会跳过任何一个问题。

按钮

有时候,我们需要在问题中添加按钮,以供用户点击。在 cli-questions 中,我们可以使用 buttons 属性来添加按钮。

下面,我们举个例子,让用户通过按钮来选择操作。

-- -------------------- ---- -------
----- --------- - -------------------------

----- -------- ------ -
  ----- -- - --- --------------------
    ----- ----- -- --- ---- -- -----
    ----- ---------
    -------- -
      -
        --- --------
        ----- ------ --- ------
      --
      -
        --- --------
        ----- ------ --- ------
      --
      -
        --- -------
        ----- ----- --- ------
      --
    --
  ---

  ---------------------------

  ----- ------ - ----- -------------------

  ----------------- --------- -- ------------------------
-

-------

在这个示例中,我们创建了一个 button 类型的问题,用于让用户选择操作。在 Question 的构造函数中,我们使用了 buttons 属性来设置问题的按钮,包括按钮的 id 和文本。可以通过 result[op.symbol] 获取用户选择的按钮。需要注意的是,在显示按钮时,cli-questions 将不支持鼠标交互,用户只能使用键盘来选择按钮。如果你需要支持鼠标交互,可以考虑使用其它库,比如 Inquirer。

高级用法

在 cli-questions 中,还有一些高级用法,当你遇到一些更为复杂的需求时,可以进行使用。

自定义问题类型

cli-questions 的每个问题都对应了一个问题类型。对于每个问题类型,cli-questions 内部都有一个对应的实现。但是,如果你对于某个问题类型的实现不满意,你也可以自定义一个问题类型。你可以继承 BaseQuestion 类,并重写其中的一些方法(如 ask()validate() 等),从而实现自己的问题类型。

-- -------------------- ---- -------
----- --------- - -------------------------

----- ---------- ------- ---------------------- -
  ------------------- -
    --------------
    --------- - -----
  -

  ----- ----- -
    ----------------- -- -- ------------
    ------ ----- ------------
  -

  ----- --------------- -
    -- ------ --- -------- -
      ------ -----
    -
    ------ ------
  -
-

----- -------- ------ -
  ----- ---------- - --- ------------
    ----- ----- -- ---- -------
    ----- -----
  ---

  -----------------------------------

  ----- ------ - ----- -------------------

  ------------------ --------------------------------
-

-------

在这个例子中,我们通过继承 BaseQuestion 类,创建了一个名为 MyQuestion 的问题类型。在 MyQuestion 中,我们重写了 ask()validate() 方法,实现了自己的问题类型。需要注意的是,在 MyQuestion 的构造函数中,我们设置了自己的问题类型为 my

自定义样式

在 cli-questions 中,我们可以通过 setTheme() 方法来设置用户界面的样式。cli-questions 提供了一些默认样式供使用,你也可以自己定义样式。

下面,我们使用 setTheme() 方法来设置问题的相关样式。

-- -------------------- ---- -------
----- --------- - -------------------------

----- -------- ------ -
  ----- ---- - --- --------------------
    ----- ----- -- ---- -------
    ----- --------
  ---

  -----------------------------

  --------------------
    --------- ----------
    ------- ---------
  ---

  ----- ------ - ----- -------------------

  ------------------ --------------------------
-

-------

在这个示例中,我们设置了问题文本的颜色为 magenta,答案文本的颜色为 yellow

总结

在本文中,我们介绍了 npm 包 cli-questions 的使用方法。通过本文的介绍,我们了解了如何:

  • 安装 cli-questions
  • 使用 Question 类定义问题
  • 使用 addQuestions()prompt() 方法管理和启动问题
  • 定义多种问题类型
  • 自定义问题类型和样式
  • ...

cli-questions 可以帮助我们方便地创建命令行程序。它提供了非常灵活的接口和丰富的功能,能满足各种不同的用途。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60055c0d81e8991b448d9aea

纠错
反馈