天天看点

Nodejs-cli 填坑记

真的是玩玩没想到,一个cli竟然坑了我这么久,想当年写Python命令行工具的时候,哪有这么麻烦?随随便便写几下,添加个批处理命令脚本就搞定了。怎么Nodejs写一个就这么不顺利呢?

吐槽归吐槽,当我成功的写出来一个cli版本的工具之后,我才发现,是我错了。nodejs-cli其实真的是很方便,也很简单。

Nodejs-cli 填坑记

秉承分享知识的原则,在此记录一下。

<a href="#%E5%86%99%E5%9C%A8%E5%89%8D%E9%9D%A2" target="_blank">写在前面</a>

<a href="#%E6%AE%B5%E5%AD%90%E6%89%8B" target="_blank">段子手</a>

<a href="#%E5%A4%96%E9%83%A8%E6%A8%A1%E5%9D%97" target="_blank">外部模块</a>

<a href="#events%E4%BA%8B%E4%BB%B6%E5%8F%91%E5%B0%84%E6%8E%A5%E6%94%B6" target="_blank">events事件发射接收</a>

<a href="#%E5%AE%8C%E6%95%B4%E4%BB%A3%E7%A0%81" target="_blank">完整代码</a>

<a href="#%E5%AE%9E%E7%8E%B0%E6%95%88%E6%9E%9C" target="_blank">实现效果</a>

<a href="#%E7%BF%BB%E8%AF%91%E5%AE%98" target="_blank">翻译官</a>

<a href="#%E5%A4%96%E9%83%A8%E6%A8%A1%E5%9D%97-1" target="_blank">外部模块</a>

<a href="#%E9%83%A8%E5%88%86%E4%BB%A3%E7%A0%81%E9%87%8A%E4%B9%89" target="_blank">部分代码释义</a>

<a href="#%E5%AE%8C%E6%95%B4%E4%BB%A3%E7%A0%81-1" target="_blank">完整代码</a>

<a href="#%E6%95%88%E6%9E%9C%E6%BC%94%E7%A4%BA" target="_blank">效果演示</a>

<a href="#cli%E5%B7%A5%E5%85%B7" target="_blank">cli工具</a>

<a href="#%E6%A0%87%E9%85%8D%E9%9C%80%E6%B1%82" target="_blank">标配需求</a>

<a href="#%E4%BF%AE%E6%94%B9%E9%85%8D%E7%BD%AE" target="_blank">修改配置</a>

<a href="#%E6%98%93%E9%94%99%E7%82%B9%E5%89%96%E6%9E%90" target="_blank">易错点剖析</a>

<a href="#%E6%80%BB%E7%BB%93" target="_blank">总结</a>

这篇文章严格来说不能算是一片技术性的文章,没什么难点。有的只是一些好玩的小工具。对于Nodejs新人来说,鉴于没什么难度,倒是可以适当的练练手。因此,如果你是Nodejs高手的话,还是不要在此浪费时间了。

言简意赅点,就是一个爬取糗事百科的段子的小助手,一个简单的不能再简单的爬虫。姑且称之为爬虫吧。

这里需要用到一点点的第三方模块。虽然实现相同的功能,标准模块也可以满足,但是有轮子的话,何必自己再去造一个呢(除非你能做的更好)。

superagent: 类似于Python里面的requests,挺好用的。

cheerio: 类似于Python里面的BeautifulSoup,但是其使用的是JQuery的选择器语法,所以对前端比较熟悉的话,用起来会非常的顺手。

cli-color: 如果你想在命令行里面打印出彩色的字符,那么用它就对了。

在Nodejs中events模块可谓是核心了。异步编程要是没有它,那就算是完了。这里为了使用而使用,我也简单的用了一下。

具体的思路是:

每一张网页解析完毕后,发射一个pageover事件,来更新解析列表。

全部内容解析完毕后发射done事件,通知客户端完成代码运行。

下面上张图,来演示一下运行效果。

Nodejs-cli 填坑记

之前用Python写过一个类似的工具,可以方便的读取系统剪切板的待翻译文本,然后以模态弹出框的形式通知用户翻译结果。自认为用起来还是不错的。现在学了点Nodejs,就有点手痒了,于是也来用Nodejs实现一个类似的功能。

当然不能完全的模仿,要有点新意。比如加一个这样的功能。

自判断语言类型(主要是英语和汉语),并进行翻译处理。

同样的,因为有网络请求,所以离不开我最喜欢的SuperAgent了。然后为了进一步提升用户体验,我又添加了一个cli-color模块。

这样就可以优雅的在命令行里面显示绚丽的文本了。

首先为了完成汉语的识别,用到了下面的这个函数。

代码比较简单,而且一看就差不多能明白这段代码的功能。我们都知道汉语在Unicode字符中的区间为[\u4e00-\u9fa5],所以匹配到这些字符的话,就默认为汉语了。

这里面的最后一句话是双非表达式。作用就是返回一个boolean类型的结果。这个使用技巧是我在浏览别人GitHub代码的时候看到的,当时就觉得这样写很优雅,于是模仿了一下。

为了尽可能清楚的表达我的逻辑,代码上添加了很多注释。应该是很容易就能读懂了吧。

下面来看下运行的效果。

Nodejs-cli 填坑记

到了最重要的一部分内容了。被这个cli坑了一个多小时了。不过还好,最终还是解决了它。

安装完最新版本的Node之后,默认会自带npm这个包管理工具。为了构建我的cli工具,我需要一个package.json的文件。

比如我的文件目录结构如下:

然后在当前目录的命令行中执行下面的命令:

然后根据命令行中的提示信息进行填写即可。填写完成就会生成一个package.json的文件了。

完成上面一步后就会得到类似于下面内容的文件了。

需要注意的就是bin属性,里面填写我们即将被打包的js文件的相对路径即可。比如我的index.js在package.json的同级目录下,所以我这么写了。

如果你的index.js文件在package.json的同级目录下的bin文件夹内,那你就得这么写:

最后记得保存。

再就是执行下面的链接命令了(记得命令行路径在package.json的同级目录下)。

然后就可以根据bin中声明的属性来调用命令行脚本了。

下面谈谈我掉进去的坑。按照官网给的使用技巧,本人也测试了一下,发现并不好使。然后我发现通过npm link命令生成的cmd文件有这么个内容:

也就是说这个文件本身就是错误的。node是找不到它的。而且在命令行中运行translator命令的时候根本不管用,它总会是用电脑上默认的文本编辑器打开相应的js脚本文件。

一开始我以为是代码有问题,然后修修改改,发现没什么问题啊。前前后后尝试了好几遍,都不得终。场面一度陷入了尴尬的地步。

然后在浏览一些帖子的时候,灵光一闪,为什么找不到???

究其原因就是环境变量呗。于是我就顺藤摸瓜,发现别人家的js脚本的开头都有这么一行代码

一开始没在意,以为是Linux特有的风格,然后我用的是VSCode,也能很好的运行就没在意,然后这次在我的JS文件中,我抱着试一试的态度加了这么一行语句,结果竟然成功了。

这更是验证了我关于环境变量的猜想,原来是这么回事哦。。。

至此,一个简单的node-cli工具就能制作完毕了。真的是无波折,不开心呐。

最后, 我想对自己说的就是:

遵守编码规范,不要想当然。