跳转至

Node 的 REPL 环境

简介

REPL 是 read-eval-print-loop 的缩写,表示命令行下的 Node 引擎的一个互动式对话环境。用户在其中输入命令,就可以立刻看到结果。read 表示读取用户的输入,eval 表示执行,print 表示输出运行的结果,loop 表示重复执行这个过程。

命令行下输入node,就可以进入 Node 的 REPL 环境。

$ node
> 

REPL 环境的提示符是一个大于号(>)。

退出 REPL,可以在行首按下 Ctrl + d,或者连续两次按下 Ctrl + c。

REPL 环境与 Node 脚本的执行环境基本相似,只有一些很小的差异。比如,REPL 环境不是通过脚本触发的,所以没有__dirname__filename这两个内置变量。

REPL 会自动加载 Node 的核心模块,比如 fs、http、os、path等,不必require就可以直接使用。

$ node 
> fs.read
[Function]

上面代码中,REPL 环境可以直接使用fs.read方法,不必先加载fs模块。

node命令的-e参数,实际上就是在 REPL 环境运行代码。

$ node -e "console.log(os.platform())"
darwin

_变量

REPL 环境下,有一个内置变量_,上一个表达式的值就存放在这个变量之中。

> require('./example');
{ some: 'some text' }
> _.some
'some text'

上面代码中,require()方法加载了一个脚本,这行表达式的值就自动存放在_里面。

REPL 允许用户对_变量赋值。

> _ = 'something'
'something'
> _
'something'

上面代码中,我们将something赋值给_,这时_就是一个普通变量了。

.editor 命令

REPL 环境下,按下回车键,就会提交并执行当前的输入。这对输入多行的代码非常不方便,有两个办法可以输入多行代码。一个是按 Shift + 回车键,另一个是使用.editor命令,键入编辑模式。

> .editor
function sum(a, b) {
  return a + b;
}

sum(5, 4);

输入.editor命令后,就可以输入多行文本。输入完成后,按下 Ctrl + d 就会执行这些代码;按下 Ctrl + c 就会取消本次输入,回到输入.editor之前的状态。

特殊命令

除了.editor命令以外,REPL 还提供其他一些命令。

  • .break:按下 Shift + 回车进入多行文本输入的过程中,输入.break命令会取消本次输入,相当于按下 Ctrl + c。
  • .clear:重置 REPL 上下文为空,并清除当前输入的多行文本。
  • .exit:关闭当前的 I/O 读写,退出 REPL 环境。
  • .help:显示 REPL 环境的特殊命令列表。
  • .save:将当前的 REPL 对换保存成一个文件,比如.save ./file/to/save.js
  • .load:加载一个文件进入当前的 REPL 对话,比如.load ./file/to/load.js

repl 模块

Node 提供repl模块,可以在脚本中唤起 REPL 环境。

// repl.js
const repl = require('repl');

// Our own prompt
repl.start('Code:: ');

上面代码中,repl.start()方法用于唤起 REPL 环境,该方法的参数是自定义的 REPL 环境提示符。执行上面的脚本,就会出现这个提示符。

$ node repl.js
Code::

这个模块允许开发者向 REPL 环境注入变量,因此可以做很多事情。

// repl.js
const repl = require('repl');
const r = repl.start('Code:: ');
r.context.sum = (...args) => args.reduce((a, b) => a + b, 0);

上面代码向 REPL 环境输入了一个sum函数。

$ node repl.js
Code:: sum(1, 2, 3)
6
Code:: .exit

参考链接