node 命令行小工具开发【翻译小工具】

作者: 刘星
日期: 2017年3月16日

node 命令行工具开发

NodeJs 有许多命令行工具。它们全局安装,并提供一个命令供我们使用,完成相应的功能。 现在我们就用 node 来开发一个实用的命令行小工具

一.初探

一个最简单的命令行工具

1.首先我们新建一目录,然后执行npm init生成 package.json 文件

2.新建一 bin 目录并在目录下创建一个 hi.js

#! /usr/bin/env node
console.log("hi")

执行node hi.js我们可以看到终端输出‘hi’。。当然这并不是我们要的命令行工具,我们需要直接运行hi就可出现结果

3.现在我们告诉 npm 可执行文件是哪个,在 package.json 里添加如下信息:

 "bin": {
    "hi": "bin/hi.js"
  }
  1. npm link

    现在我们执行npm link启用命令行,现在再试试在终端直接输入hi命令,这次我们可以如愿见到结果

处理参数

命令行参数可通过系统变量process.argv获取。 process.argv 返回一个数组 第一个是 node 第二个是脚本文件 第三个是输入的参数,process.argv[2]开始得到才是真正的参数部分

  #! /usr/bin/env node

let argv = process.argv.slice(2)
let yourName = argv[0]
console.log(`hi, ${yourName}!`)

// 执行 hi liu
// hi, liu!

Commander.js

对于参数处理,我们一般使用commander,commander 是一个轻巧的 nodejs 模块,提供了用户命令行输入和参数解析强大功能如:自记录代码、自动生成帮助、合并短参数(“ABC”==“-A-B-C”)、默认选项、强制选项、命令解析、提示符

$ npm install commander --save
#!/usr/bin/env node

/**
 * Module dependencies.
 */

var program = require('commander')

program
  .version('0.0.1')
  .option('-p, --peppers', 'Add peppers')
  .option('-P, --pineapple', 'Add pineapple')
  .option('-b, --bbq-sauce', 'Add bbq sauce')
  .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
  .parse(process.argv)

console.log('you ordered a pizza with:')
if (program.peppers) console.log('  - peppers')
if (program.pineapple) console.log('  - pineapple')
if (program.bbqSauce) console.log('  - bbq')
console.log('  - %s cheese', program.cheese)

Commander API

  • Option(): 初始化自定义参数对象,设置“关键字”和“描述”
  • Command(): 初始化命令行参数对象,直接获得命令行输入
  • Command#command(): 定义一个命令名字
  • Command#action(): 注册一个 callback 函数
  • Command#option(): 定义参数,需要设置“关键字”和“描述”,关键字包括“简写”和“全写”两部分,以”,”,”|”,”空格”做分隔。
  • Command#parse(): 解析命令行参数 argv
  • Command#description(): 设置 description 值
  • Command#usage(): 设置 usage 值
  • 更多参考 commander 官网

除了 commander 外,yargs也是一个优秀的命令行参数处理模块

二.开发命令行翻译工具

1.新建并初始化项目

新建 文件夹 translator/进入目录下执行npm init 生成 package.json 文件

npm install commander superagent cli-table2 --save

新建 bin/translator.js 文件,并加入 package.json 文件中

 "bin": {
    "translator": "bin/translator.js"
  },

然后

npm link

这里我们会用到有道 API 一切准备就绪我们就可以进行编码了

2.coding

由于代码量很小,这里就直接贴代码,在代码中以注释讲解

#! /usr/bin/env node
// 引入需要的模块
const program = require('commander')
const Table = require('cli-table2') // 表格输出
const superagent = require('superagent') // http请求
// 初始化commander
program
    .allowUnknownOption()
    .version('0.0.1')
    .usage('translator <cmd> [input]')

// 有道api
const API = 'http://fanyi.youdao.com/openapi.do?keyfrom=toaijf&key=868480929&type=data&doctype=json&version=1.1'

// 添加自定义命令
program
    .command('query')
    .description('翻译输入')
    .action(function(word) {
        // 发起请求
        superagent.get(API)
        .query({ q: word})
        .end(function (err, res) {
            if(err){
                console.log('excuse me, try again')
                return false
            }
            let data = JSON.parse(res.text)
            let result = {}

            // 返回的数据处理
            if(data.basic){
                result[word] = data['basic']['explains']
            }else if(data.translation){
                result[word] = data['translation']
            }else {
                console.error('error')
            }

            // 输出表格
            let table = new Table()
            table.push(result)
            console.log(table.toString())
        })
    })

// 没有参数时显示帮助信息
if (!process.argv[2]) {
    program.help();
    console.log();
}

program.parse(process.argv)

现在在终端中愉快的使用translator

$ translator
Usage:  translator <cmd> [input]
  Commands:
    query   翻译输入
  Options:
    -h, --help     output usage information
    -V, --version  output the version number

三.小结

  1. 了解 nodeJs 可执行脚步
  2. 了解命令行参数解析
  3. 了解 commander,cli-table2,superagent 等第三方模块

抛砖引玉,更多请参考各个模块的官方示例及 API 文档

相关链接

文档信息

版权声明:署名-非商业性使用-禁止演绎 4.0 国际(CC BY-NC-ND 4.0)

原文链接:https://www.liuxing.io/blog/translate-cli/

发表日期:2017年03月16日


最近更新

Curl 使用指南

Curl 是一个常用的命令行数据传输工具, 可以方便的从命令行创建网络请求

2021年5月04日

JavaScript 中的分号

JavaScript 代码到底加不加分号。本文带你了解 JavaScript 的分号自动插入机制,以及哪些情况必须加分号

2021年5月02日