node命令行工具开发

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

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

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

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

    1. "bin": {
    2. "hi": "bin/hi.js"
    3. }
    1. 现在我们执行npm link启用命令行,现在再试试在终端直接输入hi命令,这次我们可以如愿见到结果

    处理参数

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

    1. #! /usr/bin/env node
    2. let argv = process.argv.slice(2)
    3. let yourName = argv[0]
    4. console.log(`hi, ${yourName}!`)
    5. // 执行 hi liu
    6. // hi, liu!

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

    1. #!/usr/bin/env node
    2. /**
    3. * Module dependencies.
    4. */
    5. var program = require('commander')
    6. program
    7. .version('0.0.1')
    8. .option('-p, --peppers', 'Add peppers')
    9. .option('-P, --pineapple', 'Add pineapple')
    10. .option('-b, --bbq-sauce', 'Add bbq sauce')
    11. .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
    12. .parse(process.argv)
    13. if (program.peppers) console.log(' - peppers')
    14. if (program.pineapple) console.log(' - pineapple')
    15. if (program.bbqSauce) console.log(' - bbq')
    16. 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外,也是一个优秀的命令行参数处理模块

    1. npm install commander superagent cli-table2 --save

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

    然后

    1. npm link

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

    2.coding

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

    1. #! /usr/bin/env node
    2. // 引入需要的模块
    3. const program = require('commander')
    4. const Table = require('cli-table2') // 表格输出
    5. const superagent = require('superagent') // http请求
    6. // 初始化commander
    7. program
    8. .allowUnknownOption()
    9. .version('0.0.1')
    10. .usage('translator <cmd> [input]')
    11. // 有道api
    12. const API = 'http://fanyi.youdao.com/openapi.do?keyfrom=toaijf&key=868480929&type=data&doctype=json&version=1.1'
    13. // 添加自定义命令
    14. program
    15. .command('query')
    16. .description('翻译输入')
    17. .action(function(word) {
    18. superagent.get(API)
    19. .end(function (err, res) {
    20. if(err){
    21. console.log('excuse me, try again')
    22. return false
    23. }
    24. let data = JSON.parse(res.text)
    25. let result = {}
    26. // 返回的数据处理
    27. if(data.basic){
    28. result[word] = data['basic']['explains']
    29. }else if(data.translation){
    30. result[word] = data['translation']
    31. }else {
    32. console.error('error')
    33. }
    34. // 输出表格
    35. let table = new Table()
    36. table.push(result)
    37. console.log(table.toString())
    38. })
    39. })
    40. // 没有参数时显示帮助信息
    41. if (!process.argv[2]) {
    42. program.help();
    43. console.log();
    44. }
    45. program.parse(process.argv)
    1. 了解nodeJs 可执行脚步
    2. 了解命令行参数解析
    3. 了解commander,cli-table2,superagent等第三方模块

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