一個 讀取-執(zhí)行-打印-循環(huán)(REPL)可以用于單獨(dú)的程序,也能很容易的被集成在其他程序中。REPL
提供了一種交互著運(yùn)行JavaScript
然后查看結(jié)果的方式。它可以被用來調(diào)試,測試或只是嘗試一些東西。
在命令行中不帶任何參數(shù)直接執(zhí)行iojs
,你會進(jìn)入REPL界面。它有一個極簡的emacs行編輯器。
mjr:~$ iojs
Type '.help' for options.
> a = [ 1, 2, 3];
[ 1, 2, 3 ]
> a.forEach(function (v) {
... console.log(v);
... });
1
2
3
要使用高級的行編輯器的話,帶著環(huán)境變量NODE_NO_READLINE=1
啟動io.js
。它將會在允許你使用rlwrap
的終端設(shè)置中,啟動一個主要的調(diào)試REPL
(main and debugger REPL)。
例如,你可以把以下內(nèi)容加入bashrc
文件:
alias iojs="env NODE_NO_READLINE=1 rlwrap iojs"
內(nèi)置的REPL
(通過運(yùn)行iojs
或iojs -i
啟動)可以被以下環(huán)境變量所控制:
REPL
歷史記錄將會跨iojs``REPL
會話持久化。1000
。與NODE_REPL_HISTORY_FILE
結(jié)合,控制需要持久化的歷史記錄數(shù)量。必須為正數(shù)。sloppy
,strict
或magic
中的一個。默認(rèn)為magic
,會自動在嚴(yán)格模式中執(zhí)行"strict mode only"
聲明。返回并啟動一個REPLServer
實例,繼承于[Readline Interface][]
。接受一個包含以下值得options
對象:
prompt - 所有I/O
的提示符。默認(rèn)為>
。
input - 監(jiān)聽的可讀流。默認(rèn)為process.stdin
。
output - 輸出數(shù)據(jù)的可寫流。默認(rèn)為process.stdout
。
terminal - 如果流需要被像TTY對待,并且有ANSI/VT100
轉(zhuǎn)義代碼寫入,設(shè)置其為true
。默認(rèn)為在實例化時檢查到的output
流的isTTY
屬性。
eval - 被用來執(zhí)行每一行的函數(shù)。默認(rèn)為被異步包裝過的eval()
。參閱下文的自定義eval
的例子。
useColors - 一個表明了是否writer
函數(shù)需要輸出顏色的布爾值。如果設(shè)置了不同的writer
函數(shù),那么它什么都不會做。默認(rèn)為REPL
的終端值。
useGlobal - 若設(shè)置為true
,那么REPL
將使用全局對象,而不是運(yùn)行每一個腳本在不同上下文中。默認(rèn)為false
。
ignoreUndefined - 若設(shè)置為true
,那么如果返回值是undefined
,REPL
將不會輸出它。默認(rèn)為false
。
writer - 當(dāng)每一個命令被執(zhí)行完畢時,都會調(diào)用這個函數(shù),它返回了展示的格式(包括顏色)。默認(rèn)為util.inspect
。
replMode - 控制是否REPL
運(yùn)行所有的模式在嚴(yán)格模式,默認(rèn)模式,或混合模式("magic"
模式)。接受以下值:
'use strict'
語句相等。你可以使用你自己的eval
函數(shù),如果它包含以下簽名:
function eval(cmd, context, filename, callback) {
callback(null, result);
}
在用tab補(bǔ)全時 - eval
將會帶著一個作為輸入字符串的.scope
調(diào)用。它被期望返回一個scope
名字?jǐn)?shù)組,被用來自動補(bǔ)全。
多個REPL
可以運(yùn)行相同的io.js
實例。共享同一個全局對象,但是各自的I/O獨(dú)立。
下面是在stdin
,Unix socket
和 TCP socket
上啟動一個REPL
的例子:
var net = require("net"),
repl = require("repl");
connections = 0;
repl.start({
prompt: "io.js via stdin> ",
input: process.stdin,
output: process.stdout
});
net.createServer(function (socket) {
connections += 1;
repl.start({
prompt: "io.js via Unix socket> ",
input: socket,
output: socket
}).on('exit', function() {
socket.end();
})
}).listen("/tmp/iojs-repl-sock");
net.createServer(function (socket) {
connections += 1;
repl.start({
prompt: "io.js via TCP socket> ",
input: socket,
output: socket
}).on('exit', function() {
socket.end();
});
}).listen(5001);
在命令行中運(yùn)行這個程序會在stdin
上啟動一個REPL
。另外的REPL
客戶端將會通過Unix socket
或TCP socket
連接。telnet
在連接TCP socket
時非常有用,socat
在連接Unix socket
和TCP socket
時都非常有用。
通過從基于Unix socket
的服務(wù)器啟動REPL
,你可以不用重啟,而連接到一個長久執(zhí)行的(long-running)io.js
進(jìn)程。
一個通過net.Server
和net.Socket
實例運(yùn)行“全特性”(終端)REPL
的例子,參閱https://gist.github.com/2209310
。
一個通過curl(1)
運(yùn)行REPL
的例子,參閱https://gist.github.com/2053342
。
當(dāng)用戶通過任意一種已定義的方式退出REPL
時觸發(fā)。具體地說,在REPL
中鍵入.exit
,兩次按下Ctrl+C
來發(fā)送SIGINT
信號,按下Ctrl+D
來發(fā)送結(jié)束信號。
例子:
r.on('exit', function () {
console.log('Got "exit" event from repl!');
process.exit();
});
當(dāng)REPL
內(nèi)容被重置時觸發(fā)。當(dāng)你鍵入.clear
時發(fā)生。如果你以{ useGlobal: true }
啟動REPL
,那么這個事件將永遠(yuǎn)不會觸發(fā)。
例子:
// 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
內(nèi),按下Control+D
將會退出。多行表達(dá)式可以被輸入。Tab補(bǔ)全同時支持全局和本地變量。
核心模塊將會被按需載入環(huán)境。例如,調(diào)用fs
,將會從global.fs
獲取,作為require()``fs
模塊的替代。
特殊的變量_
(下劃線)包含了上一個表達(dá)式的結(jié)果。
> [ "a", "b", "c" ]
[ 'a', 'b', 'c' ]
> _.length
3
> _ += 1
4
REPL
可以訪問全局作用域里的任何變量。你可以通過將變量賦值給一個關(guān)聯(lián)了所有REPLServer
的context
對象來暴露一個對象給REPL
。例子:
// repl_test.js
var repl = require("repl"),
msg = "message";
repl.start("> ").context.m = msg;
context
對象里的對象會表現(xiàn)得像REPL
的本地變量:
mjr:~$ iojs repl_test.js
> m
'message'
以下是一些特殊的REPL
命令:
.break
將會讓你重新來過。context
對象為一個空對象并且清除所有多行表達(dá)式。REPL
退出。.save 將當(dāng)前的REPL
會話保存入一個文件。
.save ./file/to/save.js
.load - 從一個文件中加載REPL
會話。
.load ./file/to/load.js
這些組合鍵在REPL
中有以下影響:
.break
關(guān)鍵字相似。終止當(dāng)前命令。在一個空行上連按兩次會強(qiáng)制退出。.exit
關(guān)鍵字相似。
更多建議: