- 教程
- 文档
【免费下载链接】jstutorial
Javascript tutorial book
本文整理自 jstutorial(JavaScript 标准参考教程)Node.js 章节的《repl》文档,并对照同章节的《Node.js 概述》等资料做了补充。读完本文,你将掌握两种 REPL 用法:一是直接在命令行运行
node进入交互式环境,用来快速验证表达式、调试模块;二是通过内置的repl模块,在自己的 Node 程序内部嵌入一个可交互的 REPL 会话,并通过context对象向会话注入自定义变量。所有命令与代码示例均可直接复制运行。
REPL 环境是什么
REPL 是 Read-Eval-Print Loop 的缩写,中文可译为"读取-求值-输出"循环(见 Node.js 概述)。REPL 环境是一个互动式的 Node 命令解释环境:用户从键盘输入命令,环境读取(Read)后立刻求值(Eval),再把结果输出(Print)到屏幕,然后回到循环(Loop)等待下一条输入。
$ node > 1+1 2 >在 Node.js 概述 一节中,这种用法被描述为"在命令行键入 node 命令,后面没有文件名,就进入一个 Node.js 的 REPL 环境"。
REPL 的典型用途包括:
- 快速验证一段 JavaScript 语法或表达式,无需新建脚本文件;
- 即时调用 Node 内置模块的 API,探索其行为;
- 在调试阶段与运行中的程序交互。
进入与退出 REPL 环境
进入 REPL
直接执行node命令(不带任何脚本文件名),就能进入 REPL 环境:
$ node >大于号(>)就是 REPL 环境的提示符(prompt)。在这里可以直接输入 JavaScript 代码,回车后立刻得到结果:
$ node > 1 + 1 2 >以严格模式进入
如果希望 REPL 在严格模式下运行,可以使用--use_strict参数(参见 Node.js 概述):
$ node --use_strict退出 REPL
退出 REPL 环境有两种方式:
- 在行首按下
Ctrl + D; - 输入点命令
.exit。
$ node > .exit $遍历历史命令
REPL 是 Node.js 与用户互动的 shell,各种基本的 shell 功能都可以在里面使用,比如使用上下方向键遍历曾经使用过的命令(参见 Node.js 概述)。
表达式与语句的区别
在 REPL 中,输入一个表达式会直接返回结果,因为表达式有返回值;输入一条语句则没有任何输出,因为语句没有返回值。
> x = 1 1 > var x = 1 >上面代码中,第二条命令(var x = 1)没有显示任何结果,因为它是一条语句而不是表达式。这是 REPL 新手最容易困惑的一个行为,值得记住:想在 REPL 里看到结果,就输入表达式,而不是语句。
自动加载内置模块
REPL 环境的一个显著特点是:自动加载 Node 的所有内置模块。也就是说,不需要先执行require(),就可以直接使用模块名调用 API。
举例来说,如果要执行require('os').arch(),在 REPL 里可以直接输入os.arch():
> os.arch() 'x64'这一特性让 REPL 非常适合快速探查 Node 内置模块(os、path、fs、http等)的接口。当然,对于非内置模块或自定义模块,仍然需要显式使用require()加载,有关require的加载规则可以参阅 CommonJS 规范。
另外需要留意的是 REPL 中全局变量的行为:在模块文件中,var x = 1声明的变量是模块私有的,不会成为global对象的属性;但 REPL 环境的行为与浏览器一致,var x = 1等同于设置全局属性(参见 Node.js 概述)。
命令历史:~/.node_repl_history
REPL 环境执行的所有命令,都保存在~/.node_repl_history文件之中。这样,退出后重新进入 REPL,依然可以通过方向键翻出之前输入过的命令。
如果想停止写入历史文件,可以将环境变量NODE_REPL_HISTORY设为空字符串:
$ NODE_REPL_HISTORY= node在命令行中,环境变量设置在node之前,只对本次启动的 REPL 会话生效。对应地,Node 还支持NODE_REPL_HISTORY_SIZE环境变量来限制写入历史文件的命令条数,防止文件无限增长。
_变量:上一个表达式的执行结果
在 REPL 环境里,下划线(_)是一个特殊变量,保存的是上一个表达式的执行结果。
> 2 + 3 5 > _ 5它还可以继续参与运算:
> 1 + 1 2 > _ + 1 3上面的写法(_ + 1)在 Node.js 概述 中也有演示。利用_,可以在不重新输入整个表达式的情况下,基于上一次的结果做增量计算。
点命令(dot commands)
以句点开头的命令称为点命令,是 REPL 环境提供的会话级指令,用于管理当前会话。
.exit
.exit命令用于退出 REPL 环境,效果与在行首按下Ctrl + D相同:
$ node > .exit $.load
在 REPL 之中,输入.load someFile.js会执行当前目录下的脚本文件,常用来预先加载并设置一批常量或工具函数:
> .load config.js执行后,脚本中通过赋值或声明产生的变量,即可在本次会话中继续使用,适合把常用的配置值、测试数据一次性载入交互环境。
其他常用点命令
除了文档中介绍的.exit和.load,Node 的 REPL 还提供了一组标准的会话命令,在提示符后输入.help可以随时查看完整列表。常见的有:
| 命令 | 作用 |
|---|---|
.help | 显示所有可用的点命令列表 |
.save <file> | 把当前会话输入过的命令保存到指定文件 |
.clear | 重置 REPL 的上下文(清空context中注入的自定义变量) |
.editor | 进入多行编辑器模式,方便编写较长的代码块 |
.break | 终止当前多行输入,回到提示符状态 |
repl 模块:在程序内提供 REPL 环境
repl模块用于在程序内部提供一个 REPL 在线环境。这在很多场景下非常有用,例如:
- 为服务器程序提供一个运行时管理控制台;
- 开发阶段把应用内部状态暴露为可交互调试入口;
- 构建 CLI 工具时让用户与程序实时对话。
基本用法:repl.start()
repl模块的核心方法是repl.start()。下面是最简单的用法(原文档示例):
var repl = require('repl'); function a(i) { var context = repl.start('repl> ').context; context.pi = 3.14; context.arg = i; } a(3)运行这段代码后,程序会进入一个提示符为repl>的 REPL 会话,context对象中注入的pi和arg属性,都可以在 REPL 环境内直接读取:
// repl> pi // 3.14 // repl> arg // 3 // repl>代码的关键点有两个:
repl.start()的返回值是 REPLServer 实例。repl.start('repl> ')这种写法,是把字符串参数直接作为提示符(prompt)。- REPLServer 实例的
context属性,就是这个 REPL 会话的全局上下文对象。给它添加属性(如context.pi = 3.14),等同于在 REPL 环境里声明全局变量;反过来,在 REPL 里执行的赋值也会反映到context上。这正是在程序与交互会话之间共享状态的桥梁。
repl.start() 的可选参数
除了直接传入字符串作为提示符,repl.start()更完整的用法是传入一个选项对象:
repl.start({ prompt: 'node> ', // 提示符,默认是 '> ' input: process.stdin, // 输入流,默认是 process.stdin output: process.stdout, // 输出流,默认是 process.stdout terminal: true, // 是否为终端会话,true 时启用方向键历史、Tab 补全等交互能力 useGlobal: false, // 是否使用 global 对象作为上下文(默认 false,使用独立的 context) ignoreUndefined: false, // 表达式结果为 undefined 时是否仍输出 eval: null, // 自定义求值函数,可以接管每条命令的解析与执行 writer: null // 自定义结果格式化函数,控制求值结果的输出形式 });其中prompt参数对应原文档"repl.start方法还可以通过参数,定制提示符"的说明。通过input/output参数,还可以把 REPL 挂接到任意可读流 / 可写流上,例如在 Socket 连接上提供远程调试控制台;通过eval参数则可以自定义命令的解释执行逻辑,实现语法增强或 DSL。
在 REPL 中加载模块
repl模块提供的环境与命令行 REPL 一样,会预加载 Node 的内置模块,因此可以直接使用os.arch()、path.join()这类调用。需要加载自定义模块时,在会话中执行require('./my-module')即可,加载规则与普通脚本一致(参见 CommonJS 规范)。
小结
- 命令行 REPL:直接运行
node进入,>为提示符,Ctrl + D或.exit退出;内置模块自动加载,_保存上一个表达式的结果,.load可执行脚本文件,命令历史持久化在~/.node_repl_history(可用NODE_REPL_HISTORY环境变量关闭)。 - repl 模块:通过
repl.start()在程序内启动 REPL 会话,返回的实例的context属性用于向会话注入和读取全局变量,是程序与交互环境通信的枢纽。
无论是要快速验证一段代码、调试某个模块的行为,还是为自己的应用搭建一个运行时交互入口,REPL 都是 Node.js 开发中值得熟练掌握的基础工具。与 REPL 相关的更多 Node 基础知识(如模块加载、全局对象、--use_strict严格模式),可以继续阅读仓库中的 Node.js 概述 与 CommonJS 规范。
- 教程
- 文档
【免费下载链接】jstutorial
Javascript tutorial book
相关推荐
PhoneGap Facebook Plugin 核心 API 详解:从登录到 Graph 调用的完整流程
PhoneGap Facebook Plugin 核心 API 详解:从登录到 Graph 调用的完整流程 PhoneGap Facebook Plugin 是
移动开发Porffor REPL实现:交互式环境构建
Porffor REPL实现:交互式环境构建 还在为JavaScript代码调试而烦恼?Porffor REPL为你提供即时编译体验,让代码测试变得简单高效!读
编译器语言运行时开发工具EdgeDB REPL 交互式查询环境使用指南
EdgeDB REPL 交互式查询环境使用指南 什么是 EdgeDB REPL EdgeDB REPL Read Eval Print Loop 是一个强大的交
数据库图数据库关系型数据库
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考