bun
CLI 可用於執行 JavaScript/TypeScript 檔案、package.json
指令碼,以及 可執行套件。
效能
Bun 設計為啟動快速且執行快速。
Bun 在幕後使用 JavaScriptCore 引擎,此引擎是由 Apple 為 Safari 開發。在多數情況下,啟動和執行效能都比 V8 快,而 V8 是 Node.js 和基於 Chromium 的瀏覽器所使用的引擎。它的轉譯器和執行時間是用 Zig 編寫的,Zig 是一種現代且高效能的語言。在 Linux 上,這轉化為比 Node.js 快 4 倍 的啟動時間。
bun hello.js | 5.2ms |
node hello.js | 25.1ms |
執行檔案
與 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,並使用找到的第一個:bash
、sh
、zsh
。
⚡️ 在 Linux 上,npm run
的啟動時間約為 170 毫秒;使用 Bun 則為 6 毫秒
。
如果 package.json
指令碼與內建 bun
指令(install
、dev
、upgrade
等)之間有名稱衝突,則 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
將執行 preclean
和 postclean
。如果 pre<script>
失敗,Bun 將不會執行腳本本身。
--bun
package.json
腳本通常會參照本地安裝的 CLI,例如 vite
或 next
。這些 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>
。例如,如果您有包含名為 foo
、bar
和 baz
的套件的子目錄,則執行
bun run --filter 'ba*' <script>
將在 bar
和 baz
中執行 <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
標記,因此這對於您希望堆積大小增長得更慢的情況特別有用。