详解Node.js如何开发命令行工具


Posted in Javascript onAugust 14, 2016

前言

Node 给前端开发带来了很大的改变,促进了前端开发的自动化,我们可以简化开发工作,然后利用各种工具包生成生产环境。如运行sass src/sass/main.scss dist/css/main.css即可编译 Sass 文件。

在实际的开发过程中,我们可能会有自己的特定需求,

那么我们得学会如何创建一个Node命令行工具。

hello world

老规矩第一个程序为hello world。在工程中新建bin目录,在该目录下创建名为helper的文件,具体内容如下:

#!/usr/bin/env node

console.log('hello world');

修改helper文件的权限:

$ chmod 755 ./bin/helper

执行helper文件,终端将会显示hello world

$ ./bin/helper
hello world

符号链接

接下来我们创建一个符号链接,在全局的node_modules目录之中,生成一个符号链接,指向模块的本地目录,使我们可以直接使用helper命令。

在工程的package.json文件中添加bin字段:

{
 "name": "helper",
 "bin": {
 "helper": "bin/helper"
 }
}

在当前工程目录下执行npm link命令,为当前模块创建一个符号链接:

$ npm link

/node_path/bin/helper -> /node_path/lib/node_modules/myModule/bin/helper
/node_path/lib/node_modules/myModule -> /Users/ipluser/myModule

现在我们可以直接使用helper命令:

$ helper
hello world

commander模块

为了更高效的编写命令行工具,我们使用TJ大神的commander模块。

$ npm install --save commander

helper文件内容修改为:

#!/usr/bin/env node

var program = require('commander');

program
 .version('1.0.0')
 .parse(process.argv);

执行helper -hhelper -V命令:

$ helper -h

 Usage: helper [options]

 Options:

 -h, --help  output usage information
 -V, --version output the version number

$ helper -V
1.0.0

commander模块提供-h, --help-V, --version两个内置命令。

创建命令

创建一个helper hello <author>的命令,当用户输入helper hello ipluser时,终端显示hello ipluser。修改helper文件内容:

#!/usr/bin/env node

var program = require('commander');

program
 .version('1.0.0')
 .usage('<command> [options]')
 .command('hello', 'hello the author') // 添加hello命令
 .parse(process.argv);

bin目录下新建helper-hello文件:

#!/usr/bin/env node

console.log('hello author');

执行helper hello命令:

$ helper hello ipluser
hello author

解析输入信息

我们希望author是由用户输入的,终端应该显示为hello ipluser。修改helper-hello文件内容,解析用户输入信息:

#!/usr/bin/env node

var program = require('commander');

program.parse(process.argv);

const author = program.args[0];

console.log('hello', author);

再执行helper hello ipluser命令:

$ helper hello ipluser
hello ipluser

哦耶,终于达到完成了,但作为程序员,这还远远不够。当用户没有输入author时,我们希望终端能提醒用户输入信息。

提示信息

helper-hello文件中添加提示信息:

#!/usr/bin/env node

var program = require('commander');

program.usage('<author>');

// 用户输入`helper hello -h`或`helper hello --helper`时,显示命令使用例子
program.on('--help', function() {
 console.log(' Examples:');
 console.log(' $ helper hello ipluser');
 console.log();
});

program.parse(process.argv);
(program.args.length < 1) && program.help(); // 用户没有输入信息时,调用`help`方法显示帮助信息

const author = program.args[0];

console.log('hello', author);

执行helper hellohelper hello -h命令,终端将会显示帮助信息:

$ helper hello

 Usage: helper-hello <author>

 Options:

 -h, --help output usage information

 Examples:
 $ helper hello ipluser

$ helper hello -h

 Usage: helper-hello <author>

 Options:

 -h, --help output usage information

 Examples:
 $ helper hello ipluser

总结

到此我们编写了一个helper命令行工具,并且具有helper hello <author>命令。刚兴趣的朋友们快快自己动手实践起来,只有自己做了才能算真正的学习了,希望本文对大家能有所帮助。

