NodeJs交互式命令行工具Inquirer.js-開箱指南

Inquirer.js試圖為NodeJs做一個可嵌入式的美觀的命令行界面。如下圖:


它是非常容易去處理以下幾種事情的:

  • 提供錯誤回調
  • 詢問操作者問題
  • 獲取并解析用戶輸入
  • 檢測用戶回答是否合法
  • 管理多層級的提示

note: Inquirer.js僅僅給用戶提供了一個漂亮的界面和提出問題流的方式。假如說你正在尋找的是完全成熟的命令行調試程序,那么我推薦你去看看commandervorpalargs

安裝

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類型類似,只是用戶輸入在命令行中呈現為XXXX

  • Editor
    {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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • 下載安裝搭建環境 可以選npm安裝,或者簡單下載一個開發版的vue.js文件 瀏覽器打開加載有vue的文檔時,控制...
    冥冥2017閱讀 6,078評論 0 42
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,740評論 18 399
  • 本期導讀:本期高級測試工程師丁晶晶帶來基于RUNTIME的自動化測試設想,王思虹分享自己作為測試新人對自動化的探索...
    賀小七閱讀 642評論 0 0
  • 走絲細雨灼蝕著轟鳴的割草機 目睹你穿行在月夜的風塵中 傾嗅著青汁特有的氣息 與你口中的腥味截然不同 了然一生的渴愿...
    Mr_十三閱讀 160評論 0 0