Bun

bun run

bun CLI 可用於執行 JavaScript/TypeScript 檔案、package.json 指令稿和可執行套件

效能

Bun 的設計宗旨是快速啟動和快速執行。

在底層,Bun 使用 JavaScriptCore 引擎,這是 Apple 為 Safari 開發的引擎。在大多數情況下,啟動和執行效能比 V8(Node.js 和 Chromium 瀏覽器使用的引擎)更快。其轉譯器和執行時期是以 Zig 這種現代、高效能的語言編寫而成。在 Linux 上,這表示啟動時間比 Node.js 快 4 倍

bun hello.js5.2 毫秒
node hello.js25.1 毫秒
在 Linux 上執行簡單的 Hello World 指令稿

執行檔案

node <file> 比較

使用 bun run 來執行原始碼檔案。

bun run index.js

Bun 支援開箱即用的 TypeScript 和 JSX。每個檔案都會在執行前由 Bun 快速的原生轉譯器即時轉譯。

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

或者,您可以省略 run 關鍵字並使用「裸指令」;其行為相同。

bun index.tsx
bun index.js

--watch

若要以監看模式執行檔案,請使用 --watch 旗標。

bun --watch run index.tsx

注意 — 當使用 bun run 時,請將 Bun 旗標(例如 --watch)緊接在 bun 之後。

bun --watch run dev # ✔️ do this
bun run dev --watch # ❌ don't do this

在指令結尾出現的旗標將被忽略,並傳遞給 "dev" 指令稿本身。

執行 package.json 指令稿

npm run <script>yarn <script> 比較

bun [bun flags] run <script> [script flags]

您的 package.json 可以定義許多對應於 shell 指令的具名 "scripts"

{
  // ... other fields
  "scripts": {
    "clean": "rm -rf dist && echo 'Done.'",
    "dev": "bun server.ts"
  }
}

使用 bun run <script> 來執行這些指令稿。

bun run clean
 $ rm -rf dist && echo 'Done.'
 Cleaning...
 Done.

Bun 會在子 shell 中執行指令稿指令。在 Linux 和 macOS 上,它會依序檢查以下 shell,並使用找到的第一個:bashshzsh。在 Windows 上,它使用bun shell 來支援類似 bash 的語法和許多常見指令。

⚡️ 在 Linux 上,npm run 的啟動時間約為 170 毫秒;使用 Bun 則為 6 毫秒

指令稿也可以使用較短的指令 bun <script> 執行,但是如果有名稱相同的內建 bun 指令,則內建指令優先。在這種情況下,請使用更明確的 bun run <script> 指令來執行您的套件指令稿。

bun run dev

若要查看可用指令稿的清單,請在不帶任何引數的情況下執行 bun run

bun run
quickstart scripts:

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

 bun run dev
   bun server.ts

2 scripts

Bun 尊重生命週期鉤子。例如,如果定義了 precleanpostclean,則 bun run clean 將會執行它們。如果 pre<script> 失敗,Bun 將不會執行指令稿本身。

--bun

package.json 指令稿通常會參考本機安裝的 CLI,例如 vitenext。這些 CLI 通常是標記有 shebang 的 JavaScript 檔案,以指示應使用 node 執行它們。

#!/usr/bin/env node

// do stuff

預設情況下,Bun 會尊重此 shebang 並使用 node 執行指令稿。但是,您可以使用 --bun 旗標覆寫此行為。對於基於 Node.js 的 CLI,這將使用 Bun 而不是 Node.js 執行 CLI。

bun run --bun vite

篩選

在包含多個套件的 monorepo 中,您可以使用 --filter 引數一次在多個套件中執行指令稿。

使用 bun run --filter <name_pattern> <script> 在名稱與 <name_pattern> 相符的所有套件中執行 <script> 例如,如果您有包含名為 foobarbaz 的套件的子目錄,則執行

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

將在 barbaz 中執行 <script>,但不在 foo 中執行。

filter 的文件頁面中找到更多詳細資訊。

bun run - 從 stdin 傳送程式碼

bun run - 可讓您從 stdin 讀取 JavaScript、TypeScript、TSX 或 JSX 並執行它,而無需先寫入臨時檔案。

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

您也可以使用 bun run - 將檔案重新導向到 Bun。例如,將 .js 檔案當作 .ts 檔案執行

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

為了方便起見,當使用 bun run - 時,所有程式碼都會被視為具有 JSX 支援的 TypeScript。

bun run --smol

在記憶體受限的環境中,使用 --smol 旗標以降低記憶體使用量,但會犧牲效能。

bun --smol run index.tsx

這會導致垃圾收集器更頻繁地執行,這可能會減慢執行速度。但是,它在記憶體有限的環境中可能很有用。Bun 會根據可用記憶體(考量 cgroup 和其他記憶體限制)自動調整垃圾收集器的堆積大小,無論是否使用 --smol 旗標,因此這主要適用於您希望堆積大小成長速度更慢的情況。

解析順序

絕對路徑以及 ./.\\ 開頭的路徑永遠會被當作原始碼檔案執行。除非使用 bun run,否則執行具有允許副檔名的檔案時,會優先選擇檔案而非 package.json 指令碼。

