当前位置:首页 >> 网络编程

Node.js API详解之 repl模块用法实例分析

本文实例讲述了Node.js API详解之 repl模块用法。分享给大家供大家参考,具体如下:

Node.js API详解之 repl

repl(交互式解释器) 模块提供了一种“读取-求值-输出”循环(REPL)的实现,它可作为一个独立的程序或嵌入到其他应用中。
可以通过以下方式使用它:

const repl = require('repl');

Node.js 自身也使用 repl 模块为执行 JavaScript 代码提供交互接口。
可以通过不带任何参数(或使用 -i 参数)地执行 Node.js 二进制文件来使用它:

$ node
> const a = [1, 2, 3];
undefined
> a
[ 1, 2, 3 ]
> a.forEach((v) => {
...  console.log(v);
...  });
1
2
3

repl.start([options])

说明:

该属性的值为当前系统的路径分隔符。Windows下是:”;“ POSIX下是:”:“
repl.start() 方法创建并启动一个 repl.REPLServer 实例。
如果 options 是一个字符串,则它指定了输入提示符:
options:
prompt:要显示的输入提示符。默认为 >(末尾有一个空格)
input:REPL 输入要被读取的可读流。默认为 process.stdin
output:REPL 输出要被写入的可写流。默认为 process.stdout
terminal:如果为 true,则指定 output 应被当作一个 TTY 终端,并且可以使用 ANSI/VT100 转义码写入。 默认值为初始化时 output 流的 isTTY 属性的值。
eval: 当解释每行输入时使用的函数。默认为 JavaScript eval() 函数的异步封装。 eval 函数出错时会返回 repl.Recoverable,表明输入不完整并提示用户完成输入
useColors:如果为 true,则指定默认的 writer 函数可以在 REPL 输出中包含 ANSI 颜色风格。 如果提供了自定义的 writer 函数,则该参数无效。 默认为 REPL 实例的 terminal 属性的值。
useGlobal:如果为 true,则指定默认的解释函数使用 JavaScript global 作为上下文,而不是为 REPL 实例创建一个新的独立的上下文。
ignoreUndefined:如果为 true,则指定默认的输出器不会输出命令返回的 undefined 值。 默认为 false。
writer:写入到 output 之前,该函数被调用用来格式化每个命令的输出。 默认为 util.inspect()。
completer:选的函数,用来自定义 Tab 键的自动补全。
breakEvalOnSigint:当接收到 SIGINT 时停止解释当前代码,比如按下 Ctrl+C。 不能与自定义的 eval 函数同时使用。 默认为 false。
replMode:个标志位,指定默认的解释器使用严格模式或默认(sloppy)模式来执行 JavaScript 命令。 可选的值有:
repl.REPL_MODE_SLOPPY – 使用默认模式解释表达式。
repl.REPL_MODE_STRICT – 使用严格模式解释表达式。该模式等同于在每个 repl 声明前加上 ‘use strict'
repl.REPL_MODE_MAGIC – 不推荐使用
如果 options 是一个字符串,则它指定了输入提示符

demo:

const repl = require('repl');
// 一个 Unix 风格的提示符
repl.start('$ ');

REPLServer 类

说明:

该属性的值为当前系统的路径分隔符。Windows下是:”;“ POSIX下是:”:“
repl.REPLServer 类继承自 readline.Interface 类。
repl.REPLServer 的实例由 repl.start() 方法创建,不能直接使用 JavaScript 的 new 关键字创建。

replServer.defineCommand(keyword, cmd)

说明:

该属性的值为当前系统的路径分隔符。Windows下是:”;“ POSIX下是:”:“
replServer.defineCommand() 方法用于添加新的前缀为 . 的命令到 REPL 实例。
这些命令通过输入一个 . 加 keyword 来调用。 cmd 可以是一个函数或一个具有以下属性的对象:
help:当键入 .help 时显示的帮助说明(可选)。
action:要执行的函数,可接受一个字符串参数。

demo:

const repl = require('repl');
const replServer = repl.start({ prompt: '> ' });
replServer.defineCommand('sayhello', {
 help: '打招呼',
 action(name) {
  this.lineParser.reset();
  this.bufferedCommand = '';
  console.log(`你好,${name}!`);
  this.displayPrompt();
 }
});
replServer.defineCommand('saybye', function saybye() {
 console.log('再见!');
 this.close();
});

replServer.displayPrompt([preserveCursor])

说明:

