目录

前端必备,从零开始完成一个node命令行工具

前端必备,从零开始完成一个node命令行工具

node.js 作为一种服务器语言,其拥有很多底层操作的api,比如文件写入,http服务器等模块。同时其语法和js几乎一直,所以作为前端的我们,可以运用这些东西帮助解决一些开发中的实际问题。

  • 每当shell新开启一个会话时,shell都会生成environment即环境变量,environment里都是些定义系统属性的变量。命令行输入 env即可查看环境变量

https://i-blog.csdnimg.cn/blog_migrate/7a78d5e9be8b25adddcd16fb13c3eaa6.png

  • 很多程序都会用到这里的变量,比如nvm会用这里的NVM_NODEJS_ORG_MIRROR=https://nodejs.org/dist

    作为代理服务器地址,去镜像的源下载node来安装,提高速度

  • 查看全局包安装在哪里 npm root -g

  • 当我们shell里执行 node x.js --args ,args可以通过 process.argv 来访问,process.argv[0]固定是node本身路径,process.argv[1]是文件路径,process.argv.slice(2)才是我们输入的参数

  1. 首先创建一个文件 mkdir test

  2. cd test 进入文件夹

  3. 初始化我们的项目 npm init ,一路回车就好,此时应该有一个 package.json 的文件

  4. 用一款你喜欢的开发工具打开test文件夹

    此时你看到的应该是这样

    https://i-blog.csdnimg.cn/blog_migrate/b3bff3b5f343371fa80ca46b5711686a.png

    到这里就算项目创建好啦~

对 node 项目而言,模块导出入口文件由 package.json 的 main 字段指定

而如果是要安装到命令行的工具,则是由 package.json 的 bin 字段指定。

首次创建的package.json文件应该长成这样(如果你是一路按回车键的话)

https://i-blog.csdnimg.cn/blog_migrate/92d745efa92291dda82cca3f65b5fcbf.png

然后我们应该给它配置一个bin字段,如下所示

https://i-blog.csdnimg.cn/blog_migrate/7445cc7f60dcccc90ea81af6e2860241.png

这个的意思是,我们创建了一个 test-abc 命令,当你输入这个命令的时候,执行同级目录下的 index.js 文件。

所以我们现在就需要在index.js文件下写我们需要的代码逻辑

创建index.js文件。现在的文件结构应该是:

https://i-blog.csdnimg.cn/blog_migrate/1babd3639a91de7b9907f00552172178.png

在index.js中写下:

#!/usr/bin/env node
console.log("test-abc");

第一行是脚本声明文件。任何以 shebang line(#!)

开头的文件即是可执行的脚本,其中shebang line指定了用什么(解释器)来解释执行脚本

比如常见的 python 脚本,你可以看到第一行是这样的:

#!/usr/bin/env python

node.js 来说,shebang line通常这么写:

#!/usr/bin/env node

Shebang是为了指定脚本的解释程序,可是不同用户或者不同的脚本解释器有可能安装在不同的目录下,系统如何知道要去哪里找你的解释程序呢? /usr/bin/env 就是告诉系统可以在PATH目录(即 /usr/bin/env )中查找。所以配置#!/usr/bin/env node, 就是解决了不同的用户node路径不同的问题,可以让系统动态的去查找node来执行你的脚本文件。

直接命令行输入我们定义的命令名称就好啦。这里我们定义的test-abc ,所以直接输入test-abc就好啦~

然后我们测试一下,在终端中输入 kid,会提示:

zsh: command not found: kid

为什么会这样呢?回想一下,通常我们在使用一个 cli 工具时,都需要先安装它,比如 vue-cli,使用前需要全局安装:

npm i vue-cli -g

而我们的 kid-cli 并没有发布到 npm 上,当然也没有安装过了,所以终端现在还不认识这个命令。通常我们想本地测试一个 npm 包,可以使用:npm link 这个命令,本地安装这个包,我们执行一下:

npm link

然后再执行

test-abc

就会看输出 ‘test-abc‘ 啦

https://i-blog.csdnimg.cn/blog_migrate/e5e1a7b868b1e1775246dd614d418aa6.png