Skip to content

import Run from "/snippets/cli/run.mdx";

Bun 運行時旨在快速啟動和快速運行。

在底層,Bun 使用 JavaScriptCore 引擎,這是 Apple 為 Safari 開發的引擎。在大多數情況下,啟動和運行性能比 Node.js 和基於 Chromium 的瀏覽器使用的 V8 引擎更快。其轉譯器和運行時使用 Zig(一種現代高性能語言)編寫。在 Linux 上,這意味著啟動時間比 Node.js 快 4 倍

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

此基准測試基於在 Linux 上運行簡單的 Hello World 腳本。

運行文件

使用 bun run 執行源文件。

bash
bun run index.js

Bun 開箱即用支持 TypeScript 和 JSX。每個文件在 Bun 執行之前都會通過 Bun 的快速原生轉譯器即時轉譯。

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

或者,你可以省略 run 關鍵字並使用"裸"命令;它表現相同。

bash
bun index.tsx
bun index.js

--watch

要在監視模式下運行文件,使用 --watch 標志。

bash
bun --watch run index.tsx

::: note 使用 bun run 時,將 --watch 等 Bun 標志放在 bun 之後。 :::

bash
bun --watch run dev # ✔️ 這樣做
bun run dev --watch # ❌ 不要這樣做

出現在命令末尾的標志將被忽略並傳遞給 "dev" 腳本本身。

運行 package.json 腳本

::: note 與 npm run <script>yarn <script> 比較 :::

sh
bun [bun 標志] run <script> [腳本標志]

你的 package.json 可以定義多個對應 shell 命令的命名 "scripts"

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

使用 bun run <script> 執行這些腳本。

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

Bun 在子 shell 中執行腳本命令。在 Linux 和 macOS 上,它按順序檢查以下 shell,使用找到的第一個:bashshzsh。在 Windows 上,它使用 bun shell 來支持 bash 風格的語法和許多常見命令。

NOTE

⚡️ 在 Linux 上 `npm run` 的啟動時間大約為 170ms;使用 Bun 時為 `6ms`。

腳本也可以使用更短的命令 bun <script> 運行,但是如果存在同名的內置 bun 命令,則內置命令優先。在這種情況下,使用更明確的 bun run <script> 命令來執行你的包腳本。

bash
bun run dev

要查看可用腳本列表,運行不帶任何參數的 bun run

bash
bun run
txt
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 執行。

js
#!/usr/bin/env node

// do stuff

默認情況下,Bun 尊重此 shebang 並使用 node 執行腳本。但是,你可以使用 --bun 標志覆蓋此行為。對於基於 Node.js 的 CLI,這將使用 Bun 而不是 Node.js 運行 CLI。

bash
bun run --bun vite

過濾

在包含多個包的 monorepo 中,你可以使用 --filter 參數一次在多個包中執行腳本。

使用 bun run --filter <name_pattern> <script> 在名稱匹配 <name_pattern> 的所有包中執行 <script>。 例如,如果你有包含名為 foobarbaz 的包的子目錄,運行

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

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

filter 文檔頁面中查找更多詳細信息。

bun run - 從 stdin 管道代碼

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

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

你還可以使用 bun run - 將文件重定向到 Bun。例如,將 .js 文件作為 .ts 文件運行:

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

為方便起見,使用 bun run - 時,所有代碼都被視為帶有 JSX 支持的 TypeScript。

bun run --console-depth

使用 --console-depth 標志控制控制台輸出中對象檢查的深度。

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

這設置了 console.log() 輸出中對象嵌套的深度。默認深度為 2。更高的值顯示更多嵌套屬性,但對於復雜對象可能會產生冗長的輸出。

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

bun run --smol

在內存受限的環境中,使用 --smol 標志以減少內存使用,但會降低性能。

bash
bun --smol run index.tsx

這會導致垃圾回收器更頻繁地運行,這可能會減慢執行速度。但是,它在內存有限的環境中可能很有用。Bun 會根據可用內存(考慮 cgroups 和其他內存限制)自動調整垃圾回收器的堆大小,無論是否使用 --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

Bun學習網由www.bunjs.com.cn整理維護