NodeJs交互式命令行工具Inquirer.js-開(kāi)箱指南

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)試程序,那么我推薦你去看看commandervorpal,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)為XXXX

  • Editor
    {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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,401評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,069評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,873評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,635評(píng)論 6 408
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,128評(píng)論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,365評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,881評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,733評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,935評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,172評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,582評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,821評(píng)論 1 282
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,595評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,908評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,781評(píng)論 18 139
  • 下載安裝搭建環(huán)境 可以選npm安裝,或者簡(jiǎn)單下載一個(gè)開(kāi)發(fā)版的vue.js文件 瀏覽器打開(kāi)加載有vue的文檔時(shí),控制...
    冥冥2017閱讀 6,072評(píng)論 0 42
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,712評(píng)論 18 399
  • 本期導(dǎo)讀:本期高級(jí)測(cè)試工程師丁晶晶帶來(lái)基于RUNTIME的自動(dòng)化測(cè)試設(shè)想,王思虹分享自己作為測(cè)試新人對(duì)自動(dòng)化的探索...
    賀小七閱讀 637評(píng)論 0 0
  • 走絲細(xì)雨灼蝕著轟鳴的割草機(jī) 目睹你穿行在月夜的風(fēng)塵中 傾嗅著青汁特有的氣息 與你口中的腥味截然不同 了然一生的渴愿...
    Mr_十三閱讀 158評(píng)論 0 0