REPL(Read-Eval-Print Loop,读取-求值-输出-循环)是一个简单的交互式编程环境。Node.js 内置了 REPL,让你可以快速测试 JavaScript 代码片段、调试或学习新语法。本章将详细介绍 Node.js REPL 的使用方法和高级技巧。
REPL 是一个交互式 shell,它接受用户输入(表达式),执行后返回结果,并等待下一次输入。许多编程语言都提供 REPL 环境,例如 Python 的交互式 shell、浏览器的开发者工具控制台。Node.js 的 REPL 对于学习和快速原型开发非常有用。
当你在终端中运行 node 命令而不带任何参数时,就会进入 REPL 模式。
打开终端,输入 node 然后按回车:
$ node
>
你会看到 > 提示符,表示 REPL 已准备好接受命令。现在你可以直接输入 JavaScript 代码,并立即看到结果。
> 1 + 2
3
> "Hello" + " " + "World"
'Hello World'
> const name = "Node.js"
undefined
> console.log(`Hello, ${name}!`)
Hello, Node.js!
undefined
注意:const 声明不会产生返回值,所以显示 undefined,而 console.log 执行后返回 undefined,但会先打印输出。
REPL 提供了一些特殊的命令,以点号 . 开头,用于控制 REPL 的行为。以下是常用命令:
.break中断当前输入,返回到主提示符。在输入多行代码时很有用。.clear重置 REPL 上下文,清除所有定义的变量,相当于重启 REPL(但不会退出)。.exit退出 REPL(等同于按 Ctrl+D 两次)。.help列出所有 REPL 命令的帮助信息。.save将当前 REPL 会话中输入的所有内容保存到文件,例如 .save ./my-session.js。.load加载一个 JavaScript 文件并执行,例如 .load ./my-script.js。.editor进入编辑器模式,可以更方便地编写多行代码(见下文)。在普通 REPL 中,如果你想输入多行代码(例如函数定义),可以逐行输入,但 REPL 会检测到语句未完成,自动等待更多输入。例如:
> function add(a, b) {
... return a + b;
... }
undefined
> add(2,3)
5
当一行以左花括号 { 结尾时,REPL 会认为代码块未结束,下一行提示符变为 ...,直到你输入右花括号。
更好的方式是使用 编辑器模式。输入 .editor 命令,REPL 会切换到编辑器模式,提示符变为 // Enter editor mode...,你可以粘贴或输入多行代码,然后按 Ctrl+D 执行,或按 Ctrl+C 取消。
_在 REPL 中,特殊变量 _ 始终保存着上一次表达式的结果:
> 3 + 4
7
> _ + 5
12
> Math.sqrt(16)
4
> _
4
这个特性对于逐步计算非常方便。注意,_ 是只读的,不能手动赋值(会报错)。
在 REPL 中,按下 Tab 键可以自动补全变量名、全局对象或模块。如果输入部分字符后按 Tab,REPL 会列出可能的补全项。如果直接按 Tab(没有任何输入),它会列出所有全局对象和内置模块。
例如,输入 cons 然后按 Tab,可能会补全为 console。如果存在多个匹配项,会列出所有选项。
REPL 会记住你输入过的命令,可以通过上下箭头键浏览历史记录。历史记录默认保存在 ~/.node_repl_history 文件中,下次启动 REPL 时仍可访问。
你可以通过设置环境变量 NODE_REPL_HISTORY 改变历史文件路径,或通过 NODE_NO_READLINE=1 禁用历史记录。但更常见的自定义方式是创建一个自定义的 REPL 脚本。
创建一个 custom-repl.js 文件:
// custom-repl.js
const repl = require('repl');
const r = repl.start({
prompt: 'myapp> ',
useGlobal: true,
ignoreUndefined: true
});
// 添加自定义上下文
r.context.lodash = require('lodash');
r.context.sayHello = () => console.log('Hello from custom REPL!');
运行 node custom-repl.js,你将进入一个提示符为 myapp> 的 REPL,并可以直接使用 lodash 和 sayHello 函数。
在 REPL 中,你可以使用 require() 加载模块,就像在普通脚本中一样。例如:
> const fs = require('fs');
undefined
> fs.readFileSync('file.txt', 'utf8');
'文件内容'
注意:模块只会在当前 REPL 会话中加载,不会影响外部。
.exit 退出 REPL。console 方法: console.log、console.error 等都可以正常工作。global 可以查看所有全局变量。.save 命令)以备后用。
假设你想测试一个 Promise:
> const p = Promise.resolve(42);
undefined
> p.then(console.log);
Promise { <pending> }
> 42 // 异步输出
REPL 会在 Promise 解决后自动打印结果,即使没有显式使用 await。你还可以直接使用 await(Node.js 16+ 支持顶级 await):
> await Promise.resolve(42);
42
Node.js REPL 是一个强大而灵活的工具,可以帮助你快速测试代码、学习新 API 或调试。通过掌握本章介绍的常用命令和技巧,你将能更高效地使用 REPL。在后续教程中,我们会进一步探索 Node.js 的模块系统和 npm,构建更复杂的应用。