描述
- 什么时命令行交互? 在开发程序时有时候需要获得用户的输入,或者给定一个选择列表让用户进行选择。类似前端工程化时创建vue或者react或者vite创建项目时让你选择的一些配置信息。
命令行交互的几种显示方案
- nodejs内置模块实现,模块:readline ,缺点是样式单不灵活,好处就是不用安装因为是内置的。
- 第三方模块实现,模块(需要先安装) readline-sync 该模块提供了输入及列表选择及其他一些功能。,但依然还是样式比较单一。
- 第三方包 模块(需要安装 并且安装指定版本 npm install --save inquirer@^8.0.0) inquirer 该包提供了强大的功能及比较美观的ui。
代码实现
内置模块 readline 实现
function getTerminalInput (prompt) {
return new Promise((resolve, reject) => {
const readline = require('readline').createInterface({
input: process.stdin,
output: process.stdout,
});
readline.question(prompt || 'Input Msg', value => {
resolve(value);
readline.close();
});
})
}
getTerminalInput('you is name: ').then(name => console.log(`is name:${name}`));
- 看看效果
使用第三方包 readline-sync来实现
获得命令行输入
const readlineSync = require("readline-sync")
function getInputVlaue () {
var userName = readlineSync.question('you is name? ');
console.log('Hi ' + userName + '!');
}
getInputVlaue()
列表选择
const readlineSync = require("readline-sync")
function getSelectItem () {
const animals = ["Lion", "Elephant", "Crocodile", "Giraffe", "Hippo"]
const index = readlineSync.keyInSelect(animals, "Which animal?");
console.log("Ok, " + animals[index] + " goes to your room.");
}
getSelectItem()
- 效果如下
类似滑块范围的UI
function getUiStyleInput () {
var MAX = 60,
MIN = 0,
value = 30,
key;
console.log("\n\n" + new Array(20).join(" ") + "按X往前,Z往后, 按空格确定\n");
while (true) {
console.log(
"\x1B[1A\x1B[K|" +
new Array(value + 1).join("-") +
"O" +
new Array(MAX - value + 1).join("-") +
"| " +
value
);
key = readlineSync.keyIn("", { hideEchoBack: true, mask: "", limit: "zx " });
if (key === "z") {
if (value > MIN) {
value--;
}
} else if (key === "x") {
if (value < MAX) {
value++;
}
} else {
break;
}
}
console.log("\nA value the user requested: " + value);
}
getUiStyleInput()
- 效果图
使用inquirer包来实现
const inquirer = require("inquirer")
function getInquirerInput () {
const questions = [
{
type: 'input',
choices: ['www', 'bbb', 'nnn'],
name: 'value',
message: "select item?",
},
];
inquirer.prompt(questions).then(answers => {
console.log(`you select is ${answers.value}`);
});
}
getInquirerInput()
- 这里就不一个个展示效果了,简单看两个效果
- 列表选择效果
- 获得输入
没了