天天看点

Nodejs 定制化你自己的REPL

Node 官方提供了 repl 模块,实现一个交互式解析器,它可以作为一个独立程序使用或者嵌入到其它应用中:

node 命令使用

如果你已经安装了 node,那么你可以在命令行直接输入 node 命令便可以进入一个交互式 javascript 命令行界面,这里你可以敲一些 javascript 表达式,甚至你都可以把它当成计算器使用:

$ node
> new Date()
2018-12-06T03:30:46.242Z
> 3 + 5
8
>
           

在交互式命令行中当你输入 .help 命令,你会发现它提供了几个简单且方便的交互命令:

> .help
.break    Sometimes you get stuck, this gets you out
.clear    Alias for .break
.editor   Enter editor mode
.exit     Exit the repl
.help     Print this help message
.load     Load JS from a file into the REPL session
.save     Save all evaluated commands in this REPL session to a file
>

           
  • .break: 在输入一个多行表达式的过程中,输入 .break 命令(或按下 -C 组合键)将终止表达式的继续输入。
  • .clear: 重置 REPL 的 context 为一个空对象,并清除当前正输入的所有多行表达式。
  • .exit: 关闭输入输出流,退出 REPL。
  • .help: 显示特定命令的帮助列表。
  • .save: 保存当前 REPL 会话到一个文件: > .save ./file/to/save.js
  • .load: 读取一个文件到当前 REPL 会话。 > .load ./file/to/load.js
  • .editor: 进入编辑模式(-D 完成,-C 取消)

在交互式命令中,我们也可以使用如下组合键:

  • -C:当按下一次时,与 .break 命令的效果一样,当在空白行按下两次时,与 .exit 命令的效果一样;
  • -D: 与 .exit 命令的效果一样;
  • :当在空白行按下时,显示全局和本地作用域内的变量,当在输入时按下,显示相关的自动补全选项;

如果你想要在交互式命令里获取上一条命令的执行结果,可以直接输入“_”:

> 3 + 3
6
> _
6
           

定制自己的 node repl

如果你觉得官方的 node 命令行还不能满足你的需求,你可以使用repl模块来定制化你自己的交互式命令行,repl 模块提供了一个 start 函数,可以创建并启动一个 repl 实例。

比如我们在使用官方的 repl 时,想要使用 lodash 里面的函数,每次总要把写一行代码 _ = require(‘lodash’),非常麻烦,这个时候我们就可以定制自己的 repl,每次启动时绑定一些全局变量到 context 上,repl.start 函数返回一个 REPLServer 类的实例,该实例上面有一个 context 属性,用于存放当前 repl 的全局变量,我们在启动时给把一些常用模块加载到这个 context 上,便可以方便的解决该问题。代码如下:

#!/usr/bin/env node

const repl = require('repl');
//用于制定命令行提示符
let r = repl.start('<node>');

Object.assign(r.context, {
    lodash: require('lodash'),
    moment: require('moment')
})

           

start函数还提供了许多其它有用的选项,比如定制你的输入,输出的来源等功能,详细可以看 node 官方文档

参考文献

  • nodejs里的repl
  • repl2模块
  • repl官方文档
  • Node.js定制REPL的妙用