Node.js 中的交互式命令行:玩轉(zhuǎn) Inquirer.js
嘿,會Node.js 的小伙伴們!今天咱們來聊聊一個超級實用的 Node.js 庫——inquirer.js。如果你想要讓你的命令行工具變得交互式,那這個庫絕對是你的不二之選。它能讓你輕松創(chuàng)建出美觀、易用的文本界面,讓用戶的輸入體驗更上一層樓。
安裝 Inquirer.js
安裝起來也是分分鐘的事,用 npm 或 yarn 都可以:
npm install inquirer
或者
yarn add inquirer
快速上手
安裝完了,咱們就可以開始玩耍了。先來個簡單的示例,看看 inquirer.js 是怎么用的:
const inquirer = require('inquirer');
const questions = [
{
type: 'input',
name: 'username',
message: '嘿,你叫啥呀?',
},
{
type: 'password',
name: 'password',
message: '密碼悄悄告訴我:',
},
];
inquirer.prompt(questions).then(answers => {
console.log('用戶名:', answers.username);
console.log('密碼:', answers.password);
});
這段代碼里,咱們定義了兩個問題:用戶名和密碼。type 參數(shù)告訴 inquirer.js 我們想要的輸入類型,name 是問題的答案名稱,message 是咱們要問用戶的問題。
豐富的問題類型
inquirer.js 提供了一大堆問題類型,滿足各種不同的需求:
輸入(Input)
就是普通的文本輸入。
{
type: 'input',
name: 'name',
message: '你的名字是啥?',
}
密碼(Password)
和輸入一樣,但輸入的內(nèi)容不會顯示出來。
{
type: 'password',
name: 'password',
message: '密碼多少呀?',
}
確認(Confirm)
用戶可以通過輸入 y 或 n 來回答“是”或“否”。
{
type: 'confirm',
name: 'continue',
message: '咱們繼續(xù)嗎?',
}
列表(List)
讓用戶從列表里挑一個。
{
type: 'list',
name: 'theme',
message: '選個主題唄:',
choices: ['亮堂的', '暗夜的', '自定義的'],
}
下拉列表(Expand)
下拉列表,用戶可以用方向鍵選擇多個選項。
{
type: 'expand',
name: 'abilities',
message: '超能力選哪個?',
choices: [
{
key: 'p',
name: '力大無窮',
value: 'power',
},
{
key: 's',
name: '快如閃電',
value: 'speed',
},
// 更多選項...
],
}
編輯器(Editor)
這個厲害了,讓用戶在外部編輯器里寫東西。
{
type: 'editor',
name: 'bio',
message: '來,寫個自我介紹:',
}
處理用戶的回答
inquirer.prompt() 方法返回一個 Promise,用戶一提交答案,Promise 就會帶著所有答案的對象來解析。你可以拿這些答案去做各種酷炫的事。
inquirer.prompt(questions).then(answers => {
// 用 answers 對象干點啥
console.log('用戶名:', answers.username);
});
動態(tài)提問
有時候,你可能想問的問題取決于用戶之前的回答。inquirer.js 支持這種智能模式,用 when 屬性就能搞定。
const questions = [
{
type: 'confirm',
name: 'hasAccount',
message: '有賬戶不?',
},
{
type: 'input',
name: 'username',
message: '用戶名是啥?',
when: answers => answers.hasAccount
},
{
type: 'input',
name: 'email',
message: '郵箱地址呢?',
when: answers => !answers.hasAccount
}
];
在這個例子里,用戶名的輸入框會不會顯示,取決于用戶對 hasAccount 的回答。
裝飾你的命令行
inquirer.js 還讓你能通過 prefix 屬性來加個前綴,或者用 transformer 函數(shù)來美化顯示給用戶的答案。
{
type: 'input',
name: 'name',
message: '叫啥?',
prefix: '稱呼:',
transformer: input => `你好啊,${input}!`,
}
和其他 Node.js 工具一起玩
inquirer.js 可以和其他 Node.js 工具一起用,比如和 cross-spawn 模塊搭配,根據(jù)用戶的回答執(zhí)行不同的命令。
const { spawn } = require('cross-spawn');
inquirer.prompt([
{
type: 'list',
name: 'action',
message: '想干點啥?',
choices: ['裝點依賴', '跑個測試', '撤了'],
},
]).then(answers => {
const command = answers.action === '裝點依賴' ? 'npm install' : 'npm test';
spawn.sync(command, [], { stdio: 'inherit' });
});
總結(jié)
inquirer.js 是一個功能超群的庫,能讓你的命令行工具變得既強大又用戶友好。無論是簡單的數(shù)據(jù)收集,還是復(fù)雜的多步驟交互,inquirer.js 都能幫你搞定。今天咱們學(xué)了 inquirer.js 的基本用法,現(xiàn)在你應(yīng)該對這個庫有個大概的了解了。