前言

每次看到一些库npm -g install xx然后,执行xx就可以跑起来,这不就是一个shell工具了吗,那么我不就可以不用学习shell语法,直接用js写命令行脚本了吗!

什么是REPL应用

所谓的repl应用就是一个终端命令行工具,如果使用linux对于命令行工具例如curl,awk,grep,find,这些肯定不陌生,而现在,我们就是用node去写类似这样的程序

读取-求值-输出

对于第一次动手写repl应用,我们首先,了解一些知识点.

Process api

文档 http://nodejs.org/api/process.html

process 对象在node里面是全局对象,不需要用require引入,直接使用

console.log(process)

我们就可以在终端里面看到process都有些什么内容了.对于,开发一个repl应用,我们对于process对象只需要了解以下下几点就行

  • process.argv //这次输入值集合
  • process.stdout.* //终端输出方法
  • process.stdin.* //终端输入方法
  • process.exit(); // 退出

对于process的了解这几点大部分repl应用都可以开发了,接下来,我们说说,如何让命令行工具读取参数.

读取

对于repl而言,值读取的常见的一般有两种:

配置值

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env node
if(process.argv[2] === '-w'){
var args = process.argv.slice(3);
var output = '';
args.forEach(function (item){
output += item + ' ';
})
console.log(output);
process.exit();
}

node repl.js -w Hello world!

Hello world!

交互式

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env node
function read(prompt) {
process.stdout.write(prompt + ':');
process.stdin.resume();
process.stdin.setEncoding('utf-8');
process.stdin.on('data', function(chunk) {
process.stdout.write('output: ' + chunk);
process.exit();
});
} read('input')

node repl.js

input: Hello world!

output: Hello world!

repl 应用本质其实就是一个shell脚本,现在我们要用node来写,所以,对于*nix环境我们必须在第一行说明我们的文件需要在什么环境下运行.

#!/usr/bin/env node

process.argv

我们主要从命令行输入值都是从process.argv里面读取,这个对象,保存了我们所有命令行的输入,我们可以打印出来看看

