執行環境套件管理器打包器測試執行器程式碼檢查格式化指南參考部落格意見回饋

Bun 執行環境

使用 Bun 的快速執行環境執行 JavaScript/TypeScript 檔案、package.json 指令碼及可執行程式包。

Bun 執行環境旨在快速啟動與高效執行。

Bun 使用 JavaScriptCore 引擎,該引擎由 Apple 為 Safari 開發。JavaScriptCore 通常比 V8 啟動和執行得更快,V8 是 Node.js 和基於 Chromium 的瀏覽器所使用的引擎。Bun 的轉譯器和執行環境使用 Rust 編寫。在 Linux 上,Bun 的啟動速度比 Node.js 快 4 倍。

命令時間
bun hello.js5.2ms
node hello.js25.1ms

該基準測試在 Linux 上執行 Hello World 指令碼。

執行檔案

使用 bun run 執行原始檔。

terminal
bun run index.js

Bun 無需設定即可支援 TypeScript 和 JSX。Bun 會在執行每個檔案之前,使用原生的轉譯器即時轉譯檔案。

terminal
bun run index.js
bun run index.jsx
bun run index.ts
bun run index.tsx

或者,你可以省略 run 關鍵字,使用裸命令,行為完全相同。

terminal
bun index.tsx
bun index.js

--watch

使用 --watch 標誌可以以監聽模式執行檔案。

terminal
bun --watch run index.tsx

執行 package.json 指令碼

shell
bun [bun 標誌] run <script> [指令碼標誌]

你的 package.json 可以定義與 Shell 命令對應的命名 "scripts"。

package.json
{
  // ... 其他欄位
  "scripts": {
    "clean": "rm -rf dist && echo 'Done.'",
    "dev": "bun server.ts"
  }
}

用 bun run <script> 執行這些指令碼。

terminal
bun run clean
rm -rf dist && echo 'Done.'
Text
Done.

Bun 在子 Shell 中執行指令碼命令。在 Linux 和 macOS 上,它會按以下順序檢查 Shell,並使用找到的第一個:bash、sh、zsh。在 Windows 上,它使用 Bun Shell 來支援類似 bash 的語法和許多常用命令。

你也可以使用更短的命令 bun <script> 來執行指令碼。如果內建的 bun 命令與指令碼同名,則優先使用內建命令;此時請使用明確的 bun run <script> 來執行包指令碼。

terminal
bun run dev

要檢視可用指令碼列表,無需引數直接執行 bun run。

terminal
bun run
Text
...
package.json scripts (2 found):
  $ bun run clean
    rm -rf dist && echo 'Done.'

  $ bun run dev
    bun server.ts

Bun 支援生命週期鉤子。例如,如果定義了 preclean 和 postclean,則 bun run clean 會依次執行它們。如果 pre<script> 執行失敗,Bun 不會執行指令碼本身。

--bun

通常 package.json 指令碼會引用本地安裝的 CLI,如 vite 或 next。這些 CLI 通常是帶有 shebang 的 JavaScript 檔案,用於指示使用 node 執行。

cli.js
#!/usr/bin/env node

// 執行相關操作

預設情況下,Bun 遵循此 shebang,並使用 node 執行指令碼。--bun 標誌會覆蓋此設定:CLI 將使用 Bun 而不是 Node.js 執行。

terminal
bun run --bun vite

過濾執行

在 monorepo 中,--filter 引數可以一次在多個包中執行指令碼。

bun run --filter <pattern> <script> 會在 <pattern> 選中的每個包中執行 <script>。模式可以是包名 glob、./path、{dir} 目錄或類似 foo... 的相依關係。 例如,如果你有幾個子目錄,其中包含名為 foo、bar 和 baz 的包,執行

terminal
bun run --filter 'ba*' <script>

會在 bar 和 baz 中執行 <script>,但不會在 foo 中執行。

請參閱 --filter。

bun run - 從 stdin 管道執行程式碼

bun run - 從 stdin 讀取 JavaScript、TypeScript、TSX 或 JSX,並在不先寫入臨時檔案的情況下執行。

terminal
echo "console.log('Hello')" | bun run -
Text
Hello

你也可以用 bun run - 把檔案重定向給 Bun。例如,把 .js 檔案當作 .ts 檔案執行:

terminal
echo "console.log!('This is TypeScript!' as any)" > secretly-typescript.js
bun run - < secretly-typescript.js
Text
This is TypeScript!

