天天看點

Nodejs 定制化你自己的REPL

Node 官方提供了 repl 子產品,實作一個互動式解析器,它可以作為一個獨立程式使用或者嵌入到其它應用中:

node 指令使用

如果你已經安裝了 node,那麼你可以在指令行直接輸入 node 指令便可以進入一個互動式 javascript 指令行界面,這裡你可以敲一些 javascript 表達式,甚至你都可以把它當成電腦使用:

$ node
> new Date()
2018-12-06T03:30:46.242Z
> 3 + 5
8
>
           

在互動式指令行中當你輸入 .help 指令,你會發現它提供了幾個簡單且友善的互動指令:

> .help
.break    Sometimes you get stuck, this gets you out
.clear    Alias for .break
.editor   Enter editor mode
.exit     Exit the repl
.help     Print this help message
.load     Load JS from a file into the REPL session
.save     Save all evaluated commands in this REPL session to a file
>

           
  • .break: 在輸入一個多行表達式的過程中,輸入 .break 指令(或按下 -C 組合鍵)将終止表達式的繼續輸入。
  • .clear: 重置 REPL 的 context 為一個空對象,并清除目前正輸入的所有多行表達式。
  • .exit: 關閉輸入輸出流,退出 REPL。
  • .help: 顯示特定指令的幫助清單。
  • .save: 儲存目前 REPL 會話到一個檔案: > .save ./file/to/save.js
  • .load: 讀取一個檔案到目前 REPL 會話。 > .load ./file/to/load.js
  • .editor: 進入編輯模式(-D 完成,-C 取消)

在互動式指令中,我們也可以使用如下組合鍵:

  • -C:當按下一次時,與 .break 指令的效果一樣,當在空白行按下兩次時,與 .exit 指令的效果一樣;
  • -D: 與 .exit 指令的效果一樣;
  • :當在空白行按下時,顯示全局和本地作用域内的變量,當在輸入時按下,顯示相關的自動補全選項;

如果你想要在互動式指令裡擷取上一條指令的執行結果,可以直接輸入“_”:

> 3 + 3
6
> _
6
           

定制自己的 node repl

如果你覺得官方的 node 指令行還不能滿足你的需求,你可以使用repl子產品來定制化你自己的互動式指令行,repl 子產品提供了一個 start 函數,可以建立并啟動一個 repl 執行個體。

比如我們在使用官方的 repl 時,想要使用 lodash 裡面的函數,每次總要把寫一行代碼 _ = require(‘lodash’),非常麻煩,這個時候我們就可以定制自己的 repl,每次啟動時綁定一些全局變量到 context 上,repl.start 函數傳回一個 REPLServer 類的執行個體,該執行個體上面有一個 context 屬性,用于存放目前 repl 的全局變量,我們在啟動時給把一些常用子產品加載到這個 context 上,便可以友善的解決該問題。代碼如下:

#!/usr/bin/env node

const repl = require('repl');
//用于制定指令行提示符
let r = repl.start('<node>');

Object.assign(r.context, {
    lodash: require('lodash'),
    moment: require('moment')
})

           

start函數還提供了許多其它有用的選項,比如定制你的輸入,輸出的來源等功能,詳細可以看 node 官方文檔

參考文獻

  • nodejs裡的repl
  • repl2子產品
  • repl官方文檔
  • Node.js定制REPL的妙用