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


Posted in Javascript onMay 25, 2020

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

Javascript 相关文章推荐
有关js的变量作用域和this指针的讨论
Dec 16 Javascript
myEvent.js javascript跨浏览器事件框架
Oct 24 Javascript
jQuery中setTimeout的几种使用方法小结
Apr 07 Javascript
JQuery页面的表格数据的增加与分页的实现
Dec 10 Javascript
jquery实现图片左右切换的方法
May 07 Javascript
Bootstrap CSS布局之代码
Dec 17 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
Apr 18 Javascript
javascript 通过键名获取键盘的keyCode方法
Dec 31 Javascript
解决vue build打包之后首页白屏的问题
Mar 06 Javascript
如何利用@angular/cli V6.0直接开发PWA应用详解
May 06 Javascript
微信小程序用canvas画图并分享
Mar 09 Javascript
记一次react前端项目打包优化的方法
Mar 30 Javascript
微信小程序仿抖音视频之整屏上下切换功能的实现代码
May 24 #Javascript
如何使用vue slot创建一个模态框的实例代码
May 24 #Javascript
使用React代码动态生成栅格布局的方法
May 24 #Javascript
ES6对象操作实例详解
May 23 #Javascript
ES6函数和数组用法实例分析
May 23 #Javascript
ES6箭头函数和扩展实例分析
May 23 #Javascript
ES6新增的数组知识实例小结
May 23 #Javascript
You might like
PHP获取MAC地址的函数代码
2011/09/11 PHP
基于php iconv函数的使用详解
2013/06/09 PHP
PHP中使用gettext解决国际化问题的例子(i18n)
2014/06/13 PHP
php示例详解Constructor Prototype Pattern 原型模式
2015/10/15 PHP
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
2016/04/01 PHP
Yii框架连表查询操作示例
2019/09/06 PHP
PHP如何获取Cookie并实现模拟登录
2020/07/16 PHP
JavaScript 模仿vbs中的 DateAdd() 函数的代码
2007/08/13 Javascript
用cookies实现的可记忆的样式切换效果代码下载
2007/12/24 Javascript
js前台判断开始时间是否小于结束时间
2012/02/23 Javascript
javascript:void(0)的问题使用探讨
2014/04/10 Javascript
javascript制作的cookie封装及使用指南
2015/01/02 Javascript
JavaScript数据类型检测代码分享
2015/01/26 Javascript
javascript实现动态改变层大小的方法
2015/05/14 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
jQuery实现的左右移动焦点图效果
2016/01/14 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
2016/05/17 Javascript
JavaScript判断是否是微信浏览器
2016/06/13 Javascript
Javascript实现一个简单的输入关键字添加标签效果实例
2017/06/01 Javascript
Javascript实现基本运算器
2017/07/15 Javascript
Node.JS 循环递归复制文件夹目录及其子文件夹下的所有文件
2017/09/18 Javascript
javascript刷新父页面方法汇总详解
2019/10/10 Javascript
python编程开发之textwrap文本样式处理技巧
2015/11/13 Python
对python PLT中的image和skimage处理图片方法详解
2019/01/10 Python
深度辨析Python的eval()与exec()的方法
2019/03/26 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
2019/06/27 Python
Matplotlib使用Cursor实现UI定位的示例代码
2020/03/12 Python
pandas使用之宽表变窄表的实现
2020/04/12 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
专门出售各种儿童读物的网站:Put Me In The Story
2016/08/07 全球购物
英语老师推荐信
2014/02/26 职场文书
师范类求职信
2014/06/21 职场文书
北京导游词
2015/02/12 职场文书
2016年国庆节67周年活动总结
2016/04/01 职场文书
用 Python 元类的特性实现 ORM 框架
2021/05/19 Python
Python趣味挑战之实现简易版音乐播放器
2021/05/28 Python