bun run - 會將所有輸入視為支援 JSX 的 TypeScript。

bun run --console-depth

用 --console-depth 標誌控制 console.log() 輸出中物件檢查的深度。

terminal
bun --console-depth 5 run index.tsx

--console-depth 設定 Bun 在 console.log() 輸出中顯示巢狀物件的深度。預設深度為 2。更大的值會顯示更多巢狀屬性,但對於複雜物件可能會產生冗長的輸出。

console.ts
const nested = { a: { b: { c: { d: "deep" } } } };
console.log(nested);
// 使用 --console-depth 2(預設值):{ a: { b: { c: [Object] } } }
// 使用 --console-depth 4:{ a: { b: { c: { d: 'deep' } } } }

bun run --smol

在記憶體受限環境中,使用 --smol 標誌以降低記憶體使用,但會降低效能。

terminal
bun --smol run index.tsx

--smol 會使垃圾回收器更頻繁地執行,這可能會降低執行速度。無論是否使用 --smol 標誌,Bun 都會根據可用記憶體(考慮 cgroups 和其他記憶體限制)調整垃圾回收器的堆大小。因此,該標誌主要適用於希望堆增長得更慢的情況。

解析順序

Bun 始終將絕對路徑以及以 ./ 或 .\\ 開頭的路徑作為原始檔執行。除非使用 bun run,否則帶有允許的副檔名的名稱會解析為檔案,而不是 package.json 指令碼。

當 package.json 指令碼與檔案同名時,bun run 會優先選擇指令碼。完整的解析順序如下:

  1. package.json 指令碼:bun run build
  2. 原始檔:bun run src/main.js
  3. 專案相依包中的二進位制檔案:bun add eslint && bun run eslint
  4. (僅限 bun run)系統命令:bun run ls

CLI 用法

bash
bun run <檔案或指令碼>

常規執行選項

--silentboolean

不列印指令碼命令

--if-presentboolean

如果入口點不存在,則退出且不報錯

--evalstring

將引數作為指令碼執行。別名:-e

--printstring

將引數作為指令碼執行並列印結果。別名:-p

--helpboolean

顯示此選單後退出。別名:-h

工作空間管理

--elide-linesnumberdefault 0

使用 --filter 時,將每個指令碼的輸出截斷為最後 N 行。預設值 0 表示顯示所有行

--filterstring

在匹配該模式的所有工作空間包中執行指令碼。別名:-F

--workspacesboolean

在所有工作空間包(來自 package.json 中的 workspaces 欄位)中執行指令碼

--parallelboolean

並行執行多個指令碼或工作空間指令碼,並帶有字首輸出

--sequentialboolean

依次執行多個指令碼或工作空間指令碼,並帶有字首輸出

--no-exit-on-errorboolean

使用 --parallel 或 --sequential 時,當某指令碼失敗,繼續執行其他指令碼

執行環境及行程控制

--bunboolean

強制指令碼或包使用 Bun 執行環境而非 Node.js(通過軟連結 node)。別名:-b

--shellstring

控制 package.json 指令碼所用的 shell,支援 bun 或 system

--interactiveboolean

開啟相容 Node.js 的 REPL(node:repl)。與 -e 結合使用時,會啟動 REPL,然後執行指令碼。在 --interactive 模式下,-e 是原始 JavaScript(與 node -i -e 相同)。要使用 TypeScript,請執行 bun repl。這與 bun repl 不同,後者是 Bun 的原生 REPL。

--smolboolean

使用更少記憶體,但更頻繁地進行垃圾回收

--expose-gcboolean

在全域性物件上暴露 gc()。對 Bun.gc() 無影響

--no-deprecationboolean

禁止顯示所有棄用警告

--throw-deprecationboolean

將棄用警告作為錯誤丟擲

--titlestring

設定行程標題

--zero-fill-buffersboolean

強制將 Buffer.allocUnsafe(size) 建立的緩衝區填充為零

--no-addonsboolean

如果呼叫 process.dlopen 或 bun:ffi cc(),則丟擲錯誤,並停用匯出條件 node-addons

--no-ffi-ccboolean

如果呼叫 bun:ffi cc(),則丟擲錯誤(停用 C 編譯器)

--unhandled-rejectionsstring

以下之一:strict、throw、warn、none,或 warn-with-error-code

--console-depthnumberdefault 2

設定 console.log 物件檢查的預設深度(預設:2)

開發工作流

--watchboolean