Javascript 相关文章推荐
用Javascript 和 CSS 实现脚注(Footnote)效果
Sep 09 Javascript
js split 的用法和定义 js split分割字符串成数组的实例代码
May 13 Javascript
jquery与prototype框架的详细对比
Nov 21 Javascript
jquery实现的省市区三级联动
Apr 02 Javascript
JS实现黑客帝国文字下落效果
Sep 01 Javascript
详谈js中数组(array)和对象(object)的区别
Feb 27 Javascript
基于Vue生产环境部署详解
Sep 15 Javascript
Node解决简单重复问题系列之Excel内容的获取
Jan 02 Javascript
微信小程序 云开发模糊查询实现解析
Sep 02 Javascript
layui table 多行删除(id获取)的方法
Sep 12 Javascript
JavaScript判断数据类型有几种方法及区别介绍
Sep 02 Javascript
JS数组去重详情
Nov 07 Javascript
javascript中的 object 和 function小结
Aug 14 #Javascript
JavaScript兼容浏览器FF/IE技巧
Aug 14 #Javascript
关于JavaScript限制字数的输入框的那些事
Aug 14 #Javascript
使用ajaxfileupload.js实现上传文件功能
Aug 13 #Javascript
几种二级联动案例(jQuery\Array\Ajax php)
Aug 13 #Javascript
漂亮! js实现颜色渐变效果
Aug 12 #Javascript
jQuery ztree实现动态树形多选菜单
Aug 12 #Javascript
You might like
PHP If Else(elsefi) 语句
2013/04/07 PHP
php实现水仙花数的4个示例分享
2014/04/08 PHP
关于js数组去重的问题小结
2014/01/24 Javascript
JavaScript静态类型检查工具FLOW简介
2015/01/06 Javascript
javascript实现textarea中tab键的缩排处理方法
2015/06/26 Javascript
jQuery实现模拟marquee标签效果
2015/07/14 Javascript
jQuery实现三级联动效果
2017/03/02 Javascript
JQuery查找子元素find()和遍历集合each的方法总结
2017/03/07 Javascript
angular+ionic返回上一页并刷新页面
2017/08/08 Javascript
ReactNative 之FlatList使用及踩坑封装总结
2017/11/29 Javascript
angular6.0使用教程之父组件通过url传递id给子组件的方法
2018/06/30 Javascript
layui 实现table翻页滚动条位置保持不变的例子
2019/09/05 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
2021/02/23 Vue.js
[54:29]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第二场
2018/04/09 DOTA
[45:16]完美世界DOTA2联赛循环赛 IO vs FTD BO2第二场 11.05
2020/11/06 DOTA
Python标准库sched模块使用指南
2017/07/06 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
浅谈python3.x pool.map()方法的实质
2019/01/16 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
python+mysql实现学生信息查询系统
2019/02/21 Python
Python爬虫 urllib2的使用方法详解
2019/09/23 Python
Python基本类型的连接组合和互相转换方式(13种)
2019/12/16 Python
解决Pycharm 导入其他文件夹源码的2种方法
2020/02/12 Python
Python多线程获取返回值代码实例
2020/02/17 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
2021/03/04 Python
《老王》教学反思
2014/02/23 职场文书
决心书标准格式
2014/03/11 职场文书
大学生村官座谈会发言材料
2014/05/25 职场文书
拉歌口号大全
2014/06/13 职场文书
永远跟党走演讲稿
2014/09/12 职场文书
十一国庆节“向国旗敬礼”主题班会活动方案
2014/09/27 职场文书
2014年医生工作总结
2014/11/21 职场文书
如何才能写好调研报告?
2019/07/03 职场文书
python中的plt.cm.Paired用法说明
2021/05/31 Python
Python获取指定日期是"星期几"的6种方法
2022/03/13 Python