REPL
一個帶語法高亮、歷史記錄和自動補全功能的互動式 JavaScript 和 TypeScript REPL
bun repl 會啟動一個用於求值 JavaScript 和 TypeScript 表示式的互動式讀取-求值-列印迴圈(REPL)。用它來測試程式碼片段、探索 API,並進行除錯。
bun repl
歡迎使用 Bun v1.3.3
輸入 .copy [code] 以複製到剪貼簿。輸入 .help 瞭解更多資訊。
> 1 + 1
2
> const greeting = "Hello, Bun!"
undefined
> greeting
'Hello, Bun!'
功能
- TypeScript & JSX — 直接編寫 TypeScript 和 JSX。Bun 會即時轉譯所有內容。
- 頂層
await— 在提示符中直接等待 Promise,無需將其包裝在非同步函式中。 - 語法高亮 — REPL 會在你輸入時高亮顯示內容。
- 持久化歷史記錄 — REPL 會將歷史記錄儲存到
~/.bun_repl_history。歷史記錄會在不同會話之間保留。 - Tab 自動補全 — 按
Tab補全屬性名和 REPL 命令。 - 多行輸入 — 未閉合的方括號、大括號和圓括號會自動在下一行繼續。
- Node.js 全域性變數 —
require、module、__dirname和__filename均可用,並且會相對於當前工作目錄解析。
特殊變數
REPL 會暴露兩個特殊變數,每次求值後會更新。
| 變數 | 說明 |
|---|---|
_ | 上一個表示式的結果 |
_error | 上一次丟擲的錯誤 |
> 2 + 2
4
> _ * 10
40
> JSON.parse("oops")
SyntaxError: JSON Parse error: Unexpected identifier "oops"
> _error
SyntaxError: JSON Parse error: Unexpected identifier "oops"
頂層 await
你可以直接在提示符中對任意表達式使用 await。
> await fetch("https://api.github.com/repos/oven-sh/bun").then(r => r.json()).then(r => r.stargazers_count)
81234
> const response = await fetch("https://example.com")
undefined
> response.status
200
匯入模組
與 Bun 執行環境一樣,REPL 同時接受 require 和 import:你可以在提示符中自由混用 ES 模組和 CommonJS。模組解析使用與 bun run 相同的規則,因此你可以從 node_modules、相對路徑或 node: 內建模組匯入。
> import { z } from "zod"
undefined
> const path = require("path")
undefined
> z.string().parse(path.join("/tmp", "file.txt"))
'/tmp/file.txt'
宣告在整個會話期間都會保留。與常規指令碼不同,你可以在多次求值之間重新宣告 const/let,因此在迭代過程中可以重新執行 import 和 require 語句。
多行輸入
當你在未閉合括號、大括號或圓括號的行按下 Enter,REPL 會自動換行繼續。提示符變為 ... 表示續行。
> function add(a, b) {
... return a + b;
... }
undefined
> add(2, 3)
5
對於更長的多行輸入,使用 .editor 進入編輯器模式,所有輸入會緩衝直到按 Ctrl+D。
REPL 命令
在提示符輸入 .help 檢視所有可用的 REPL 命令。
| 命令 | 說明 |
|---|---|
.help | 列印幫助資訊,列出命令和快捷鍵 |
.exit | 退出 REPL |
.clear | 清屏 |
.copy | 複製最近結果到剪貼簿。也可以傳入表示式計算並複製:.copy 1 + 1 |
.load | 載入檔案到 REPL 會話:.load ./script.ts |
.save | 將當前 REPL 歷史儲存到檔案:.save ./session.txt |
.editor | 進入多行編輯器模式(按 Ctrl+D 執行,Ctrl+C 取消) |
.break | 取消當前多行輸入 |
.history | 列印命令歷史 |
快捷鍵
REPL 支援 Emacs 風格的行編輯。
| 快捷鍵 | 功能 |
|---|---|
Ctrl+A | 移動游標至行首 |
Ctrl+E | 移動游標至行尾 |
Ctrl+B / Ctrl+F | 向後/向前移動一個字元 |
Alt+B / Alt+F | 向後/向前移動一個單詞 |
Ctrl+U | 刪除至行首 |
Ctrl+K | 刪除至行尾 |
Ctrl+W | 向後刪除一個單詞 |
Ctrl+D | 刪除字元(行為空時退出) |
Ctrl+L | 清屏 |
Ctrl+T | 交換游標前兩個字元 |
上箭頭 / 下箭頭 | 瀏覽歷史 |
Tab | 自動補全 |
Ctrl+C | 取消當前輸入(空行時連續按兩次退出) |
歷史記錄
REPL 會自動將歷史記錄儲存到 ~/.bun_repl_history(最多 1000 條),並在每次會話開始時載入。使用 上箭頭/下箭頭 瀏覽歷史記錄。
若要匯出歷史到其它檔案,使用 .save:
> .save ./my-session.txt
非互動模式
使用 -e / --eval 以 REPL 語義執行指令碼並退出。使用 -p / --print 除執行外會列印結果。
bun repl -e "const x: number = 42; console.log(x)"
# 42
bun repl -p "await fetch('https://example.com').then(r => r.status)"
# 200
bun repl -p "{ a: 1, b: 2 }"
# { a: 1, b: 2 }
這兩個標誌使用與互動式 REPL 相同的轉換,因此 Bun 會將裸物件字面量(如 { a: 1 })視為物件表示式,而不是塊語句。事件迴圈清空後行程會退出(待處理的定時器和 I/O 會先完成)。發生錯誤時,行程會以程式碼 1 退出。