UNPKG

@jyeontu/progress-bar

Version:

node控制台进度条输出工具

217 lines (198 loc) 7.79 kB
## 说在前面 > 控制台的进度条大家都见得不少了吧?大家都知道控制台的进度条是怎么实现的吗?最近自己在写几个node脚本工具,期间有需要进度展示的一个需求,所以就顺手写了一个可以自定义的进度条插件,可以直接引入并配置使用。 ## 插件效果 ![progressBar.js - node-scripting-tool - Visual Studio Code [管理员] 2022-07-28 10-09-46 00_00_00-00_00_30.gif](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a5a81296907e4f86934c2b85f3fc2fa2~tplv-k3u1fbpfcp-watermark.image?) ## 功能实现 ### 控制台单行输出 这里使用了`single-line-log`来实现控制台的单行输出,`single-line-log`是在控制台(或流)中同一行输出的Node.js模块。在编写进度条或在较长的操作过程中显示状态消息时,此功能非常有用。 - 安装 ```shell npm install single-line-log ``` - 示例代码 ```javascript var log = require('single-line-log').stdout; var timer, i = 0; timer = setInterval(()=>{ log(i++ + ' % loading...'); if (i > 100 ) { clearInterval(timer); log('100% 加载完成'); } },100); ``` ### 控制台输出多彩颜色 这里使用了`chalk`来改变控制台输出颜色,`chalk`是一个颜色插件,可以通过chalk.blue(‘hello world’)来改变文字的颜色,可以通过这个插件让你的在控制台的输出变得花里胡哨。 - 安装 ``` npm install chalk ``` - 示例代码 ```shell const chalk = require('chalk'); console.log(chalk.red('我是红色文字')); console.log(chalk.green('我是绿色文字')); console.log(chalk.yellow('我是黄色文字')); console.log(chalk.yellow.bgGreen('我是背景绿色的黄色文字')); console.log(chalk.yellow.bgWhiteBright('我是背景白色的黄色文字')); console.log(chalk.underline.bgBlue('我有下划线')); console.log(chalk.green( 'I am a green line ' + chalk.blue.underline.bold('with a blue substring') + ' that becomes green again!' )); const error = chalk.bold.red; const warning = chalk.hex('#FFA500'); // Orange color console.log(error('Error!')); console.log(warning('Warning!')); ``` 具体配置可以参考文档:[https://www.npmjs.com/package/chalk](https://www.npmjs.com/package/chalk) ### 进度条效果实现 进度条的效果主要是通过单行输出来实现,我们只需要根据参数来改变进度条的长度和比例数字及提示就可以,这里我们将其封装成一个类。 #### 初始化配置 初始化的时候可以传入配置信息,未传入的配置则为默认配置,具体配置如下 ```javascript constructor(config = {}){ this.initConfig(config); } initConfig(config){ const defaultConfig = { duration: 100, current: 0, block:'█', showNumber:true, tip:{ 0: '努力加载中……', 50:'加载一半啦,不要着急……', 75:'马上就加载完了……', 100:'加载完成' }, color:'blue' }; Object.assign(defaultConfig,config); this.config = defaultConfig; } ``` #### 更新进度条状态 通过传入当前进度,可以修改进度条的状态。 ```javascript run(current){ const {block, duration, tip, color, showNumber} = this.config; let tipList = Object.keys(tip).sort((a,b)=> b-a); let showTip = tip[0]; const step = duration / 100; const len = Math.floor(current / step); for(let i = 0; i < tipList.length; i++){ if(len >= tipList[i]) { showTip = tip[tipList[i]]; break; } } singleRowLog(chalk[color](block.repeat(Math.floor(len / 2)),(showNumber ? (len + '% ') : '') + showTip)); if(len == 100) console.log(''); } ``` ## 插件说明 ### 配置说明 目前的配置项如下,后续可以根据需求继续扩展 ```javascript config = { duration: 100, //总进度数 current: 0, //当前进度 block:'█', showNumber:true, tip:{ 0: '努力加载中……', 50:'加载一半啦,不要着急……', 75:'马上就加载完了……', 100:'加载完成' }, color:'green' } ``` - duration > 总进度数 - current > 当前进度数 - block > 显示块,如下图: ![image.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/25c6ac4839fa4db3b691eae76a56ae1f~tplv-k3u1fbpfcp-watermark.image?) - showNumber > 是否展示当前进度,效果如下图 ![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bbecdc4c9c4c440ba770fe4aa4ca8c94~tplv-k3u1fbpfcp-watermark.image?) - tip > 配置不同进度时的提示语,这里以百分制,如下图: ![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/66677c23b0004f35a92aa6cbf6857327~tplv-k3u1fbpfcp-watermark.image?) ![image.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ca0d6315446f4e559d1a1f9879a796ab~tplv-k3u1fbpfcp-watermark.image?) ![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/63918bd4c9e7495cb0baeac44d7f575e~tplv-k3u1fbpfcp-watermark.image?) ![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/936d1dda74a6462b8831018f49b68b0f~tplv-k3u1fbpfcp-watermark.image?) - color > 进度条及文字颜色,如下图 ![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/48a1b503830642ceb36c197a282ef95b~tplv-k3u1fbpfcp-watermark.image?) ## 使用 ### 1、安装依赖 ```shell npm install @jyeontu/progress-bar ``` ### 2、在代码中引用 - 引入依赖 ```javascript const progressBar = require('@jyeontu/progress-bar'); ``` - 配置信息 ```javascript const config = { duration: 100, current: 0, block:'█', showNumber:true, tip:{ 0: '努力加载中……', 50:'加载一半啦,不要着急……', 75:'马上就加载完了……', 100:'加载完成' }, color:'blue' } ``` - 定时器模拟进度 ```javascript var timer, i = 0; let progressBarC = new progressBar(config); timer = setInterval(()=>{ progressBarC.run(i++); if (i > 100 ) { clearInterval(timer); } },100); ``` ### 3、完整示例代码 ```javascript // const progressBar = require('./progressBar'); const progressBar = require('@jyeontu/progress-bar'); const config = { duration: 100, current: 0, block:'█', showNumber:true, tip:{ 0: '努力加载中……', 50:'加载一半啦,不要着急……', 75:'马上就加载完了……', 100:'加载完成' }, color:'blue' } var timer, i = 0; let progressBarC = new progressBar(config); timer = setInterval(()=>{ progressBarC.run(i++); if (i > 100 ) { clearInterval(timer); } },100); ``` ## 源码地址 [https://gitee.com/zheng_yongtao/node-scripting-tool/tree/master/src/progressBar](https://gitee.com/zheng_yongtao/node-scripting-tool/tree/master/src/progressBar) ## 说在后面 > 🎉这里是[JYeontu](https://link.juejin.cn?target=http%3A%2F%2Fjyeontu.xyz%2FJYeontuBlog%2F%23%2Fhome "https://link.juejin.cn?target=http%3A%2F%2Fjyeontu.xyz%2FJYeontuBlog%2F%23%2Fhome"),喜欢算法,GDCPC打过卡;热爱羽毛球,大运会打过酱油。毕业一年,两年前端开发经验,目前担任H5前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。