在前端开发中,有时我们需要与用户进行命令行交互,获取用户输入并进行相应的处理。而处理命令行交互过程最常用的方式则是使用 Node.js 提供的 readline 模块。但 readline 模块需要自行封装一些方法,稍有不慎就会导致代码冗余、维护不便等问题。因此,本文向大家介绍一款优秀的第三方 npm 包——zach-readline,它能够简化 readline 模块的使用,提升交互效率,下面为大家介绍其使用教程。
1. 安装
使用 npm 安装 zach-readline,命令如下:
npm install --save zach-readline
2. 使用
首先,我们需要引入 zach-readline 包:
const { ZachReadline } = require('zach-readline'); const zachReadline = new ZachReadline(process.stdin, process.stdout);
在上面的代码中,我们传入了 process.stdin 和 process.stdout 作为 zach-readline 的实例化参数,因为用户的输入数据都是通过 stdin 输入,而要输出数据则需要使用 stdout。
接着,我们可以开始使用 zach-readline 实现命令行交互了。例如输入以下代码:
zachReadline.question('What is your name?').then(answer => { console.log(`Hi ${answer}!`); });
这段代码表示向用户问一个问题,获取用户输入,并输出回答。其中,zachReadline.question
方法就是实现交互的关键。该方法的参数为一个字符串,表示交互时呈现给用户的问题。然后,我们将该方法的执行结果用 Promise 的方式进行封装,当用户完成输入并按下回车键时,该 Promise 才会被 resolve,然后我们就可以拿到用户的输入了,并进行相应的处理,例如输出问候语,如上面代码所示。
除了支持 question 方法,zach-readline 还提供了一些其他的实用方法,如 password、confirm、select 等,以下是它们的介绍。
3. 其他实用方法
3.1 password 方法
该方法用于获取用户输入的密码,不会将用户输入显示在命令行窗口中。
zachReadline.password('Please input your password').then(answer => { console.log(`Your password is ${answer}`); });
通过以上代码,我们会向用户要求输入密码,当用户输入完毕后回车,我们可以拿到用户的密码了,并进行相应的处理。
3.2 confirm 方法
该方法用于获取用户的简单确认,如“确定要删除吗?”等。confirm 方法的参数为一个字符串,表示要进行确认的问题。
zachReadline.confirm('Are you sure to delete?').then(answer => { if (answer === 'yes') { console.log('Delete success'); } else { console.log('Cancel delete'); } });
在上面的代码中,当用户输入“yes”时,我们会输出“Delete success”,反之则输出“Cancel delete”。
3.3 select 方法
该方法用于让用户从预定义的选项中进行选择,例如要选择一个算法的类型等。该方法的第一个参数为一个数组,包含所有可选项,第二个参数为一个字符串,表示要进行的选择。
const options = ['deep learning', 'graph theory', 'computer vision']; zachReadline.select(options, 'Please choose algorithm type').then(answer => { console.log(`You choose '${options[answer]}'`); });
以上代码表示让用户从 deep learning、graph theory 和 computer vision 中选择一个算法类型,并输出用户所选的结果。
4. 总结
通过以上介绍,我们已经初步了解了 zach-readline 的使用方法,它为我们在 Node.js 项目中实现命令行交互提供了方便。在进行实际开发时,我们还可以灵活运用该包提供的不同方法,结合自己的实际需求,更加高效地进行开发,提高开发效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60055ec181e8991b448dc827