console.log(`process.argv)

1
2
3
4
[ 'node',
'E:\\ProjectGitHub\\node.js\\repl.js',
'-w',
'Helloworld!' ]

从这个输出我们就可以很明了的知道我们为什么要用process.argv.slice(3);来获取值了.

process.stdout && process.stdin

这两个方法用于对终端输出和输入的操作,上面的例子应该很好演示这个使用了,这里就不再赘述了.

求值 & 输出

实战演练

现在要讲的这个repl应用就是简单的在终端中显示前端乱炖的专栏列表.效果如下(PS:绿色那些是debug输出,你自动忽略吧...):

输入 htmljs article 输入 htmljs article -p 1

内容准备

这里用到了request,cheerio 对前端乱炖页面进行解析,这块的讨论已经超出了本文的讨论范围,以后放在介绍cheerio的时候再说这块的实现.

用命令行看前端乱炖专栏列表:

https://github.com/youxiachai/html-js-cli

利用Commander处理输入

对于如何在终端输入参数,在上面的读取篇已经全部介绍完毕,用原生process处理输入异常的繁琐,对于这点,TJ大神写了一个模块commander用来处理.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env node

var program = require('commander'),
htmljscli = require('../index'),
libInfo = require('../package'); program
.version(libInfo.version) program
.command('article')
.description('show article list')
.option('-p, --page [page]', 'article list')
.action(function(options){
htmljscli.listArticle(options.page)
}); program.parse(process.argv); // 这行必须是结尾

不到20行代码就可以解决了原本需要各种处理process.argv 情况,而且还很贴心了帮我们自动生成help介绍

htmljs article -h

使用commander 我们只需要了解一下几点就可以了

  • commander.option()

用于将对象值对象化, 例如上文定义的commander .option('-p, --page [page]', 'article list')我们输入的时候-p 的时候,就可以用options.page 获取我们的参数

  • commander.command().option().action()

用于配置子命令

发布

有时候,一些库会要求我们

npm -g install cnpm

然后很神奇的发现可以

cnpm install xx

这类的操作,那我们发布的包怎么实现这个神奇的魔法呢.原理非常简单,我们只需要在我们的package.json加入以下几句就行

1
2
3
4
5
{
"bin": {
"htmljs": "./bin/htmljscli"
}
}

npm 安装的时候就会自动与当前系统环境进行绑定.

接下来我们只需要

npm -g install html-js-cli

运行

htmljs article

就可以在终端看到专栏列表了

值得注意的时候,在windows发布你写node repl应用,*nix用户安装的时候,命令并不会起作用,所以,要用npm发布repl应用的时候请使用*nix系统

Node repl 应用

豆瓣电台命令行版

https://github.com/turingou/douban.fm

微博命令行工具

http://justan.github.io/twei/

cnpmjs

https://github.com/cnpm/cnpm

用node开发repl应用的更多相关文章

  1. node开发 npm install -g express-generator@4

    Node forever : 1,forever start --uid test start app.js 2,forever start --uid test start -a app.js 3, ...

  2. [转] 使用NVM快速搭建NODE开发环境

    export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node 本文主要介绍最近自己碰到的几个坑以及搜索到的相应解决方案: 如何快速搭 ...

  3. Node.js REPL终端

    REPL表示读取评估和演示打印循环(Read Eval Print Loop),它代表一个命令输入和系统在交互模式的输出响应窗口控制台或Unix/ Linux的shell计算机环境. Node.js附 ...

  4. Node的REPL环境

    1. Node的REPL环境 什么是REPL REPL全称 Read-eval-print-loop,交互式解析器 REPL可以提供给程序员对Node.js的一些api快速测试 REPL的基本操作 定 ...

  5. node开发环境配置

    node开发环境配置 用处 NodeJS——后台 JavaScript-前台 后台其他语言 1.PHP 2.Java 3.Pythonnode优势 1.性能高 nodejs php 86 1s 1分半 ...

  6. 4、Node.js REPL(交互式解释器)

    Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输入命令,并 ...

  7. 手把手教你用Vue2+webpack+node开发一个H5 app

    手把手教你用Vue2+webpack+node开发一个H5 app ​前一篇vue2 + webpack + node 开发一个小demo说到了用vue的一些基本用法,这一篇就讲一个复杂一点的更完整的 ...

  8. Node.js REPL(交互式解析器)

    Node.js REPL(交互式解释器) Node 自带了交互式解释器,可以执行以下任务: 读取 - 读取用户输入,解析输入了Javascript 数据结构并存储在内存中. 执行 - 执行输入的数据结 ...

  9. 15.Node.js REPL(交互式解释器)

    转自:http://www.runoob.com/nodejs/nodejs-tutorial.html Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电 ...

随机推荐

  1. FreeBSD_11 - 系统管理——{ Part_5 - ZFS }

    参考資料 http://docs.oracle.com/cd/E37934_01/html/E36658/toc.html https://www.freebsd.org/doc/en_US.ISO8 ...

  2. Win8 x64环境下VS2010 C#工程运行报错:没有注册类 (异常来自 HRESULT:0x80040154

    来源:http://blog.sina.com.cn/s/blog_7095482001019c2v.html 问题描述: 在Win8 x64环境下,VS2010的C#工程中引用了COM组件(Acti ...

  3. (2015秋) 作业6:(电梯系统之结对编程 I 总分=2*50 分)

    电梯系统 0. 背景 南通大学钟秀校区“主教学楼” 用 2 部电梯(连地下室共9层):每到下课.上课前都特别拥挤,大家希望改进已有的电梯调度算法,满足学生和老师快速乘坐电梯的需要.因此,需要重新设计一 ...

  4. p1304 家族

    描述 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚.如果x,y是亲戚 ...

  5. c++ 操作注册表

    1.       注册表简介 注册表是为Windows NT和Windows95中所有32位硬件/驱动和32位应用程序设计的数据文件,用于存储系统和应用程序的设置信息.16位驱动在Winnt (Win ...

  6. 6.6 Android 编译机制的变迁

    我们使用Java开发android,在编译打包APK文件时,会经过以下流程 Java编译器将应用中所有Java文件编译为class文件(JVM运行的是.class文件,而DVM是.dex文件) dx工 ...

  7. Spring的注入问题

    作下笔记,Spring的注入问题[多个实例问题] 解决方案如下: package student.life.support.platform.service.impl; import javax.an ...

  8. haskell io模块

    haskell中的io模块主要是用于读写文件屏幕的,通过import IO来导入 其中有如下常用定义 data IOMode = ReadMode | WriteMode | AppendMode | ...

  9. 腾讯DBA官方博客开通了

    腾讯DBA官方博客开通了,欢迎交流哈..     http://tencentdba.com   腾讯互娱游戏DBA团队一直致力于为游戏提供稳定.高效的DB运营服务,这是我们团队的使命. 过去DBA团 ...

  10. 个性二维码开源专题<替换元素点>

    基础方法:ChangeFillShape //修改填充形状 ChangeFillShape(...) // 摘要: // 修改填充形状 // // 参数: // g: // 图形画板 // // Fo ...