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 相关文章推荐
javascript获取当前ip的代码
May 10 Javascript
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
Jul 18 Javascript
jquery特效 幻灯片效果示例代码
Jul 16 Javascript
禁用JavaScript控制台调试的方法
Mar 07 Javascript
详解js闭包
Sep 02 Javascript
继续学习javascript闭包
Dec 03 Javascript
基于javascript制作经典传统的拼图游戏
Mar 22 Javascript
web.js.字符串与正则表达式操作
May 13 Javascript
原生JS实现N级菜单的代码
May 21 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
Sep 27 Javascript
利用node.js如何创建子进程详解
Dec 09 Javascript
axios封装与传参示例详解
Oct 18 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 fastcgi模式上传大文件(大约有300多K)报错
2014/09/28 PHP
php实现的PDO异常处理操作分析
2018/12/27 PHP
file模式访问网页时iframe高度自适应解决方案
2013/01/16 Javascript
文本框中禁止非数字字符输入比如手机号码、邮编
2013/08/19 Javascript
JQuery中extend使用介绍
2014/03/13 Javascript
JavaScript将取代AppleScript?
2014/09/18 Javascript
JavaScript中数据结构与算法(三):链表
2015/06/19 Javascript
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
2015/08/21 NodeJs
jquery+CSS3模拟Path2.0动画菜单效果代码
2015/08/31 Javascript
jQuery获取浏览器类型和版本号的方法
2016/07/05 Javascript
jQuery.Form上传文件操作
2017/02/05 Javascript
Angular实现的简单定时器功能示例
2017/12/28 Javascript
解决linux下node.js全局模块找不到的问题
2018/05/15 Javascript
ES6 迭代器与可迭代对象的实现
2019/02/11 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
2019/11/09 Javascript
微信小程序如何实现精确的日期时间选择器
2020/01/21 Javascript
vue项目中使用bpmn-自定义platter的示例代码
2020/05/11 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
[01:05:12]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS CIS-GAME
2014/05/21 DOTA
Python如何为图片添加水印
2016/11/25 Python
python中的字典操作及字典函数
2018/01/03 Python
使用Python实现毫秒级抢单功能
2019/06/06 Python
Python 分发包中添加额外文件的方法
2019/08/16 Python
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
德国网上药房:Apotal
2017/04/04 全球购物
GOOD AMERICAN官网:为曲线性感而设计
2017/12/28 全球购物
党员学习十八大感想
2014/01/17 职场文书
基层党建工作宣传标语
2014/06/24 职场文书
新课培训心得体会
2014/09/03 职场文书
个人遵守党的政治纪律情况对照检查材料思想汇报
2014/09/25 职场文书
收款委托书
2014/10/14 职场文书
赢在中国观后感
2015/06/02 职场文书
付款证明模板
2015/06/19 职场文书
新课程改革心得体会
2016/01/22 职场文书
《落花生》教学反思
2016/02/16 职场文书
python playwright之元素定位示例详解
2022/07/23 Python