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