rwson

rwson

一个前端开发

一起写一个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模块可以解析我们传入的参数,常用的有commanderminimist

在这里我用的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去把我们的命令行工具安装到全局使用啦😜