在上一篇中我们用了10分钟实现了一个完整的古诗词命令行工具,本章中我们主要简绍2个命令行工具开发中常用的库,整个代码大概用时20分钟。
修改命令行颜色
第一个简绍的库就是‘colors-cli’,他支持修改打印出来的文字的样式。
首先安装一下这个依赖npm install colors-cli,新建一个文件test-color.js,测试一下它的代码:
1 | var color = require('colors-cli/safe') |
引入color库的时候可以使用var color = require('colors-cli/safe'),也可以使用var color = require('colors-cli'),推荐使用前者,因为前者可以支持链式调用,使用起来更方便。上面运行结果如下:

他是怎么实现的呢?其实是把文字用特殊符号包了一层,命令行对这种特殊符号会处理成样式,就比如color.red.bold('Error!')其实最后会返回一个字符串'[1m[31m[31mError
代码还是在可以控制的行数范围内,上述代码中4~34行,是yargs的处理,也是通用的一种写法,这里面有2个属性比较特殊一个是help另一个是version,从下面的结果我们可以看到,当输入这两个的时候都会阻止代码的执行,并直接返回相应的信息,如运行node index -h会返回帮助信息、node index -v会返回版本信息。在代码中我们可以使用argv.ps、argv.as、argv.os等(其实就是option函数的第一个值)来获取参数的值。getColorMethod运行使用英文的点或者逗号来拆分以添加多个样式。
代码优化
上述代码中getColorMethod方法其实可以抽取出去,另外color库并不是支持输入任何参数,比如你输入node index --as=123就会报错,因为123并不是color所支持的样式,所以我们有必要对颜色相关的操作抽取成一个文件,另外检测一下color库是否支持这个颜色,不支持的话给出有好地提示,现在新建color-util.js文件。代码如下:
1 | const color = require('colors-cli/safe') |
请求接口的地方我们也可以封装成一个方法,这样可以减少耦合,另外也可以支持模块直接引入(直接使用require引入)。新建random-poem.js文件,代码如下:
1 | const axios = require('axios'); |
因为网络请求是异步的,所以需要使用回调或者Promise来处理,我们这里就使用Promise吧。此时还需要修改一下package.json文件,添加main字段,该字段是用来告诉直接模块引入的时候引入哪个文件。
1 | { |
此时需要注意第5行代码。最后修改index.js文件,使用这些封装的方法:
1 |
|
测试一下输入不支持的情况,你会发现提示的信息已经很友好了:

最后把多余的test-color.js文件删除了就可以提交了。
就这样我们把一个功能完善的古诗词命令行工具做完了,需要注意一点再次提交的时候,也就是运行npm publish前,需要修改一下package.json中的version字段,而且必须大于当前的版本号,建议使用npm version 1.0.1这样的命令去修改,因为该命令会顺带把package-lock.json文件中的版本号也改了。