1、简介
如何制作一个Node.js CLI程序使用内置的readline Node.js模块进行交互
如何制作一个节点js CLI程序交互?
Node.js 从版本7起开始提供了readline模块来执行以下操作:从可读流(如process.stdin流)中获取输入,该流在Node执行期间。js程序是终端输入,一次一行。
1. const readline = require('readline').createInterface({ 2. input: process.stdin, 3. output: process.stdout, 4. }); 5. readline.question(`What's your name?`, name => { 6. console.log(`Hi ${name}!`); 7. readline.close(); 8. });
这段代码询问用户的名字,一旦输入了文本,用户按下回车键,我们就发送一个问候语。
question() 方法显示第一个参数(一个问题)并等待用户输入。一旦按下enter,它就会调用回调函数。
在这个回调函数中,我们关闭readline接口。
readline 提供了几种其他方法,请在上面链接的包文档中查看它们。
如果需要输入密码,最好不要回显,而是显示*符号。
最简单的方法是使用readline-sync包,它在API方面非常相似,并且开箱即用。
2、readlineSync
同步读取行,用于交互式运行,以便通过控制台(TTY)与用户进行对话。
1. import readlineSync from 'readline-sync' 2. // Wait for user's response. 3. var userName = readlineSync.question('readline-sync ==> 你的名字? '); 4. console.log('Hi ' + userName + '!');
3、列表选择一个项目:
1. var readlineSync = require("readline-sync"), 2. animals = ["Lion", "Elephant", "Crocodile", "Giraffe", "Hippo"], 3. index = readlineSync.keyInSelect(animals, "Which animal?"); 4. console.log("Ok, " + animals[index] + " goes to your room.");
4、类似滑块范围的UI:
(按Z键向左滑动,按X键向右滑动,按空格键退出)
1. var readlineSync = require("readline-sync"), 2. MAX = 60, 3. MIN = 0, 4. value = 30, 5. key; 6. console.log("\n\n" + new Array(20).join(" ") + "[Z] <- -> [X] FIX: [SPACE]\n"); 7. while (true) { 8. console.log( 9. "\x1B[1A\x1B[K|" + 10. new Array(value + 1).join("-") + 11. "O" + 12. new Array(MAX - value + 1).join("-") + 13. "| " + 14. value 15. ); 16. key = readlineSync.keyIn("", { hideEchoBack: true, mask: "", limit: "zx " }); 17. if (key === "z") { 18. if (value > MIN) { 19. value--; 20. } 21. } else if (key === "x") { 22. if (value < MAX) { 23. value++; 24. } 25. } else { 26. break; 27. } 28. } 29. console.log("\nA value the user requested: " + value);
Inquirer.js包.提供了一个更完整和抽象的解决方案。
Inquirer.js包地址:
https://github.com/SBoudrias/Inquirer.js
你可以使用npm install inquirer安装它,然后你可以像这样复制上面的代码:
1. import inquirer from 'inquirer'; 2. const questions = [ 3. { 4. type: 'input', 5. name: 'name', 6. message: "你的名字?", 7. }, 8. ]; 9. 10. inquirer.prompt(questions).then(answers => { 11. console.log(`Hi ${answers.name}!`); 12. });
Inquirer.js允许你做很多事情,比如询问多个选择,单选按钮,确认等等。
了解所有的替代方案都是值得的,尤其是Node.js 提供的内置方案。但如果您计划将CLI输入提升到下一个级别,则可以使用Inquirer.js是最佳选择。
功能和readline-sync包类似,但是功能更加强大,具体使用可以参考官网。