# REPL
~~~
穩(wěn)定度: 3 - 穩(wěn)定
~~~
一個 Read-Eval-Print-Loop(REPL,讀取-執(zhí)行-輸出循環(huán))既可用于獨立程序也可很容易地被集成到其它程序中。REPL 提供了一種交互地執(zhí)行 JavaScript 并查看輸出的方式。它可以被用作調(diào)試、測試或僅僅嘗試某些東西。
在命令行中不帶任何參數(shù)執(zhí)行 `node` 您便會進(jìn)入 REPL。它提供了一個簡單的 Emacs 行編輯。
~~~
mjr:~$ node
Type '.help' for options.
> a = [ 1, 2, 3];
[ 1, 2, 3 ]
> a.forEach(function (v) {
... console.log(v);
... });
1
2
3
~~~
若想使用高級的編輯模式,設(shè)置環(huán)境變量 `NODE_NO_READLINE=1` 后運行 node。這將在允許你在可以使用 `rlwrap` 的終端上,啟動高級的 REPL 模式 (the main and debugger REPL)。
例如,您可以將下列代碼加入到您的 bashrc 文件:
~~~
alias node="env NODE_NO_READLINE=1 rlwrap node"
~~~
### repl.start(options)
啟動并返回一個 `REPLServer` 實例。接受一個包含如下內(nèi)容的 "options" 對象:
- `prompt` - 所有輸入輸出的提示符。默認(rèn)是 `>` .
- `input` - 監(jiān)聽的可讀流。默認(rèn)指向標(biāo)準(zhǔn)輸入流 `process.stdin`。
- `output` - 用來輸出數(shù)據(jù)的可寫流。默認(rèn)指向標(biāo)準(zhǔn)輸出流 `process.stdout`。
- `terminal` - 如果 `stream` 應(yīng)該被當(dāng)做 TTY 來對待并且有 ANSI/VT100 轉(zhuǎn)義時,則傳 `true`。 默認(rèn)使用 `output` 實例的 `isTTY`來檢查。
- `eval` - 用來對每一行進(jìn)行求值的函數(shù)。 默認(rèn)為`eval()`的一個異步包裝函數(shù)。下面給出一個自定義`eval`的例子。
- `useColors` - 一個布爾值,表明了`writer`函數(shù)是否會輸出顏色。如果設(shè)定了一個不同的`writer`函數(shù),那么這不會產(chǎn)生任何影響。默認(rèn)為repl的`terminal`值。
- `useGlobal` - 如果設(shè)定為`true`,那么repl就會使用`global`對象而不是在一個獨立環(huán)境里運行腳本。默認(rèn)為`false`。
- `ignoreUndefined` - 如果設(shè)定為`true`,那么repl將不會輸出未定義命令的返回值。默認(rèn)為`false`。
- `writer` - 每一個命令被求值時都會調(diào)用此函數(shù),而該函數(shù)會返回顯示的格式(包括顏色)。默認(rèn)為`util.inspect`。 `util.inspect`.
你可以使用你自己的`eval`函數(shù),只有它有如下的簽名:
~~~
function eval(cmd, context, filename, callback) {
callback(null, result);
}
~~~
多個REPL可以在同一個運行的節(jié)點實例上打開。它們共享同一個global對象,但分別有各自的I/O。
以下是通過標(biāo)準(zhǔn)輸入流(stdin)、Unix socket 以及 TCP socket 三種情況來啟動 REPL 的例子:
~~~
net.createServer(function (socket) {
connections += 1;
repl.start({
prompt: "node via TCP socket> ",
input: socket,
output: socket
}).on('exit', function() {
socket.end();
});
}).listen(5001);
~~~
從命令行運行該程序,將會從標(biāo)準(zhǔn)輸入流啟動 REPL 模式。 其他的 REPL 客戶端也可以通過 Unix socket 或者 TCP socket 連接。 `telnet` 常用于連接 TCP sockets,而 `socat` 則可以同時用來連接 Unix 和 TCP sockets。
通過從一個Unix的套接字服務(wù)器而不是stdin來啟動REPL, 你可以連接到一個長久運行的node進(jìn)程而不不需要重啟。
一個在`net.Server`和`net.Socket`實例上運行的"全功能"(`terminal`)REPL的例子可以查看這里: [https://gist.github.com/2209310](https://gist.github.com/2209310)
一個在`curl(1)`上運行的REPL實例的例子可以查看這里: [https://gist.github.com/2053342](https://gist.github.com/2053342)
### 事件: 'exit'
`function () {}`
當(dāng)用戶通過任意預(yù)定義的方式退出REPL,該事件被分發(fā)。比如,在repl里輸入`.exit`,按Ctrl+C兩次來發(fā)送SIGINT信號,或者在`input`流上按Ctrl+D來發(fā)送"end"。
監(jiān)聽 `exit` 事件的例子:
~~~
r.on('exit', function () {
console.log('從 REPL 得到 "exit" 事件!');
process.exit();
});
~~~
### 事件: 'reset'
`function (context) {}`
當(dāng)REPL的上下文被重置時,該事件被分發(fā)。當(dāng)你打`.clear`命令時這種情況就會發(fā)生。如果你以`{ useGlobal: true }`來啟動repl,那么這個事件就永遠(yuǎn)不會被分發(fā)。
監(jiān)聽`reset`的例子:
~~~
// 當(dāng)一個新的上下文被創(chuàng)建時,擴(kuò)充這個上下文。
r.on('reset', function (context) {
console.log('repl有一個新的上下文');
someExtension.extend(context);
});
~~~
### REPL 特性
在REPL里,Control+D會退出??梢暂斎攵嘈斜磉_(dá)式。對于全局變量和本地變量都支持自動縮進(jìn)。
特殊變量 `_` (下劃線)儲存了上一個表達(dá)式的結(jié)果。
~~~
> [ "a", "b", "c" ]
[ 'a', 'b', 'c' ]
> _.length
3
> _ += 1
4
~~~
REPL提供了訪問global域里所有變量的權(quán)限。通過將一個變量賦值給與每一個`REPLServer`關(guān)聯(lián)的`context`對象,你可以顯式地將一個變量暴露給REPL。例如:
~~~
repl.start("> ").context.m = msg;
~~~
在`context`對象里的東西,會在REPL以本地變量的形式出現(xiàn)。
~~~
mjr:~$ node repl_test.js
> m
'message'
~~~
有幾個特殊的REPL命令:
- `.break` - 當(dāng)你輸入一個多行表達(dá)式時,有時你走神了或者你不想完成這個表達(dá)式了。`.break`讓你可以重頭再來。
- `.clear` - 重置`context`對象為一個空對象,并且清除所有的多行表達(dá)式。
- `.exit` - 關(guān)閉I/O流,使得REPL退出。
- `.help` - 顯示這個特殊命令的列表。
- `.save` - 將當(dāng)前的REPL會話保存到一個文件 > .save ./file/to/save.js
- `.load` - 將一個文件裝載到當(dāng)前的REPL會話。 > .load ./file/to/load.js
下面的組合鍵在REPL中有以下效果:
- `<ctrl>C` - 與`.break`關(guān)鍵字類似。終止正在執(zhí)行的命令。在一個空行連按兩次會強(qiáng)制退出。
- `<ctrl>D` - 與`.exit`關(guān)鍵字類似。
- 關(guān)于本文檔
- 概述
- 斷言 (assert)
- Buffer
- Addons插件
- 子進(jìn)程
- 集群
- 控制臺
- 加密(Crypto)
- 調(diào)試器
- DNS
- 域
- 事件 (Events)
- File System
- 全局對象
- HTTP
- HTTPS
- Modules
- net
- 操作系統(tǒng)
- 路徑 (Path)
- process
- punycode
- Query String
- Readline
- REPL
- Smalloc
- 流
- 字符串解碼器
- 定時器
- TLS (SSL)
- TTY
- UDP / 數(shù)據(jù)報套接字
- URL
- utils
- 執(zhí)行 JavaScript
- Zlib
- 進(jìn)度
- 感謝
