W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
REPL即Node自帶的交互式解釋器,它可以實(shí)現(xiàn)如下的任務(wù):
穩(wěn)定性: 3 - 穩(wěn)定
Read-Eval-Print-Loop (REPL 讀取-執(zhí)行-輸出循環(huán))即可作為獨(dú)立程序,也可以集成到其他程序中。
REPL提供了一種交互的執(zhí)行JavaScript并查看輸出結(jié)果的方法??梢杂脕?lái)調(diào)試,測(cè)試,或僅是用來(lái)試試。
在命令行中不帶任何參數(shù)的執(zhí)行node
,就是REPL模式。它提供了簡(jiǎn)單的emacs行編輯。
mjr:~$ node
Type '.help' for options.
> a = [ 1, 2, 3];
[ 1, 2, 3 ]
> a.forEach(function (v) {
... console.log(v);
... });
1
2
3
若想使用高級(jí)的編輯模式,使用環(huán)境變量NODE_NO_READLINE=1
打開(kāi)node。這樣會(huì)開(kāi)啟REPL模式,允許你使用rlwrap
。
例如,你可以添加以下代碼到你的bashrc文件里。
alias node="env NODE_NO_READLINE=1 rlwrap node"
啟動(dòng)并返回一個(gè)REPLServer
實(shí)例。它繼承自[Readline Interface][]。接收的參數(shù)"options"有以下值:
prompt
- 所有輸入輸出的提示符和流,默認(rèn)是>
.
input
- 需要監(jiān)聽(tīng)的可讀流,默認(rèn)為process.stdin
.
output
- 用來(lái)輸出數(shù)據(jù)的可寫(xiě)流,默認(rèn)為process.stdout
.
terminal
- 如果stream
被當(dāng)成TTY,并且有ANSI/VT100轉(zhuǎn)義,傳輸true
。默認(rèn)在實(shí)例的輸出流上檢查isTTY
。
eval
- 用來(lái)對(duì)每一行進(jìn)行求值的函數(shù)。默認(rèn)為eval()
的異步封裝。參見(jiàn)后面的自定義eval
例子。
useColors
- 寫(xiě)函數(shù)輸出是否有顏色。如果設(shè)定了不同的writer
函數(shù)則無(wú)效。默認(rèn)為 repl 的terminal
值。
useGlobal
- 如果為true
,則repl將會(huì)使用全局對(duì)象,而不是在獨(dú)立的上下文中運(yùn)行scripts。默認(rèn)為false
。
ignoreUndefined
- 如果為true
,repl不會(huì)輸出未定義命令的返回值。默認(rèn)為false
。
writer
- 每個(gè)命令行被求值時(shí)都會(huì)調(diào)用這個(gè)函數(shù),它會(huì)返回格式化顯示內(nèi)容(包括顏色)。默認(rèn)是util.inspect
。如果有以下特性,可以使用自己的eval
函數(shù):
function eval(cmd, context, filename, callback) {
callback(null, result);
}
在同一個(gè)node的運(yùn)行實(shí)例上,可以打開(kāi)多個(gè)REPLs。每個(gè)都會(huì)共享一個(gè)全局對(duì)象,但會(huì)有獨(dú)立的I/O。
以下的例子,在stdin、 Unix socket和 TCP socket上開(kāi)啟REPL :
var net = require("net"),
repl = require("repl");
connections = 0;
repl.start({
prompt: "node via stdin> ",
input: process.stdin,
output: process.stdout
});
net.createServer(function (socket) {
connections += 1;
repl.start({
prompt: "node via Unix socket> ",
input: socket,
output: socket
}).on('exit', function() {
socket.end();
})
}).listen("/tmp/node-repl-sock");
net.createServer(function (socket) {
connections += 1;
repl.start({
prompt: "node via TCP socket> ",
input: socket,
output: socket
}).on('exit', function() {
socket.end();
});
}).listen(5001);
從命令行運(yùn)行這個(gè)程序,將會(huì)在stdin上啟動(dòng)REPL。其他的REPL客戶(hù)端可能通過(guò)Unix socket或TCP socket連接。telnet
常用于連接TCP socket,socat
用于連接Unix和TCP sockets
從Unix socket-based服務(wù)器啟動(dòng)REPL(而非stdin),你可以建立長(zhǎng)連接,不用重啟它們。
通過(guò)net.Server
和net.Socket
實(shí)例運(yùn)行"full-featured" (terminal
) REPL的例子,參見(jiàn): https://gist.github.com/2209310
通過(guò)curl(1)
實(shí)例運(yùn)行REPL的例子,參見(jiàn): https://gist.github.com/2053342
function () {}
當(dāng)用戶(hù)通過(guò)預(yù)定義的方式退出REPL將會(huì)觸發(fā)這個(gè)事件。預(yù)定義的方式包括,在repl里輸入.exit
,按Ctrl+C兩次來(lái)發(fā)送SIGINT信號(hào),或者在input
流上按Ctrl+D 來(lái)發(fā)送"end"。
監(jiān)聽(tīng)exit
的例子:
r.on('exit', function () {
console.log('Got "exit" event from repl!');
process.exit();
});
function (context) {}
重置REPL的上下文的時(shí)候觸發(fā)。當(dāng)你輸入.clear
會(huì)重置。如果你用{ useGlobal: true }
啟動(dòng)repl,那這個(gè)事件永遠(yuǎn)不會(huì)被觸發(fā)。
監(jiān)聽(tīng)reset
的例子:
// Extend the initial repl context.
r = repl.start({ options ... });
someExtension.extend(r.context);
// When a new context is created extend it as well.
r.on('reset', function (context) {
console.log('repl has a new context');
someExtension.extend(context);
});
在REPL里, Control+D會(huì)退出??梢暂斎攵嘈斜磉_(dá)式。支持全局變量和局部變量的TAB自動(dòng)補(bǔ)全。
特殊變量_
(下劃線)包含上一個(gè)表達(dá)式的結(jié)果。
> [ "a", "b", "c" ]
[ 'a', 'b', 'c' ]
> _.length
3
> _ += 1
4
REPL支持在全局域里訪問(wèn)任何變量。將變量賦值個(gè)和REPLServer
關(guān)聯(lián)的上下文對(duì)象,你可以顯示的講變量暴露給REPL,例如:
// repl_test.js
var repl = require("repl"),
msg = "message";
repl.start("> ").context.m = msg;
context
對(duì)象里的東西,會(huì)以局部變量的形式出現(xiàn):
mjr:~$ node repl_test.js
> m
'message'
有一些特殊的REPL命令:
.break
- 當(dāng)你輸入多行表達(dá)式時(shí),也許你走神了或者不想完成了,.break
可以重新開(kāi)始。 .clear
- 重置context
對(duì)象為空對(duì)象,并且清空多行表達(dá)式。 .exit
- 關(guān)閉輸入/輸出流,會(huì)讓REPL退出。.help
- 打印這些特殊命令。.save
- 保存當(dāng)前REPL會(huì)話到文件。.save ./file/to/save.js
.load
- 加載一個(gè)文件到當(dāng)前REPL會(huì)話.load ./file/to/load.js
下面的組合鍵在REPL中有以下效果:
<ctrl>C
- 和.break
鍵類(lèi)似,在一個(gè)空行連按兩次會(huì)強(qiáng)制退出。<ctrl>D
- 和.exit
鍵類(lèi)似。Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: