详解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 相关文章推荐
Mootools 1.2教程 选项卡效果(Tabs)
Sep 15 Javascript
JS原型对象通俗&quot;唱法&quot;
Dec 27 Javascript
关于JavaScript的面向对象和继承有利新手学习
Jan 11 Javascript
JS平滑无缝滚动效果的实现代码
May 06 Javascript
jquery.form.js框架实现文件上传功能案例解析(springmvc)
May 26 Javascript
jquery根据一个值来选中select下的option实例代码
Aug 29 Javascript
简单实现node.js图片上传
Dec 18 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
Feb 27 Javascript
jQuery选择器之子元素选择器详解
Sep 18 jQuery
如何将你的AngularJS1.x应用迁移至React的方法
Feb 01 Javascript
微信小程序如何修改本地缓存key中单个数据的详解
Apr 26 Javascript
canvas实现贪食蛇的实践
Feb 15 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($_POST[submit])与 if(isset($_POST[submit])) 的区别
2011/02/08 PHP
PHP中copy on write写时复制机制介绍
2014/05/13 PHP
windows下apache搭建php开发环境
2015/08/27 PHP
php实现表单多按钮提交action的处理方法
2015/10/24 PHP
学习ExtJS(二) Button常用方法
2009/10/07 Javascript
jquery map方法使用示例
2014/04/23 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
JS实现超炫网页烟花动画效果的方法
2015/03/02 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
使用js获取地址栏参数的方法推荐(超级简单)
2016/06/14 Javascript
JavaScript中ES6 Babel正确安装过程
2016/07/18 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
利用vue重构有赞商城的思路以及总结整理
2019/02/21 Javascript
jquery图片预览插件实现方法详解
2019/07/18 jQuery
vue使用代理解决请求跨域问题详解
2019/07/24 Javascript
如何对react hooks进行单元测试的方法
2019/08/14 Javascript
如何使用Javascript中的this关键字
2020/05/28 Javascript
[49:05]Newbee vs TNC 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
对于Python的Django框架使用的一些实用建议
2015/04/03 Python
理解Python中的类与实例
2015/04/27 Python
详解Django 中是否使用时区的区别
2018/06/14 Python
python numpy 部分排序 寻找最大的前几个数的方法
2018/06/27 Python
对pandas中两种数据类型Series和DataFrame的区别详解
2018/11/12 Python
详解从Django Rest Framework响应中删除空字段
2019/01/11 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
2019/10/11 Python
python——全排列数的生成方式
2020/02/26 Python
Django多数据库配置及逆向生成model教程
2020/03/28 Python
Python使用matplotlib绘制圆形代码实例
2020/05/27 Python
Python Map 函数的使用
2020/08/28 Python
个人简历自荐信
2013/12/05 职场文书
大学生标准自荐书
2014/06/15 职场文书
党员教师批评与自我批评发言稿
2014/10/15 职场文书
2015年妇委会工作总结
2015/05/22 职场文书
工作简报范文
2015/07/21 职场文书
python 学习GCN图卷积神经网络
2022/05/11 Python