npm 包是 Node.js 生态系统中非常重要的模块,cli-questions 便是其中之一。cli-questions 封装了控制台交互式问题的功能,这对于 Node.js 命令行工具来说非常有用。
本文将介绍 cli-questions 的使用方法,并提供示例代码。我们将详细地介绍该库的核心特点和使用技巧,以帮助您更轻松地使用这个库来构建强大的命令行程序。
安装
使用 npm 安装 cli-questions,命令如下:
npm install cli-questions --save
基础用法
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