加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码门户网 (https://www.92codes.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

详解NodeJS和命令行程序

发布时间:2019-04-18 02:08:13 所属栏目:教程 来源:刘观宇
导读:副标题#e# 源起 植根于Unix系统环境下的程序,很多都把贯彻Unix系统设计的哲学作为一种追求。Unix系统管道机制的发明者Douglas McIlroy把Unix哲学总结为三点: 专注做一件事,并做到极致。 程序协同工作。 面向通用接口,如文本数据流。 随着Unix/Linux系统

用户的每一个输入,都会放置在program对应option长名的字段的驼峰形式上,如果没有提供长名,则放在短名字段上。上例中,如使用: testcommander -p 111 -P 222 -b 333则依次存储在program的peppers、pineapple和bbqSauce上。

同时,commander提供多种验证方式,如正则表达式:

  1. program.option('-s --size <size>', 'Pizza size', /^(large|medium|small)$/i, 'medium') 

则指定只能输入特定的值。

同时,commander提供一个方案,允许用户设置子命令。commander称之为Git风格的子命令。

  1. var program = require('commander'); 
  2.  
  3. program 
  4.   .version('0.1.0') 
  5.   .command('install [name]', 'install one or more packages') 
  6.   .command('search [query]', 'search with optional query') 
  7.   .command('list', 'list packages installed', {isDefault: true}) 
  8.   .parse(process.argv); 

这个例子中,假设命令行名字为pm,则当用户输入pm-install、pm-search或pm-list时候,commander会尝试在入口文件的同一级目录找到install、search或list,并交给这个文件去执行。

2. 进度条 progress

在编写web程序时候,大家经常会展示一个进度条。用以缓解用户在等待时候的焦虑。其实在命令行程序中也会有这种交互方式。比如wget就会在下载过程中给出进度提示。

在NodeJS中也有这样的效果可以使用。这就是progress包。下面的代码,运行结果是下载CentOS安装盘。在下载之中,会实时打印进度:

  1. const ProgressBar = require("progress") 
  2. const request = require("request") 
  3. const progress = require("request-progress") 
  4. const fs = require("fs") 
  5.  
  6. const download = (url, headers, target, totalSize) => { 
  7.     let percent = 0 
  8.  
  9.     const bar = new ProgressBar('下载中: ├:bar┤ 完成:percent 预估完成时间:eta秒 用时:elapseds', { 
  10.         total: 100, 
  11.         complete: "█", 
  12.         incomplete: "─", 
  13.         width: 60 
  14.     }) 
  15.  
  16.     let opt = { 
  17.         headers, 
  18.         url: url 
  19.     } 
  20.  
  21.     return new Promise((resolve, reject) => { 
  22.         progress(request.get(opt)) 
  23.             .on('progress', function (state) { 
  24.                 let progressFix = ((state.percent) * 100).toFixed(2) 
  25.                 delta = progressFix - percent 
  26.                 bar.tick(delta) 
  27.                 percent = progressFix 
  28.             }) 
  29.             .on("error", () => { 
  30.                 return reject() 
  31.             }) 
  32.             .on('end', () => { 
  33.                 bar.tick(100 - percent) 
  34.                 console.log('n') 
  35.                 return resolve(target) 
  36.             }) 
  37.             .pipe(fs.createWriteStream(target)); 
  38.     }) 
  39.  
  40. const foo = { 
  41.     getHeaders: () => { 
  42.         const headers = { 
  43.             'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
  44.             'Accept-Charset': 'UTF-8,*;q=0.5', 
  45.             'Accept-Encoding': 'gzip,deflate,sdch', 
  46.             'Accept-Language': 'en-US,en;q=0.8', 
  47.             'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0' 
  48.         } 
  49.  
  50.         return Object.assign({}, headers) 
  51.     }, 
  52.  
  53.     download: function (url, target, totalSize){ 
  54.         let headers = this.getHeaders() 
  55.         headers = Object.assign(headers) 
  56.  
  57.         download(url, headers, target, totalSize) 
  58.     } 
  59.  
  60.  
  61. foo.download("http://mirrors.cmich.edu/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso", 
  62.     "CentOS-7-x86_64-DVD-1810.iso", 4508876.8 
  63.     ) 

(编辑:源码门户网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读