![bc7e1e46662b16062740ad3e41977f89.png](https://i-blog.csdnimg.cn/blog_migrate/80c70420fa059c39b63e9e587f51c0a0.png)
REPL 其实就是 Read Eval Print Loop 的缩写,中文译名是交互式解释器;其实说白了就是命令行的开发工具,这个也是 Node.js 的基础功能之一,使得我们可以不必借助浏览器环境,直接开发和运行一些无需 GUI 的程序,也就从很多方面上看起来更接近传统的开发语言环境。
今天这一章节就来看看它。
1 介绍
Node.js REPL(Read Eval Print Loop,交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输入命令,并接收系统的响应。
Node 自带了交互式解释器,可以执行以下任务:
- 读取 - 读取用户输入,解析输入了 JavaScript 数据结构并存储在内存中
- 执行 - 执行输入的数据结构
- 打印 - 输出结果
- 循环 - 循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出
Node 的交互式解释器可以很好的调试 JavaScript 代码。
我们可以输入 node 命令来启动 Node 的终端:
![d93ef36a068aa41ed325926214ed625b.png](https://i-blog.csdnimg.cn/blog_migrate/0709bd03b928c30a77b667b0b52490c5.png)
这时我们就可以在 > 后输入简单的表达式,并按下回车键来计算结果。
2 简单的表达式运算
接下来让我们在 Node.js REPL 的命令行窗口中执行简单的数学运算:
![f73a4ad63eed7bf88ef47c63bc562001.png](https://i-blog.csdnimg.cn/blog_migrate/7dfc61a13b517a51b0217a083554ecc5.png)
3 使用变量
我们也可以将数据存储在变量中,并在需要的时候使用它。
变量声明需要使用 var、let、const 等关键字,如果没有使用关键字变量会直接打印出来,并声明为全局变量。
变量可以使用 console.log() 来输出。
![10807e629a6f3f4dde1cabba1b93fc28.png](https://i-blog.csdnimg.cn/blog_migrate/31e616e5da6e4c1aa4b380e4501ff41c.png)
4 多行表达式
Node REPL 支持输入多行表达式,这就有点类似 JavaScript,接下来让我们来执行一个 do-while 循环:
![ab5eac3777e81133f913f0908b38fd66.png](https://i-blog.csdnimg.cn/blog_migrate/07b6e3c8c3673e4b5f6a66440a076d4e.png)
... 三个点的符号是系统自动生成的,回车换行后即可;Node 会自动检测是否为连续的表达式。
5 下划线变量
我们可以使用下划线 _ 获取上一个表达式的运算结果:
![d567da2817907a1a0e36bc673620d447.png](https://i-blog.csdnimg.cn/blog_migrate/11ae66be08bf41d5a426ac816691ce4f.png)
6 REPL 命令
- ctrl + c:退出当前终端
- ctrl + c 按下两次:退出 Node REPL
- ctrl + d:退出 Node REPL
- 向上/向下键:查看输入的历史命令
- tab 键:列出当前命令
- .help:列出使用命令
- .break:退出多行表达式
- .clear:退出多行表达式
- .save filename:保存当前的 Node REPL 会话到指定文件
- .load filename :载入当前 Node REPL 会话的文件内容
7 停止 REPL
前面我们已经提到按下两次 ctrl + c 或者 ctrl + d 键就能退出 REPL,其实还有一种方法,是使用命令 .exit:
![a07d627cce0375d420eaedf03441c9b7.png](https://i-blog.csdnimg.cn/blog_migrate/af9b107e4818d6e19d0c9700140780a8.png)
8 编写命令行程序
其实这里我们不难看出,REPL 本身是和系统的 shell 有关联的,也就是说它也同样可以直接和操作系统进行命令交互,这样我们就可以直接编程,来实现系统的可执行脚本,例如这里有个一句话的 hello.js:
console.log('hello ', process.argv[2]);
我们可以看到参数二是个读取当前进程的参数,如果使用传统的执行方式,比如:
![bb909cab77ad3fa5832cd1d712f5dd2f.png](https://i-blog.csdnimg.cn/blog_migrate/1e96505d0831fa2b0c8b97810bcfd753.png)
就可以获取到第二个参数并生成结果了,虽然这种方式有点繁琐。
如果是 Linux 的话,我们还可以通过在当前目录下新建 package.json ,写入下面的内容:
{
"name": "hello",
"bin": {
"hello": "hello"
}
}
然后执行 npm link 命令,从而进行全局模块链接,使得 hello 成为一个可识别的命令:
npm link
最后直接使用即可:
hello Michael
而 Windows 要想实现就比较复杂,因为 Windows 本身对 .js 有个解释器(Windows Script Host),而直接执行一个 .js 文件的话,就会调用这个解释器,此时它的接口与浏览器和 Node 环境都是很不同的,比如这个直接在控制台显示信息的小程序,直接执行会报错:
![f42a9d3f3a4573a11873f507fefdbb72.png](https://i-blog.csdnimg.cn/blog_migrate/1593a23b07acc0b2a45a21fbf24df37d.png)
故此,为了让 .js 的默认应用成为 Node,我们还需要比较复杂的操作,除非的确有此必要(比如必须经常的开发基于 Node.js 的命令行工具),我个人觉得就别折腾了,直接在命令行里面 node hello 也可以啦,毕竟出于易用性,给最终用户使用的程序都是有 GUI 的,浏览器或者 Electron 的 GUI 不香么?
命令行工具,我会更倾向于使用 Windows 自带的 PowerShell 或者 Linux 的 Bash、Zsh等,原生的命令用起来还是很容易实现批量工作的,对吧。
所以 REPL 对我来说,更像一个可以及时验证自己灵光一现想法的小平台,而在实际进行开发的过程当中,编辑器和运行平台仍然是获取反馈、排错的首选。
当然每个人都有自己的想法,以上仅仅是我自己的想法,不代表大众。