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程序设计有所帮助。