详解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 基础篇之对象、数组使用介绍(三)
Apr 07 Javascript
Jquery写一个鼠标拖动效果实现原理与代码
Dec 24 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
Jan 09 Javascript
简易js代码实现计算器操作
Apr 15 Javascript
Jquery倒数计时按钮setTimeout的实例代码
Jul 04 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
Nov 05 Javascript
JavaScript中字符串与Unicode编码互相转换的实现方法
Dec 18 Javascript
vue表单绑定实现多选框和下拉列表的实例
Aug 12 Javascript
vue如何引入sass全局变量
Jun 28 Javascript
原生JS实现的简单小钟表功能示例
Aug 30 Javascript
vue实现点击追加选中样式效果
Nov 01 Javascript
详解JS WebSocket断开原因和心跳机制
May 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学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
7个超级实用的PHP代码片段
2011/07/11 PHP
php中调用其他系统http接口的方法说明
2014/02/28 PHP
ThinkPHP调用百度翻译类实现在线翻译
2014/06/26 PHP
分享3个php获取日历的函数
2015/09/25 PHP
thinkPHP5.0框架独立配置与动态配置方法
2017/03/17 PHP
php实现websocket实时消息推送
2018/03/30 PHP
PHP删除数组中特定元素的两种方法
2019/02/28 PHP
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
jQuery ajax 路由和过滤器使用说明
2011/08/02 Javascript
使用原生js写的一个简单slider
2014/04/29 Javascript
使用JavaScript开发IE浏览器本地插件实例
2015/02/18 Javascript
基于React.js实现原生js拖拽效果引发的思考
2016/03/30 Javascript
BootStrap初学者对弹出框和进度条的使用感觉
2016/06/27 Javascript
Vue数据驱动模拟实现3
2017/01/11 Javascript
JavaScript中this的用法及this在不同应用场景的作用解析
2017/04/13 Javascript
详解node nvm进行node多版本管理
2017/10/21 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
vue项目中极验验证的使用代码示例
2019/12/03 Javascript
jQuery插件simplePagination的使用方法示例
2020/04/28 jQuery
三剑客:offset、client和scroll还傻傻分不清?
2020/12/04 Javascript
[51:44]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第二场
2018/04/04 DOTA
Python 不同对象比较大小示例探讨
2014/08/21 Python
Python黑魔法Descriptor描述符的实例解析
2016/06/02 Python
python批量修改文件编码格式的方法
2018/05/31 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
2018/07/17 Python
python文本数据处理学习笔记详解
2019/06/17 Python
Python自动创建Excel并获取内容
2020/09/16 Python
C++的几个面试题附答案
2016/08/03 面试题
大专毕业生自我鉴定
2013/11/21 职场文书
培养联系人考察意见
2015/06/01 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书
MySQL系列之三 基础篇
2021/07/02 MySQL
Python使用MapReduce进行简单的销售统计
2022/04/22 Python
MySQL聚簇索引和非聚簇索引的区别详情
2022/06/14 MySQL
Java多线程并发FutureTask使用详解
2022/06/28 Java/Android