一起写一个npm命令行工具
自从nodejs问世之后,随着前端不断的发展,出现过很多的命令行工具,就比如前端构建工具,从最开始的grunt
,再到gulp
,然后到现在的webpack
等等,它们都有自己的命令行,接下来我们一起分析并实现一个简单的命令行工具
首先需要建一个目录,在这里我们暂且叫cli-starter
mkdir cli-starter
然后我们需要去用npm
初始化这个目录,这里我们用默认的就好
npm init -y
普通的 node.js 脚本需要使用node 文件名
的形式执行,在脚本首行加上#!/usr/bin/env node
可以在linux
环境中指定脚本的解释程序
一切从hello world
开始,我们现在新建一个bin
目录,在下面用建一个hello.js
,写入下面内容
#!/usr/bin/env node
console.log("hello world");
然后去node ./bin/hello
,可以看到控制台会输出hello world
当然这个只是在特定目录下去执行这个文件,如果想和其他命令行工具做到无处不在,可以在package.json
中做如下指定
{
"name": "hello",
"bin": {
"hello": "./bin/hello"
}
}
然后再通过npm link
去添加到系统PATH
,不要担心会污染系统,既然有npm link
,肯定就有npm unlink
,就是把我们添加的删除,这样,我们就可以在任何一个目录下使用这个hello
命令了
上面就是一个最简单的命令行了,接下来我们需要对它进行完善,最常见的就是参数,有很多npm
模块可以解析我们传入的参数,常用的有commander、minimist等
在这里我用的minimist
这个模块,用法npm
上已经有了这里不再赘述,下面我们一起完成一个翻译小工具,调用谷歌的翻译接口,这里我直接用的translate-api
这个npm
包,一起看下实现:
#!/usr/bin/env node
var minimist = require("minimist"),
translate = require("translate-api");
// 获取参数
var args = minimist((process.argv.slice(2)), {
/**
* 参数别名
* hello --target=abc <=> hello -t=abc
*/
alias: {
t: "target",
i: "input"
}
});
// 存储输入的参数
var target = args.target,
input = args.input;
// 调用封装好的Google Translate API
translate.getText(input, { to: target }).then(function(res) {
console.log(res.text);
// 退出进程
process.exit(1);
});
到这里我们一个简单的命令行工具就写好了,只是一个小玩具,还有很多没实现,比如子命令等。
那么如果感觉这个工具写的还行,想分享到npm
仓库里面给更多人使用,这时候我们就要用到npm
的一些子命令了,首先我们需要用npm adduser
去登录npm
,让它知道这个包是谁发布的,然后用npm publish
去推送到仓库,这里需要注意的是,在发布npm
包时我们需要把镜像源切换成官方的,推荐使用nrm去管理镜像,在用publish
之前,先nrm use npm
切下镜像,等发布成功之后别人就可以用npm install <package-name> -g
去把我们的命令行工具安装到全局使用啦😜