99re热视频这里只精品,久久久天堂国产精品女人,国产av一区二区三区,久久久精品成人免费看片,99久久精品免费看国产一区二区三区

IO.js REPL

2018-11-28 22:35 更新

穩(wěn)定度: 2 - 穩(wěn)定

一個(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)行iojsiojs -i啟動(dòng))可以被以下環(huán)境變量所控制:

  • NODE_REPL_HISTORY_FILE - 如果指定,那必須是一個(gè)用戶可讀也可寫的文件路徑。當(dāng)給定了一個(gè)可用的路徑,將啟用持久化的歷史記錄支持:REPL歷史記錄將會(huì)跨iojs``REPL會(huì)話持久化。
  • NODE_REPL_HISTORY_SIZE - 默認(rèn)為1000。與NODE_REPL_HISTORY_FILE結(jié)合,控制需要持久化的歷史記錄數(shù)量。必須為正數(shù)。
  • NODE_REPL_MODE - 可以是sloppystrictmagic中的一個(gè)。默認(rèn)為magic,會(huì)自動(dòng)在嚴(yán)格模式中執(zhí)行"strict mode only"聲明。

repl.start(options)

返回并啟動(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"模式)。接受以下值:

  • repl.REPL_MODE_SLOPPY - 在混雜模式下運(yùn)行命令。
  • repl.REPL_MODE_STRICT - 在嚴(yán)格模式下運(yùn)行命令。這與在每個(gè)命令前添加'use strict'語句相等。
  • repl.REPL_MODE_MAGIC - 試圖在默認(rèn)模式中運(yùn)行命令,如果失敗了,會(huì)重新嘗試使用嚴(yán)格模式。

你可以使用你自己的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.Servernet.Socket實(shí)例運(yùn)行“全特性”(終端)REPL的例子,參閱https://gist.github.com/2209310。

一個(gè)通過curl(1)運(yùn)行REPL的例子,參閱https://gist.github.com/2053342

Event: 'exit'

  • function () {}

當(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();
});

Event: 'reset'

  • function (context) {}

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

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)了所有REPLServercontext對(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 - 當(dāng)你輸入一個(gè)多行表達(dá)式時(shí),有時(shí)你走神了,或有時(shí)你不關(guān)心如何完成它了。.break將會(huì)讓你重新來過。
  • .clear - 重置context對(duì)象為一個(gè)空對(duì)象并且清除所有多行表達(dá)式。
  • .exit - 關(guān)閉I/O流,意味著會(huì)導(dǎo)致REPL退出。
  • .help - 展示特殊命令列表。
  • .save 將當(dāng)前的REPL會(huì)話保存入一個(gè)文件。

  • .save ./file/to/save.js

  • .load - 從一個(gè)文件中加載REPL會(huì)話。

  • .load ./file/to/load.js

這些組合鍵在REPL中有以下影響:

  • ctrl + C - 與.break關(guān)鍵字相似。終止當(dāng)前命令。在一個(gè)空行上連按兩次會(huì)強(qiáng)制退出。
  • ctrl + D - 與.exit關(guān)鍵字相似。
  • tab - 展示所有的全局和本地變量。
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)