Node.js REPL(交互式解释器)
Node.js 中 REPL 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输入命令,并接收系统的响应。 Node 自带了交互式解释器,可以执行以下任务:
Node 自带了交互式解释器,可以执行以下任务:
- 读取:读取用户输入,解析输入了Javascript 数据结构并存储在内存中。
- 执行 :执行输入的数据结构。
- 打印 :输出结果。
- 循环 :循环操作以上步骤直到用户两次按下 Ctrl-c按钮退出。
repl模块介绍
repl模块提供了一种“读取-求值-输出”循环的实现,可以作为一个独立的程序或嵌入到其他应用中。
repl模块的引入方式如下所示:
const repl = require('repl');
repl 模块导出了 repl.REPLServer 类,当 repl.REPLServer 实例运行时,它接收用户输入的每一行,根据用户定义的解释函数解释这些输入,然后输出结果。输入可以是 stdin
,输出可以是 stdout
,或者也可以连接到其他任何 Node.js 流。
repl.REPLServer 实例支持输入的自动补全、精简 Emacs 风格的行编辑、多行输入、ANSI 风格的输出、当前 REPL 会话状态的保存与恢复、错误校正、以及可定制的解释函数。
命令与特殊键
所有 REPL 的实例都支持下列特殊命令:
-
.break
:在输入一个多行表达式的过程中,输入.break
命令将终止表达式的继续输入。 -
.clear
: 重置 REPL 的context
为一个空对象,并清除当前正输入的所有多行表达式。 -
.exit
:关闭输入输出流,退出 REPL。 -
.help
:显示特定命令的帮助列表。 -
.save
:保存当前 REPL 会话到一个文件。 -
.load
:读取一个文件到当前 REPL 会话。 -
.editor
:进入编辑模式(<ctrl>-D
完成,<ctrl>-C
取消)。
REPL 中下列按键组合有特殊作用:
-
<ctrl>-C
:当按下一次时,与.break
命令的效果一样。当在空白行按下两次时,与.exit
命令的效果一样。 -
<ctrl>-D
:与.exit
命令的效果一样。 -
<tab>
:当在空白行按下时,显示全局和本地作用域内的变量。当在输入时按下,显示相关的自动补全选项。
简单的表达式运算
我们可以在Node.js REPL的命令行窗口执行简单的数学运算。
示例:
例如向命令窗口输入node
命令,按下回车键,就可以在里面进行数学运算啦:
$ node
> 1+2
3
>10-(5*2)+3
3
大家自己试一下呀,比较简单,所以这里就不上效果图了。
使用变量
在 REPL 的命令行窗口声明变量需要使用 var 关键字,如果没有使用 var 关键字则会直接打印出来。
想要输出变量的值可以使用 console.log()方法。
示例:
$node
> var a = 1
undefined
> a = 1
1
> console.log(a)
1
undefined
默认的解释器会把最近一次解释的表达式的结果赋值给变量 _
(下划线)。 显式地设置 _
为某个值能禁用该特性。
$node
>5
5
>_ + 6
11
>1+1
2
>_
2
多行表达式使用
Node REPL 支持输入多行表达式。
示例
$node
>a = 1
>if (a = 1){
...console.log(a)
...}
1
undefined
上述代码中三个点的符号是系统自动生成的,需要换行直接按回车就可以,Node 会自动检测是否为连续的表达式。
REPLServer 类中的事件的使用
exit事件
当接收到 .exit
命令、或按下两次 <ctrl>-C
发出 SIGINT
信号、或按下 <ctrl>-D
发出 'end'
信号而使 REPL 被退出时,触发 'exit'
事件。 监听器的回调函数被调用时不带任何参数。
replServer.on('exit', () => {
console.log('exit事件');
process.exit();
});
reset事件
当 REPL 的上下文被重置时,触发 'reset'
事件。每当接收到 .clear
命令时会触发该事件,除非 REPL 正在使用默认的解释器并且 repl.REPLServer
实例被创建时 useGlobal
选项被设为 true
。 监听器的回调函数被调用时会带上 context
对象作为惟一的参数。
var repl = require('repl');
function initializeContext(context) {
context.x = 'test';
}
var r = repl.start({ prompt: '> ' });
initializeContext(r.context);
r.on('reset', initializeContext);
当代码被执行时,全局的 'x'
变量可以被修改,但随后的 .clear
命令会把它重置回初始值:
> node test.js
>x
'test'
> x = 5
5
>x
5
> .clear
Clearing context...
> x
'test'