该属性的值为当前系统的路径分隔符。Windows下是:”;“ POSIX下是:”:“
replServer.displayPrompt() 方法会让 REPL 实例做好用户输入的准备,打印配置的 prompt 到 output 中新的一行,然后返回 input 等待新的输入。
当正在键入多行输入时,会打印省略号而不是提示符。
当 preserveCursor 为 true 时,游标位置不会被复位到 0。
replServer.displayPrompt 方法主要被使用 replServer.defineCommand() 方法注册的命令的 action 函数调用。

reset 事件

说明:

该属性的值为当前系统的路径分隔符。Windows下是:”;“ POSIX下是:”:“
当 REPL 的上下文被重置时,触发 ‘reset' 事件。
每当接收到 .clear 命令时会触发该事件,除非 REPL 正在使用默认的解释器并且 repl.REPLServer 实例被创建时 useGlobal 选项被设为 true。
监听器的回调函数被调用时会带上 context 对象作为惟一的参数。
这主要被用于重新初始化 REPL 上下文,使之达到某些预定义的状态,如下面的例子:

demo:

const repl = require('repl');
function initializeContext(context) {
 context.m = 'test';
}
const r = repl.start({ prompt: '> ' });
initializeContext(r.context);
r.on('reset', initializeContext);
// $ ./node example.js
// > m
// 'test'
// > m = 1
// 1
// > m
// 1
// > .clear
// Clearing context...
// > m
// 'test'
// >

exit 事件

说明:

该属性的值为当前系统的路径分隔符。Windows下是:”;“ POSIX下是:”:“
当接收到 .exit 命令、或按下两次 ctrl + C 发出 SIGINT 信号、或按下 ctrl+D 发出 ‘end' 信号而使 REPL 被退出时,
触发 ‘exit' 事件。 监听器的回调函数被调用时不带任何参数。

demo:

replServer.on('exit', () => {
 console.log('从 REPL 接收到 "exit" 事件!');
 process.exit();
});

命令与特殊键

说明:

该属性的值为当前系统的路径分隔符。Windows下是:”;“ POSIX下是:”:“
所有 REPL 的实例都支持下列特殊命令:
.break – 在输入一个多行表达式的过程中,输入 .break 命令(或按下 ctrl-C 组合键)将终止表达式的继续输入。
.clear – 重置 REPL 的 context 为一个空对象,并清除当前正输入的所有多行表达式。
.exit – 关闭输入输出流,退出 REPL。
.help – 显示特定命令的帮助列表。
.save – 保存当前 REPL 会话到一个文件: > .save ./file/to/save.js
.load – 读取一个文件到当前 REPL 会话。 > .load ./file/to/load.js
.editor 进入编辑模式(ctrl-D 完成,ctrl-C 取消)
REPL 中下列按键组合有特殊作用:
ctrl + C – 当按下一次时,与 .break 命令的效果一样。当在空白行按下两次时,与 .exit 命令的效果一样。
ctrl + D – 与 .exit 命令的效果一样。
tab – 当在空白行按下时,显示全局和本地作用域内的变量。当在输入时按下,显示相关的自动补全选项。

demo:

> .editor
// 进入编辑模式(^D 完成,^C 取消)
function welcome(name) {
 return `你好 ${name}!`;
}
welcome('Node.js 用户');
// ^D
'你好 Node.js 用户!'
>

自定义的解释函数

说明:

该属性的值为当前系统的路径分隔符。Windows下是:”;“ POSIX下是:”:“
当创建一个新的 repl.REPLServer 时,可以提供一个自定义的解释函数。 这可以用于实现完全定制化的 REPL 应用。
例子,一个执行文本翻译的 REPL:

demo:

const repl = require('repl');
const { Translator } = require('translator');
const myTranslator = new Translator('en', 'fr');
function myEval(cmd, context, filename, callback) {
 callback(null, myTranslator.translate(cmd));
}
repl.start({ prompt: '> ', eval: myEval });

自定义 REPL 输出

说明:

该属性的值为当前系统的路径分隔符。Windows下是:”;“ POSIX下是:”:“
默认情况下,在把输出写入到提供的可写流(默认为 process.stdout)之前,
repl.REPLServer 实例会使用 util.inspect() 方法对输出进行格式化。
使用 util.inspect() 方法时,useColors 选项可被指定是否在建立默认输出器时使用 ANSI 风格的代码给输出上色。
在构造时,通过在 writer 选项传入一个新的函数,可以完全地自定义一个 repl.REPLServer 实例的输出。
例子,把输入的任何文本转换为大写:

demo:

const repl = require('repl');
const r = repl.start({ prompt: '> ', eval: myEval, writer: myWriter });
function myEval(cmd, context, filename, callback) {
 callback(null, cmd);
}
function myWriter(output) {
 return output.toUpperCase();
}

希望本文所述对大家node.js程序设计有所帮助。