简介
读-评-印循环(REPL)是一个术语,指的是一个交互式计算机环境,它接受用户的输入,执行它,并返回输出。即,用户输入一个或多个表达式,这些表达式被评估,并显示一个结果。
事实是,作为一个开发人员,你以前可能已经使用过REPL环境,但不知道它叫什么。REPL的常见例子包括。
- CLI/terminals
- 外壳环境(例如,Python外壳、MySQL外壳
- 浏览器devtool控制台
在本文中,我们将学习 REPL 的内部工作原理,如何使用 Node.js 内置的 REPL,最后是如何在 Node.js 中设置自定义的 REPL 环境。
REPL如何工作
REPL的工作原理非常简单明了。首先,它读取用户输入的一段或一个代码块,然后评估该代码。评估过程完成后,结果输出被打印给用户,这个过程不断重复(循环),直到用户发出退出信号。
Node.js的REPL
Node.js捆绑了一个REPL环境,允许你快速测试和探索JavaScript代码,而不必将其存储在文件中。
在你运行这个环境之前,你需要在你的开发机器上安装Node.js;你可以按照这里的说明安装Node.js。
如果你已经安装了Node.js,你不需要安装任何额外的软件,你可以通过在终端输入以下命令来启动REPL环境。
node
根据你所安装的Node的版本,你应该看到类似于下面的输出。
控制台中显示的 **>
**符号显示在控制台中,表明 REPL 现在处于活动状态,你可以输入任何 JavaScript 代码,以便立即进行评估。
让我们通过使用全局console.log
方法打印 "Hello world "来试试。在你的Node REPL中输入以下代码。
console.log("Hello World 👋");
你应该看到下面的输出显示。
在Node.js中创建一个自定义REPL
Node.js还允许开发人员使用repl
模块创建和使用自定义REPL。这是用来创建随Node.js提供的默认REPL的同一个包,所以它确实提供了我们可能需要的所有可定制的选项。
此外,这是一个内置的模块。也就是说,我们无需进一步安装就可以使用它。
要在我们的程序中导入该模块。
const repl = require('repl');
启动REPL
我们可以用repl.start()
方法创建一个新的rep实例。该方法接受两个参数 - 第一个是用于REPL提示的字符串(默认为 >
),而第二个是REPL监听的流(用户输入)。
要尝试这一点,请创建一个新文件(app.js
),并粘贴以下代码。
const repl = require("repl");
repl.start("custom-repl => ");
保存该文件,并从你的CLI运行该代码。
node app.js
你应该看到以下输出。
而且,是的,这与默认的Node REPL工作方式相同。你可以尝试在REPL中输入基本的JavaScript代码--如console.log("Hello world")
,你应该看到显示的输出。
全局和局部范围
默认情况下,新的 REPL 实例可以访问在 Node.js 全局范围内声明的所有变量,也可以通过明确地将一个局部变量分配给context
对象而将其暴露给 REPL。
const repl = require("repl");
/* this can be accessed directly from repl without exposing it to repl context */
global.globalVariable = "This can be accessed anywhere!";
const name = "John Doe";
// exposing local variable to repl context
repl.start("custom-repl => ").context.name = name;
另外,暴露在repl
上下文中的变量默认不是只读的,它们可以直接从REPL环境中被修改。我们可以通过像下面这样定义上下文属性来改变这一点。
const repl = require("repl");
const name = "John Doe";
const r = repl.start("custom-repl => ");
Object.defineProperty(r.context, "name", {
configurable: false,
enumerable: true,
value: name,
});
自定义评估函数
REPL模块还允许你创建一个自定义评估函数;即评估每一行输入时使用的函数。当你试图建立完全定制的 REPL 应用程序时,这可能很方便。
下面是一个例子,它检查用户输入是偶数还是奇数,并根据输入打印相应的输出。
const repl = require("repl");
function isEven(uInput, context, filename, callback) {
callback(null, uInput % 2 == 0 ? "Even number" : "odd number");
}
repl.start({ prompt: "custom-repl => ", eval: isEven });
定制 REPL 输出
我们还可以自定义从我们的 REPL 返回的输出,方法是在创建一个新的 **writer
**选项,同时创建一个新的repl
实例。
下面的代码将我们前面的例子中返回的输出大写,并使用npmcolors.js模块,它还将文本颜色改为红色。
const repl = require("repl");
const colors = require("colors");
const r = repl.start({ prompt: "custom-repl => ", eval: isEven, writer: modifyOutput });
function isEven(uInput, context, filename, callback) {
callback(null, uInput % 2 == 0 ? "Even number" : "odd number");
}
function modifyOutput(output) {
return output.toUpperCase().red;
}
下面是输出结果的样子。
关闭REPL
虽然你可以通过按下Ctrl+C
键或直接输入.exit
命令来停止REPL环境的运行,但你也可以通过repl.close()
方法以编程方式完成这一工作。
下面是一个在五秒钟后自动关闭REPL的例子。
const repl = require("repl");
const r = repl.start("custom-repl => ");
setTimeout(() => {
r.close();
}, 5000);
结论
REPL是一个交互式计算机环境,它接受用户的输入,执行它,并返回一个输出。如果你想探索代码样本而不必将其存储在文件中,REPL也是文本编辑器的一个很好的替代品。
在这篇文章中,我们了解了REPL的内部工作原理,如何使用Node内置的REPL环境,以及最后如何在Node.js中创建一个自定义REPL。
The postCreating a custom REPL for Node.jsappeared first onLogRocket Blog.