详解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 相关文章推荐
use jscript List Installed Software
Jun 11 Javascript
JavaScript 设计模式 安全沙箱模式
Sep 24 Javascript
网页打开自动最大化的js代码
Aug 22 Javascript
JS继承--原型链继承和类式继承
Apr 08 Javascript
jquery实现的图片点击滚动效果
Apr 29 Javascript
js判断当前页面在移动设备还是在PC端中打开
Jan 06 Javascript
IScroll5 中文API参数说明和调用方法
May 21 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
Jul 19 Javascript
JS实现上传图片的三种方法并实现预览图片功能
Jul 14 Javascript
详解webpack的配置文件entry与output
Aug 21 Javascript
通俗易懂地解释JS中的闭包
Oct 23 Javascript
使用 Opentype.js 生成字体子集的实例代码详解
May 25 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学习散记_编码(json_encode 中文不显示)
2011/11/10 PHP
Yii基于数组和对象的Model查询技巧实例详解
2015/12/28 PHP
PHP批量修改文件名称的方法分析
2017/02/27 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
json跟xml的对比分析
2008/06/10 Javascript
jquery中$.post()方法的简单实例
2014/02/04 Javascript
Nodejs极简入门教程(二):定时器
2014/10/25 NodeJs
Javascript学习笔记之函数篇(五) : 构造函数
2014/11/23 Javascript
javascript模拟命名空间
2015/04/17 Javascript
JS实现的5级联动Select下拉选择框实例
2015/08/17 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
利用vue写todolist单页应用
2016/12/15 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
实例详解display:none与visible:hidden的区别
2017/03/30 Javascript
webpack配置的最佳实践分享
2017/04/21 Javascript
AngularJS自定义指令之复制指令实现方法
2017/05/18 Javascript
详解vue-router2.0动态路由获取参数
2017/06/14 Javascript
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
微信小程序如何再次获取用户授权的方法
2019/05/10 Javascript
如何使用JavaScript实现栈与队列
2019/06/24 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
JS实现鼠标按下拖拽效果
2020/07/23 Javascript
python模糊图片过滤的方法
2018/12/14 Python
django 外键model的互相读取方法
2018/12/15 Python
Pandas之groupby( )用法笔记小结
2019/07/23 Python
python如何求100以内的素数
2020/05/27 Python
如何解决安装python3.6.1失败
2020/07/01 Python
浅谈CSS3鼠标移入图片动态提示效果(transform)
2017/11/06 HTML / CSS
使用html5+css3来实现slider切换效果告别javascript+css
2013/01/08 HTML / CSS
澳大利亚巧克力花束和礼品网站:Tastebuds
2019/03/15 全球购物
澳大利亚音乐商店:Bava’s Music City
2019/05/05 全球购物
实习评语
2013/12/16 职场文书
外企办公室竞聘演讲稿
2013/12/29 职场文书
求职简历自我评价范例
2014/03/12 职场文书
2015年电工工作总结
2015/04/10 职场文书
上诉答辩状范文
2015/05/22 职场文书