當同時存在 package.json 指令碼和同名檔案時,bun run 會優先執行 package.json 指令碼。完整的解析順序如下:

  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 用法

$bun run <檔案或指令碼>

旗標

執行

--silent
不要印出指令碼命令
-b,--bun
強制指令碼或套件使用 Bun 的執行環境而非 Node.js(透過符號連結 node)
--watch
在檔案變更時自動重新啟動程序
--hot
在 Bun 執行環境、測試執行器或打包器中啟用自動重新載入
--no-clear-screen
當啟用 --hot 或 --watch 時,停用重新載入時清除終端機畫面
-e,--eval=<val>
將引數作為指令碼求值
-p,--print=<val>
將引數作為指令碼求值並印出結果

套件管理

--no-install
停用 Bun 執行環境中的自動安裝
--install=<val>
設定自動安裝行為。選項包括 "auto"(預設,當沒有 node_modules 時自動安裝)、"fallback"(僅限遺失的套件)、"force"(總是安裝)。
-i
在執行期間自動安裝相依性。等同於 --install=fallback。
--prefer-offline
略過 Bun 執行環境中套件的過時檢查,並從磁碟解析
--prefer-latest
在 Bun 執行環境中使用最新相符版本的套件,始終檢查 npm

偵錯

--inspect=<val>
啟動 Bun 的偵錯器
--inspect-wait=<val>
啟動 Bun 的偵錯器,等待連線後再執行
--inspect-brk=<val>
啟動 Bun 的偵錯器,在程式碼第一行設定中斷點並等待

環境

--shell=<val>
控制用於 package.json 指令碼的 shell。支援 'bun' 或 'system'
--smol
使用較少記憶體,但更頻繁地執行垃圾回收
--expose-gc
在全域物件上公開 gc()。對 Bun.gc() 沒有影響。
--no-deprecation
抑制所有自訂棄用報告。
--throw-deprecation
決定棄用警告是否會導致錯誤。
--title=<val>
設定程序標題
--zero-fill-buffers
布林值,強制 Buffer.allocUnsafe(size) 填滿零。
--main-fields=<val>
在 package.json 中查找的主要欄位。預設值取決於 --target
--extension-order=<val>
預設值為:.tsx,.ts,.jsx,.js,.json

設定

--if-present
如果進入點不存在,則不產生錯誤並結束
--port=<val>
設定 Bun.serve 的預設 port
--conditions=<val>
傳遞自訂條件以進行解析
--fetch-preconnect=<val>
在程式碼載入時預先連線到 URL
--max-http-header-size=<val>
設定 HTTP 標頭的最大大小(以位元組為單位)。預設值為 16KiB
--dns-result-order=<val>
設定 DNS 查找結果的預設順序。有效順序:verbatim(預設)、ipv4first、ipv6first
--tsconfig-override=<val>
指定自訂 tsconfig.json。預設值 <d>$cwd<r>/tsconfig.json
-c,--config=<val>
指定 Bun 設定檔的路徑。預設值 <d>$cwd<r>/bunfig.toml

篩選器和執行範圍

--elide-lines=<val>
使用 --filter 時顯示的指令碼輸出行數(預設值:10)。設定為 0 以顯示所有行。
-F,--filter=<val>
在所有符合模式的工作區套件中執行指令碼
-r,--preload=<val>
在載入其他模組之前先匯入模組

轉譯和打包

-d,--define=<val>
在解析時替換 K:V,例如 --define process.env.NODE_ENV:"development"。值會被解析為 JSON。
--drop=<val>
移除函式呼叫,例如 --drop=console 移除所有 console.* 呼叫。
-l,--loader=<val>
使用 .ext:loader 解析檔案,例如 --loader .js:jsx。有效的 loader:js、jsx、ts、tsx、json、toml、text、file、wasm、napi
--no-macros
停用在打包器、轉譯器和執行環境中執行巨集
--jsx-factory=<val>
在使用 classic JSX runtime 編譯 JSX 元素時,變更呼叫的函式
--jsx-fragment=<val>
變更編譯 JSX 片段時呼叫的函式
--jsx-import-source=<val>
宣告用於匯入 jsx 和 jsxs factory 函式的模組指定符。預設值:"react"
--jsx-runtime=<val>
"automatic"(預設)或 "classic"
--ignore-dce-annotations
忽略 tree-shaking 註解,例如 @__PURE__

環境變數

--env-file=<val>
從指定的檔案載入環境變數
--cwd=<val>
用於解析檔案和進入點的絕對路徑。這只會變更程序的 cwd。

說明和錯誤

-h,--help
顯示此選單並結束
--verbose-error-trace
傾印錯誤返回追蹤

其他選項

--breakpoint-print=<val>
偵錯模式:當印出包含此字串的內容時中斷

範例

執行 JavaScript 或 TypeScript 檔案
bun run ./index.js
bun run ./index.tsx
執行 package.json 指令碼
bun run dev
bun run lint
完整文件請參閱 https://bun.dev.org.tw/docs/cli/run