node 的“讀入、運(yùn)行、輸出循環(huán)模式(REPL)”既可以單獨(dú)執(zhí)行也很容易嵌入其它程序中。REPL 提供了一種交互 式執(zhí)行Javascript 并查看結(jié)果的模式。這種模式可以用來調(diào)試、測試或者僅僅用來某些新特性。
如果直接執(zhí)行node 而不跟任何參數(shù)就會(huì)進(jìn)入REPL 模式。它類似于簡化的emacs 行編輯模式。
mjr:~$ node
Type '.help' for options.
node> a = [ 1, 2, 3];
[ 1, 2, 3 ]
node> a.forEach(function (v) {
... console.log(v);
... });
1
2
3
要使用高級行編輯功能,設(shè)置環(huán)境變量NODE_NO_READLINE=1并執(zhí)行node。這樣REPL 就會(huì)使用標(biāo)準(zhǔn)終端 設(shè)置,如此一來你就可以使用rlwarp 來執(zhí)行高級行編輯。 示例,你可以在bashrc 文件中添加如下指令:
alias node="env NODE_NO_READLINE=1 rlwrap node"
repl.start(prompt='node> ', stream=process.openStdin())
REPL 執(zhí)行時(shí)將使用prompt 參數(shù)的值作為輸入提示符,并使用stream 參數(shù)執(zhí)行所有I/O 操作。prompt 為可選 參數(shù),默認(rèn)值為'node>', stream 為可選參數(shù),默認(rèn)值為process.openStdin();
同一個(gè)node 進(jìn)程可以啟動(dòng)多個(gè)REPL,每個(gè)REPL 將會(huì)共享部分全局對象,但是它們都有自己唯一的I/O。 示例,分別使用標(biāo)準(zhǔn)輸出(控制臺)、Unix Socket 和TCP Socket 啟動(dòng)REPL:
var net = require("net"),
repl = require("repl");
connections = 0;
repl.start("node via stdin> ");
net.createServer(function (socket) {
connections += 1;
repl.start("node via Unix socket> ", socket);
}).listen("/tmp/node-repl-sock");
net.createServer(function (socket) {
connections += 1;
repl.start("node via TCP socket> ", socket);
}).listen(5001);
在控制臺執(zhí)行上述程序?qū)⑹褂脴?biāo)準(zhǔn)輸入(當(dāng)前控制臺)啟動(dòng)REPL,同時(shí)其他REPL 客戶端可以通過Unix socket 或者TCP socket 連接。你可以使用telnet 連接到TCP socket,用socat 連接到Unix 或TCP sockets。 不使用標(biāo)準(zhǔn)輸入(控制臺)而是用Unix socket 服務(wù)啟動(dòng)REPL,可以讓你輕易連接到一個(gè)長時(shí)間運(yùn)行的node 進(jìn) 程而不用重新啟動(dòng)該進(jìn)程。
REPL Features REPL支持的特性
在REPL 執(zhí)行時(shí),可以輸入Control+D 退出。你也可以輸入跨越多行的表達(dá)式。 特殊標(biāo)量'_'(下劃線)保存了上一個(gè)表達(dá)式執(zhí)行后的值。
node> [ "a", "b", "c" ]
[ 'a', 'b', 'c' ]
node> _.length
3
node> _ += 1
4
REPL 提供了訪問全局作用域內(nèi)任何變量的能力,你也可以通過將變量賦值給REPL 的context 對象來向REPL 暴露該變量。例如:
// repl_test.js
var repl = require("repl"),
msg = "message";
repl.start().context.m = msg;
對于REPL 來說,context 對象中的值就猶如在本地作用域內(nèi):
mjr:~$ node repl_test.js
node> m
'message'
如下是一些REPL 命令:
.break - 當(dāng)想要放棄當(dāng)前輸入的多行命令時(shí),可以使用.break 命令重新開始輸入。
.clear - 將context 重置為空對象并清空(當(dāng)前正在輸入的)多行表達(dá)式。
.exit - 管理I/O 流,此操作將關(guān)閉REPL。
.help - 顯示特殊命令的幫助。
更多建議: