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 相关文章推荐
editable.js 基于jquery的表格的编辑插件
Oct 24 Javascript
扩展Jquery插件处理mouseover时内部有子元素时发生样式闪烁
Dec 08 Javascript
js操作模态窗口及父子窗口间相互传值示例
Jun 09 Javascript
Js实现无刷新删除内容
Apr 29 Javascript
jQuery实现多级联动下拉列表查询框
Jan 18 Javascript
JavaScript实现99乘法表及隔行变色实例代码
Feb 24 Javascript
有关JavaScript中call()和apply() 的一些理解
May 20 Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
Jun 22 jQuery
关于Vue单页面骨架屏实践记录
Dec 13 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
Jun 21 Javascript
基于Vue的商品主图放大镜方案详解
Sep 19 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
Oct 25 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&mysql(六)
2006/10/09 PHP
MySQL的FIND_IN_SET函数使用方法分享
2012/03/27 PHP
PHP实现会员账号单唯一登录的方法分析
2019/03/07 PHP
仿新浪微博登陆邮箱提示效果的js代码
2013/08/02 Javascript
jQuery function的正确书写方法
2013/08/02 Javascript
验证手机号码的JS方法分享
2013/09/10 Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
2015/07/01 Javascript
JavaScript中文件上传API详解
2016/04/01 Javascript
AngularJS 避繁就简的路由
2016/07/01 Javascript
vue.js动态数据绑定学习笔记
2017/05/19 Javascript
JS实现遍历不规则多维数组的方法
2018/03/21 Javascript
JS实现的文件拖拽上传功能示例
2018/05/21 Javascript
Vue项目中最新用到的一些实用小技巧
2018/11/06 Javascript
AngularJS上传文件的示例代码
2018/11/10 Javascript
django使用channels2.x实现实时通讯
2018/11/28 Javascript
JS实现计算小于非负数n的素数的数量算法示例
2019/02/26 Javascript
JS实现网站吸顶条
2020/01/08 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
2020/08/07 Javascript
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
Python中类的定义、继承及使用对象实例详解
2015/04/30 Python
Python实现基于PIL和tesseract的验证码识别功能示例
2018/07/11 Python
python提取照片坐标信息的实例代码
2019/08/14 Python
详解python中的生成器、迭代器、闭包、装饰器
2019/08/22 Python
浅析Python 条件控制语句
2020/07/15 Python
python3字符串输出常见面试题总结
2020/12/01 Python
HTML5地理定位与第三方工具百度地图的应用
2016/11/17 HTML / CSS
GUESS德国官网:美国牛仔服装品牌
2017/02/14 全球购物
Skyscanner新西兰:全球领先的旅游搜索网站
2019/08/26 全球购物
酒店副总岗位职责
2013/12/24 职场文书
九年级物理教学反思
2014/01/29 职场文书
村居抓节水倡议书
2014/05/19 职场文书
天猫活动策划方案
2014/08/21 职场文书
乡镇党委书记个人整改措施
2014/09/15 职场文书
远程教育集中轮训基层干部培训班学习心得体会
2016/01/09 职场文书
Pytorch 如何加速Dataloader提升数据读取速度
2021/05/28 Python
PYTHON 使用 Pandas 删除某列指定值所在的行
2022/04/28 Python