那些制作CLI可能用到的轮子

开始之前先要了解npm的bin用法。
 
 “bin”: {
 
   “init”: “index.js”
 
 }
 
执行npm install -g就在全局安装了init命令,在CMD里就可以执行init。
 
执行之后,由于在我本机目前默认是由VS Code打开JavaScript文件,所以效果并不是执行代码(这个问题下文有继续,千万别走开,有个坑)。从上面日志打印可以看出,实际上Node.js相当于建立了一个快捷方式,init指向安装到全局模块的该工程的index.js,而init是被加入了到环境变量PATH可以直接执行。
 
也可以使用npm link直接将index.js链接到PATH里,但先要npm uninstall -g卸载一下,否则会报重复了的错误。
 
现在正式开始观赏轮子,以下排名不分先后。
 
command.js
 
command.js可以和刚才bin生成的全局命令一起配合使用,有一个优势是它居然还有中文文档,虽然E文对我来说不是难事,但是中文的还是读起来快多了。
 
 const { program } = require(”commander”);
 
 ​
 
 program
 
   .version(”0.0.1″)
 
   .arguments(”<file>”)
 
   .description(’Login Module’)
 
   .option(”-u, –username <username>”, “The user to authenticate as”)
 
   .option(”-p, –password <password>”, “The user’s password”)
 
   .action(function (file) {
 
     console.log(program.opts());
 
     console.log(file);
 
   })
 
   .parse(process.argv);
 
一开始使用全局命令不能接受参数而直接使用Node.js执行是可以的。
 
后来找了下,原来主入口文件开头的#! /usr/bin/env node是必须的,加入后变为
 
 #! /usr/bin/env node 
 
 const { program } = require(”commander”);
 
 ​
 
 program
 
   .version(”0.0.1″)
 
   .arguments(”<file>”)
 
   .description(”Login Module”)
 
   .option(”-u, –username <username>”, “The user to authenticate as”)
 
   .option(”-p, –password <password>”, “The user’s password”)
 
   .action(function (file) {
 
     console.log(program.opts());
 
     console.log(file);
 
   })
 
   .parse(process.argv);
 
再次执行(有可能需要重新npm [un]install -g或者npm [un]link),这次OK了
 
arguments里带<>的参数表示是必须的,如果缺失,就不能继续进行。
 
参数里要定义必填项使用。requiredOption,比如program.requiredOption(’-c, –cheese <type>’, ‘pizza must have cheese’);。
 
commander.js根据参数也自动帮你生成了帮助命令init –help
 
更详细的用法请参考官方文档。
 
svg-term-cli
 
svg-term-cli用来生成ascii码动画的SVG文件。它需要全局安装
 
 npm install -g svg-term-cli
 
现在从https://asciinema.org/a/113643上生成SVG动图
 
 svg-term –cast 113643 –out examples/parrot.svg –window –no-cursor –from=4500
 
结束后会在examples下生成一个parrot.svg的文件,打开这个文件看看,太浪了
 
progress
 
progress用来生成一个等待进度条。
 
 var ProgressBar = require(”progress”);
 
 ​
 
 var bar = new ProgressBar(”:bar”, { total: 40 });
 
 var timer = setInterval(function () {
 
   bar.tick();
 
   if (bar.complete) {
 
     console.log(”\ncomplete\n”);
 
     clearInterval(timer);
 
   }
 
 }, 1000);
 
生成如下的进度条
 
我们常见的下载进度展示,就可以用它来实现
 
ora
 
对于不确定的进度情况,就可以使用ora了。它就是那种爱的魔力转圈圈的样式。
 
 const ora = require(”ora”);
 
 ​
 
 const spinner = ora(”Loading unicorns”)。start();
 
 ​
 
 setTimeout(() => {
 
   spinner.color = “yellow”;
 
   spinner.text = “Loading rainbows”;
 
 }, 1000);
 
 setTimeout(() => {
 
   spinner.fail();
 
 }, 3000);

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h64081.shtml

张贴在3