
1.2.3 二进制模块
工作中会接到各种项目开发需求,开发前需要先规划项目目录,然后一个个创建文件,搭建Sass编译环境,下载jQuery、React等类库,做完这些准备工作要花费不少时间。
那么问题来了,每做一个项目都要完成这些准备工作,难道要不断重复这个过程吗?当然不需要!使用np就能节省很多时间。
前端工程化的思想便是在解决上述问题的过程中产生的。根据具体的业务特点,将前端开发流程、技术、工具、经验等规范化和标准化,可以最大限度地提高前端开发工程师的开发效率,降低技术选型难度和前后端联合调试的沟通成本。
使用命令工具是开发者的必备技能,也是前端工程化落地的必要组成部分。Node.js二进制模块中常用的CLI命令工具分类如下。
〇 命令行工具。
〇 脚手架:express-generator、koa-generator。
〇 与构建相关的工具:Webpack、Gulp、Grunt。
〇 shell相关工具。
〇 kp:用于根据端口“杀死”进程。
〇 mongo-here:启动MongoDB的简化命令工具。
〇 本地服务器:je模块。
以上是笔者常用的CLI命令工具,无论哪一种都值得学一学,学会这些工具的使用方法对提高开发效率有很大帮助。
创建文件
下面我们具体看一下如何编写Node.js命令行模块,代码如下。

在bin/cli.js中键入如下代码。

一般情况下,index.js会作为普通模块对外提供API,bin/cli.js中提供的实现命令行功能的文件也会直接使用index.js里的API。这样做的好处是,逻辑代码都在index.js里,模块既可以是普通模块,也可以是二进制模块,这是Node.js中非常常见的做法。
修改package.json文件
如果想把模块设定成二进制模块,需要在package.json文件里键入如下内容。

此处是关键,通过bin字段可以确定当前模块是不是二进制模块。bin字段是用来配置CLI命令名称和具体执行逻辑的脚本文件,比如上面的hello就是模块需要提供的CLI命令名称,它对应的Node.js脚本文件是bin/cli.js。
在package.json文件中配置好bin字段后,就可以在本地进行测试了,方法如下。

比如我们想执行hello-h(等同于hello-help)该怎么办呢?主要办法是解析process.argv文件,它会返回由命令行脚本的各个参数组成的数组,具体代码如下。

此时,执行hello-h命令会打印出帮助信息,结果如下。

npm脚本
为了开发便利,一般我们会修改npm脚本,缩短执行命令的长度。另外,脚本也可以提供一些命令行工具所不具备的能力。还是以上面的代码为例,我们可以对scripts字段进行重写,代码如下。

以上代码中定义了两个命令,具体如下。
〇 npm start:将当前npm发布到npmjs.org上。
〇 npm test:测试代码,应避免重复输入。
无论从语义还是便利性上,重写常见命令都是不错的选择。
更多
手动解析process.argv还是有些麻烦的,这里推荐几个args库,可以更简单地对process.argv进行处理。
〇 Clipanion:基于TypeScript类和装饰器风格,用起来更简单。
〇 Commander.js:目前使用最多的库。
〇 Yargs:小巧、功能强大、简单,是官方推荐的库。
下面给出基于Yargs库解析process.argv的代码。

在终端中执行上面的代码,结合help选项就可以查看当前应用的帮助文档,内容如下。

笔者和很多朋友一样,非常介意模块的依赖和整体安装包的体积,一般推荐使用比较小巧的模块,实在没有合适的就自己编写。
DRY(Don't Repeat Yourself)是软件开发过程中非常有名的原则,字面意思是“不要重复自己”,实际是告诉开发者不要重复造轮子,强调在编程时不要重复写相同的代码。代码应当只写一次,需要重复使用时直接在其他地方引用即可。
因此,当别人写的代码或模块可用时,可以优先使用,没有可以满足需求的模块时再考虑自己开发。如此一来可以提高代码重用率,缩减代码量,同时也有助于提高代码的可读性和可维护性。
