Bun

bun run

bun CLI 可用於執行 JavaScript/TypeScript 檔案、package.json 指令碼,以及 可執行套件

效能

Bun 設計為啟動快速且執行快速。

Bun 在幕後使用 JavaScriptCore 引擎,此引擎是由 Apple 為 Safari 開發。在多數情況下,啟動和執行效能都比 V8 快,而 V8 是 Node.js 和基於 Chromium 的瀏覽器所使用的引擎。它的轉譯器和執行時間是用 Zig 編寫的,Zig 是一種現代且高效能的語言。在 Linux 上,這轉化為比 Node.js 快 4 倍 的啟動時間。

bun hello.js5.2ms
node hello.js25.1ms
在 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 中執行指令碼指令。它會依序檢查以下 shell,並使用找到的第一個:bashshzsh

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

如果 package.json 指令碼與內建 bun 指令(installdevupgrade 等)之間有名稱衝突,則 Bun 的內建指令優先。在這種情況下,請使用更明確的 bun run 指令來執行您的套件指令碼。

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 尊重生命週期掛鉤。例如,如果已定義,bun run clean 將執行 precleanpostclean。如果 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 標記,因此這對於您希望堆積大小增長得更慢的情況特別有用。