鍍金池/ 教程/ HTML/ REPL
模塊
斷言測(cè)試
Buffer
Smalloc
TTY
概述
REPL
HTTP
DNS
路徑
集群
TLS/SSL
系統(tǒng)
加密
調(diào)試器
進(jìn)程
Punycode
虛擬機(jī)
HTTPS
網(wǎng)絡(luò)
Query String
C/C++ 插件
實(shí)用工具
文件系統(tǒng)
Zlib
子進(jìn)程
UDP/Datagram Sockets
定時(shí)器
逐行讀取
字符串解碼器
全局對(duì)象
事件
URL
控制臺(tái)

REPL

穩(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"

repl.start(options)

啟動(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 客戶端可能通過(guò) Unix socket 或 TCP socket 連接。telnet 常用于連接 TCP socket, socat 用于連接Unix 和 TCP sockets

從Unix socket-based 服務(wù)器啟動(dòng) REPL(而非stdin),你可以建立長(zhǎng)連接,不用重啟它們。

通過(guò) net.Servernet.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

Event: 'exit'

function () {}

當(dāng)用戶通過(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();
});

Event: 'reset'

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 特性

在 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)似。
上一篇:字符串解碼器下一篇:TTY