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