bun
CLI 可用於執行 JavaScript/TypeScript 檔案、package.json
指令稿和可執行套件。
效能
Bun 的設計宗旨是快速啟動和快速執行。
在底層,Bun 使用 JavaScriptCore 引擎,這是 Apple 為 Safari 開發的引擎。在大多數情況下,啟動和執行效能比 V8(Node.js 和 Chromium 瀏覽器使用的引擎)更快。其轉譯器和執行時期是以 Zig 這種現代、高效能的語言編寫而成。在 Linux 上,這表示啟動時間比 Node.js 快 4 倍。
bun hello.js | 5.2 毫秒 |
node hello.js | 25.1 毫秒 |
執行檔案
與 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,並使用找到的第一個:bash
、sh
、zsh
。在 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 尊重生命週期鉤子。例如,如果定義了 preclean
和 postclean
,則 bun run clean
將會執行它們。如果 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
旗標,因此這主要適用於您希望堆積大小成長速度更慢的情況。
解析順序
絕對路徑以及 ./
或 .\\
開頭的路徑永遠會被當作原始碼檔案執行。除非使用 bun run
,否則執行具有允許副檔名的檔案時,會優先選擇檔案而非 package.json 指令碼。
當同時存在 package.json 指令碼和同名檔案時,bun run
會優先執行 package.json 指令碼。完整的解析順序如下:
- package.json 指令碼,例如
bun run build
- 原始碼檔案,例如
bun run src/main.js
- 專案套件中的二進制檔,例如
bun add eslint && bun run eslint
- (僅限
bun run
)系統命令,例如bun run ls