如何利用Nodejs开发命令行工具?看这里就对了!

239 阅读2分钟

在日常的前端开发工作中,我们经常会接触到一些命令行工具,例如nvmnrmpnpm,它们都可以通过指令的方式实现强大的功能,例如nvm可以非常方便的管理nodejs的版本,用于快速切换不同的nodejs版本。

image.png

既然这些命令行工具如此强大,那为何不自己尝试实现一下类似的工具呢?咱们说干就干!

开始实现

项目结构:

 dev
 │ - package.json 
 │ - index.js
 └ ─ bin 
      |- cli.js

package.json 中配置 bin 字段。

{
  "name": "dev",
  "version": "1.0.0",
  "description": "开发一个终端工具",
  "main": "index.js",
  "bin": {
    "dev": "./bin/cli.js"
  },
  "scripts": {
    "start": "node index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "chiko",
  "license": "ISC"
}

想要实现一个终端工具,bin字段是必不可少的,它用于指定npm包中的可执行脚本的位置,当我们全局安装一个包时,bin字段定义的脚本会被添加到系统的路径中,使用得我们可以在命令行界面的任何位置直接调用这些脚本。

那我们的cli脚本该如何写呢?

#!/usr/bin/env node

我们需要在该文件的第一行加上这行特殊代码,它的作用就是告诉操作系统应该使用哪个解析器或程序去执行脚本,这行代码的意思就是通过nodejs去执行。

下面就可以写上自己需要的功能了,这边推荐一个包来快捷的实现指令, commander

npm install commander

简单实现一个案例:

#!/usr/bin/env node

const commander = require('commander');
const program = new commander.Command();

program
    .option('-s, --say <text>', 'say someting')

program.parse(process.argv);


const options = program.opts();
if (options.say) console.log(`say: ${options.say}`);

对于本地开发来说,想要测试自己写的包也很简单,通过npm link指令,可以将自己的包链接到自己的全局node_module目录下,当你修改模块代码时,所有使用该模块的项目都会立即响应这些更改。

在终端测试命令行:

dev -s hello // say: hello

成功输出say: hello,这样一个简单的命令行工具就完成了。

后话

这里推荐一下本人刚写完的命令行翻译包,支持六个平台的翻译,可以快捷切换平台和语种,现已发布到npm,可通过npm install -g tlm下载使用,npm搜索tlm即可看详细文档说明。

image.png

本项目采用typescript编写,通过tsc编译并打包js文件到npm,想要学习的可以看github源码。 链接跳转:多平台命令行翻译包,欢迎大家提出自己的想法!

觉得本项目还不错的,请给我个star吧!!!