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中的标签语句
Jun 19 Javascript
javascript记住用户名和登录密码(两种方式)
Aug 04 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
Oct 20 Javascript
jquery中的常见问题及快速解决方法小结
Jun 14 Javascript
Angularjs的ng-repeat中去除重复数据的方法
Aug 05 Javascript
loading动画特效小结
Jan 22 Javascript
js前端实现图片懒加载(lazyload)的两种方式
Apr 24 Javascript
babel之配置文件.babelrc入门详解
Feb 22 Javascript
Vue-cli项目获取本地json文件数据的实例
Mar 07 Javascript
vue实现路由切换改变title功能
May 28 Javascript
vue获取验证码倒计时组件
Aug 26 Javascript
JS数组的常用方法整理
Mar 31 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多线程之内部多线程实例分析
2015/03/09 PHP
laravel-admin的多级联动方法
2019/09/30 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
JQuery开发的数独游戏代码
2010/10/29 Javascript
Javascript面向对象编程(三) 非构造函数的继承
2011/08/28 Javascript
jquery 实现返回顶部功能
2014/11/17 Javascript
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
javascript中sort排序实例详解
2016/07/24 Javascript
javascript验证内容为数字以及长度为10的简单实例
2016/08/20 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
JS中使用 after 伪类清除浮动实例
2017/03/01 Javascript
详解从新建vue项目到引入组件Element的方法
2017/08/29 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
JavaScript实现与使用发布/订阅模式详解
2019/01/19 Javascript
js实现鼠标拖拽缩放div实例代码
2019/03/25 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
Nuxt配置Element-UI按需引入的操作方法
2020/07/06 Javascript
[01:51]历届DOTA2国际邀请赛举办地回顾 TI9落地上海
2018/08/26 DOTA
pandas每次多Sheet写入文件的方法
2018/12/10 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
2018/12/19 Python
Python 保持登录状态进行接口测试的方法示例
2019/08/06 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
2020/04/01 Python
使用python爬取抖音app视频的实例代码
2020/12/01 Python
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
2021/03/14 PHP
AmazeUI 单选框和多选框的实现示例
2020/08/18 HTML / CSS
英国手工布艺沙发在线购买:Sofas & Stuff
2018/03/02 全球购物
《蒙娜丽莎之约》教学反思
2014/02/27 职场文书
土木工程求职信
2014/05/29 职场文书
企业口号大全
2014/06/12 职场文书
2014年房地产个人工作总结
2014/12/20 职场文书
辩护意见书
2015/06/04 职场文书
廉洁自律证明
2015/06/24 职场文书
2016五一手机促销广告语
2016/01/28 职场文书
2016年小学中秋节活动总结
2016/04/05 职场文书
会计专业2019暑假实习报告
2019/06/21 职场文书
Apache POI操作批量导入MySQL数据库
2022/06/21 Servers