欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-11 21:32:07
本文实例讲述了node.js api详解之 repl模块用法。分享给大家供大家参考,具体如下:node.js api详解之 replrepl(交互式解释器) 模块提供了一种“读取-求值-输出”循环(r...

本文实例讲述了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程序设计有所帮助。