檔案變更時自動重啟行程

--watch-kill-signalstringdefault SIGTERM

當 --watch 重啟行程時執行其處理程序的訊號

--hotboolean

在 Bun 執行環境、測試執行器或打包器中啟用自動過載

--no-clear-screenboolean

在啟用 --hot 或 --watch 時,禁止重新載入時清屏

除錯

--inspectstring

啟用 Bun 的偵錯程式

--inspect-waitstring

啟用 Bun 的偵錯程式,執行前等待連線

--inspect-brkstring

啟用 Bun 的偵錯程式,在程式碼第一行設定斷點並等待

相依與模組解析

--preloadstring

在 Bun 載入其他模組之前匯入一個模組。別名:-r

--requirestring

--preload 別名,為 Node.js 相容性設計

--importstring

--preload 別名,為 Node.js 相容性設計

--no-installboolean

停用 Bun 執行環境自動安裝

--installstringdefault auto

設定自動安裝行為。值為 auto(預設,node_modules 不存在時自動安裝), fallback(缺失包時安裝),force(始終安裝)

-iboolean

執行環境自動安裝相依。等同於 --install=fallback

--prefer-offlineboolean

跳過 Bun 執行環境中的包陳舊檢查,優先從磁碟解析

--prefer-latestboolean

使用最新匹配版本包,始終檢查 npm

--conditionsstring

傳遞自定義條件以進行解析

--main-fieldsstring

要在 package.json 中查詢的主欄位

--preserve-symlinksboolean

解析檔案時保留符號連結

--preserve-symlinks-mainboolean

解析主入口點時保留符號連結

--extension-orderstringdefault .tsx,.ts,.jsx,.cts,.cjs,.js,.mjs,.mts,.json,.node

預設值:.tsx,.ts,.jsx,.cts,.cjs,.js,.mjs,.mts,.json,.node

轉譯與語言特性

--tsconfig-overridestring

指定自定義 tsconfig.json,預設 $cwd/tsconfig.json

--definestring

解析時替換 K:V,例如 --define process.env.NODE_ENV:"development"。Bun 會將值解析為 JSON。別名:-d

--dropstring

移除函式呼叫,例如 --drop=console 會移除所有 console.* 呼叫

--loaderstring

通過 .ext:loader 解析檔案,例如 --loader .js:jsx。有效的載入器包括 js、 jsx、ts、tsx、json、toml、text、 file、wasm、napi。別名:-l

--no-macrosboolean

在打包器、轉譯器和執行環境中停用宏執行

--jsx-factorystring

改變使用經典 JSX 執行環境編譯 JSX 元素時呼叫的函式

--jsx-fragmentstring

改變編譯 JSX 片段時呼叫的函式

--jsx-import-sourcestringdefault react

宣告用於匯入 jsx 和 jsxs 工廠函式的模組說明符。預設值:react

--jsx-runtimestringdefault automatic

automatic(預設)或 classic

--jsx-side-effectsboolean

將 JSX 元素視為具有副作用(停用純註釋)

--ignore-dce-annotationsboolean

忽略諸如 @PURE 的樹搖註釋

網路與安全

--portnumber

設定 Bun.serve 的預設埠

--fetch-preconnectstring

載入程式碼時對 URL 進行預連線

--max-http-header-sizenumberdefault 16384

設定 HTTP 頭最大位元組數,預設 16KiB

--dns-result-orderstringdefault verbatim

設定 DNS 查詢結果的預設順序。有效值:verbatim(預設)、ipv4first、 ipv6first

--use-system-caboolean

使用系統的受信任證書頒發機構

--use-openssl-caboolean

使用 OpenSSL 的預設 CA 儲存

--use-bundled-caboolean

使用捆綁的 CA 儲存

--redis-preconnectboolean

啟動時預連線 $REDIS_URL

--sql-preconnectboolean

啟動時預連線 PostgreSQL

--user-agentstring

設定 HTTP 請求的預設 User-Agent 頭

全域性設定與上下文

--env-filestring

從指定檔案載入環境變數

--cwdstring

用於解析檔案和入口點的絕對路徑。此選項只會更改行程的 cwd

--configstring

指定 Bun 設定檔路徑。預設 $cwd/bunfig.toml。別名:-c

範例

執行一個 JavaScript 或 TypeScript 檔案:

bash
bun run ./index.js
bun run ./index.tsx

執行 package.json 指令碼:

bash
bun run dev
bun run lint