Inquirer.js試圖為NodeJs做一個(gè)可嵌入式的美觀的命令行界面。如下圖:
它是非常容易去處理以下幾種事情的:
- 提供錯(cuò)誤回調(diào)
- 詢(xún)問(wèn)操作者問(wèn)題
- 獲取并解析用戶(hù)輸入
- 檢測(cè)用戶(hù)回答是否合法
- 管理多層級(jí)的提示
note: Inquirer.js僅僅給用戶(hù)提供了一個(gè)漂亮的界面和提出問(wèn)題流的方式。假如說(shuō)你正在尋找的是完全成熟的命令行調(diào)試程序,那么我推薦你去看看commander, vorpal,args。
安裝
npm install inquirer
編寫(xiě)一個(gè)小demo——index.js
var inquirer = require('inquirer')
inquirer.prompt([ {
type: 'confirm',
name: 'test',
message: 'Are you handsome?',
default: true
}]).then((answers) => { console.log('結(jié)果為:') console.log(answers)})
運(yùn)行一波
node index.js
輸出
結(jié)果為:{ test: false}
從這個(gè)小demo可以看出來(lái),通過(guò)Inquirer的prompt方法就可以在命令行中對(duì)用戶(hù)提出問(wèn)題。
Questions —— 問(wèn)題
問(wèn)題的標(biāo)題和默認(rèn)結(jié)果值都是可以預(yù)設(shè)的。而在回答完成后會(huì)返回一個(gè)Promise對(duì)象,在其then方法中可以獲取到用戶(hù)輸入的所有回答。其中傳遞給prompt方法的參數(shù)為一個(gè)question問(wèn)題數(shù)組,數(shù)組中的每個(gè)元素都是一個(gè)問(wèn)題對(duì)象。其包含的屬性共有以下幾種:
{
type: String, // 表示提問(wèn)的類(lèi)型,下文會(huì)單獨(dú)解釋 name: String, // 在最后獲取到的answers回答對(duì)象中,作為當(dāng)前這個(gè)問(wèn)題的鍵
message: String|Function, // 打印出來(lái)的問(wèn)題標(biāo)題,如果為函數(shù)的話(huà)
default: String|Number|Array|Function, // 用戶(hù)不輸入回答時(shí),問(wèn)題的默認(rèn)值?;蛘呤褂煤瘮?shù)來(lái)return一個(gè)默認(rèn)值。假如為函數(shù)時(shí),函數(shù)第一個(gè)參數(shù)為當(dāng)前問(wèn)題的輸入答案。
choices: Array|Function, // 給出一個(gè)選擇的列表,假如是一個(gè)函數(shù)的話(huà),第一個(gè)參數(shù)為當(dāng)前問(wèn)題的輸入答案。為數(shù)組時(shí),數(shù)組的每個(gè)元素可以為基本類(lèi)型中的值。
validate: Function, // 接受用戶(hù)輸入,并且當(dāng)值合法時(shí),函數(shù)返回true。當(dāng)函數(shù)返回false時(shí),一個(gè)默認(rèn)的錯(cuò)誤信息會(huì)被提供給用戶(hù)。
filter: Function, // 接受用戶(hù)輸入并且將值轉(zhuǎn)化后返回填充入最后的answers對(duì)象內(nèi)。
when: Function|Boolean, // 接受當(dāng)前用戶(hù)輸入的answers對(duì)象,并且通過(guò)返回true或者false來(lái)決定是否當(dāng)前的問(wèn)題應(yīng)該去問(wèn)。也可以是簡(jiǎn)單類(lèi)型的值。
pageSize: Number, // 改變渲染list,rawlist,expand或者checkbox時(shí)的行數(shù)的長(zhǎng)度。}
其中,default, choices, validate, filter, when
等函數(shù)都能被異步調(diào)用。同時(shí)返回一個(gè)promise或者通過(guò)使用this.async()
函數(shù)來(lái)進(jìn)行回調(diào)獲取最終值。
{
/* 首選使用 promise */
filter: function () { return new Promise(/* etc... */); },
/* 也可以使用 this.async */
validate: function (input) {
// Declare function as asynchronous, and save the done callback
var done = this.async(); // 進(jìn)行異步操作
setTimeout(function () {
if (typeof input !== 'number') { // Pass the return value in the done callback
done('You need to provide a number');
return;
} // Pass the return value in the done callback
done(null, true); }, 3000);
}}
Answers —— 回答
Answers是一個(gè)包含有用戶(hù)客戶(hù)端輸入的每一個(gè)問(wèn)題的答案的對(duì)象鍵:?jiǎn)栴}對(duì)象的name
屬性值:取決于問(wèn)題的類(lèi)型,confirm類(lèi)型為Boolean,Input類(lèi)型為用戶(hù)輸入的字符串,rawlist和list類(lèi)型為選中的值,也為字符串類(lèi)型。
Separator —— 分隔
可以為任意的choices
數(shù)組選項(xiàng)添加分隔,方便在多選項(xiàng)時(shí)劃分選項(xiàng)類(lèi)別
Prompt types —— 問(wèn)題類(lèi)型
List
{type: 'list'}
問(wèn)題對(duì)象中必須有type,name,message,choices
等屬性,同時(shí),default選項(xiàng)必須為默認(rèn)值在choices數(shù)組中的位置索引(Boolean)Raw list
{type: 'rawlist'}
與List類(lèi)型類(lèi)似,不同在于,list打印出來(lái)為無(wú)序列表,而rawlist打印為有序列表Expand
{type: 'expand'}
同樣是生成列表,但是在choices屬性中需要增加一個(gè)屬性:key,這個(gè)屬性用于快速選擇問(wèn)題的答案。類(lèi)似于alias
或者shorthand
的東西。同時(shí)這個(gè)屬性值必須為一個(gè)小寫(xiě)字母Checkbox
{type: 'checkbox'}
其余諸項(xiàng)與list類(lèi)似,主要區(qū)別在于,是以一個(gè)checkbox的形式進(jìn)行選擇。同時(shí)在choices數(shù)組中,帶有checked: true
屬性的選項(xiàng)為默認(rèn)值。Confirm
{type: 'confirm'}
提問(wèn),回答為Y/N。若有default
屬性,則屬性值應(yīng)為Boolean類(lèi)型Input
{type: 'input'}
獲取用戶(hù)輸入字符串Password
{type: 'password'}
與input類(lèi)型類(lèi)似,只是用戶(hù)輸入在命令行中呈現(xiàn)為XXXXEditor
{type: 'editor'}
終端打開(kāi)用戶(hù)默認(rèn)編輯器,如vim,notepad。并將用戶(hù)輸入的文本傳回
支持
下列所有CLI都有非常良好的支持程度。
- Mac OS
- Terminal.app
- iTerm
- Windows:
- ConEmu
- cmd.exe
- Powershell
- Cygwin
- Linux (Ubuntu, openSUSE, Arch Linux, etc):
- gnome-terminal (Terminal GNOME)
- konsole