Node.js API详解之 repl模块用法实例分析
本文实例讲述了Node.jsAPI详解之repl模块用法。分享给大家供大家参考,具体如下:
Node.jsAPI详解之repl
repl(交互式解释器)模块提供了一种“读取-求值-输出”循环(REPL)的实现,它可作为一个独立的程序或嵌入到其他应用中。
可以通过以下方式使用它:
constrepl=require('repl');
Node.js自身也使用repl模块为执行JavaScript代码提供交互接口。
可以通过不带任何参数(或使用-i参数)地执行Node.js二进制文件来使用它:
$node >consta=[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:当解释每行输入时使用的函数。默认为JavaScripteval()函数的异步封装。eval函数出错时会返回repl.Recoverable,表明输入不完整并提示用户完成输入
useColors:如果为true,则指定默认的writer函数可以在REPL输出中包含ANSI颜色风格。如果提供了自定义的writer函数,则该参数无效。默认为REPL实例的terminal属性的值。
useGlobal:如果为true,则指定默认的解释函数使用JavaScriptglobal作为上下文,而不是为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声明前加上‘usestrict'
repl.REPL_MODE_MAGIC–不推荐使用
如果options是一个字符串,则它指定了输入提示符
demo:
constrepl=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:
constrepl=require('repl'); constreplServer=repl.start({prompt:'>'}); replServer.defineCommand('sayhello',{ help:'打招呼', action(name){ this.lineParser.reset(); this.bufferedCommand=''; console.log(`你好,${name}!`); this.displayPrompt(); } }); replServer.defineCommand('saybye',functionsaybye(){ 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:
constrepl=require('repl'); functioninitializeContext(context){ context.m='test'; } constr=repl.start({prompt:'>'}); initializeContext(r.context); r.on('reset',initializeContext); //$./nodeexample.js //>m //'test' //>m=1 //1 //>m //1 //>.clear //Clearingcontext... //>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取消) functionwelcome(name){ return`你好${name}!`; } welcome('Node.js用户'); //^D '你好Node.js用户!' >
自定义的解释函数
说明:
该属性的值为当前系统的路径分隔符。Windows下是:”;“POSIX下是:”:“
当创建一个新的repl.REPLServer时,可以提供一个自定义的解释函数。这可以用于实现完全定制化的REPL应用。
例子,一个执行文本翻译的REPL:
demo:
constrepl=require('repl'); const{Translator}=require('translator'); constmyTranslator=newTranslator('en','fr'); functionmyEval(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:
constrepl=require('repl'); constr=repl.start({prompt:'>',eval:myEval,writer:myWriter}); functionmyEval(cmd,context,filename,callback){ callback(null,cmd); } functionmyWriter(output){ returnoutput.toUpperCase(); }
希望本文所述对大家node.js程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。