執行環境套件管理器打包器測試執行器程式碼檢查格式化指南參考部落格意見回饋

從 npm install 遷移到 bun install

bun install 是一個快速且相容 Node.js 的 npm 客戶端。

要從 npm install 遷移到 bun install,請改用 bun install,不要再使用 npm install。

  • 為 Node.js 和 Bun 設計:bun install 會安裝一個相容 Node.js 的 node_modules 資料夾。你可以在 Node.js 專案中直接替代 npm install 使用,無需修改任何程式碼,也無需使用 Bun 的執行環境。
  • 自動將 package-lock.json 轉換為 Bun 的 bun.lock 鎖檔案格式,並保留現有已解析的相依版本。你可以在工作中悄悄使用 bun install 替代 npm install,而不會被任何人察覺。
  • 相容 .npmrc:bun install 會從 npm 的 .npmrc 中讀取 npm registry 設定,因此 npm 和 Bun 可以使用相同的設定。
  • 硬連結:在 Windows 和 Linux 上,bun install 使用硬連結來節省磁碟空間並加快安裝速度。
terminal
# 遷移只需一條命令
bun i

# 新增相依:
bun i @types/bun

# 新增開發相依:
bun i -d @types/bun

# 移除相依:
bun rm @types/bun

更快地執行 package.json 指令碼

使用單個命令執行 package.json 中的指令碼、node_modules/.bin 中的執行檔(如 npx),以及 JavaScript/TypeScript 檔案(如 node)。

NPMBun
npm run <script>bun <script>
npm exec <bin>bun <bin>
node <file>bun <file>
npx <package>bunx <package>

bun run <executable> 使用本地安裝的執行檔。

terminal
# 執行 package.json 指令碼:
bun my-script
bun run my-script

# 執行 node_modules/.bin 中的可執行程式:
bun my-executable # 例如 tsc,esbuild 等
bun run my-executable

# 執行一個 JavaScript/TypeScript 檔案:
bun ./index.ts

支援工作區(Workspaces)

bun install 支援類似 npm 的工作區功能,並且提供更多特性。

在 package.json 中,將 "workspaces" 設定為相對路徑陣列。

package.json
{
  "name": "my-app",
  "workspaces": ["packages/*", "apps/*"]
}

按工作區名稱篩選指令碼

在 Bun 中,--filter 標誌接受一個 glob 模式,並按照相依順序,為每個名稱與其匹配的工作區包並行執行命令。

terminal
bun --filter 'lib-*' my-script
# 替代以下寫法:
# npm run --workspace lib-foo --workspace lib-bar my-script

更新相依

bun update <package> 將相依更新到滿足 package.json 中 semver 範圍的最新版本。

terminal
# 更新單個相依
bun update @types/bun

# 更新所有相依
bun update

# 忽略 semver 範圍,更新到最新版本
bun update @types/bun --latest

# 更新相依到指定版本
bun update @types/bun@1.3.3

# 更新所有相依到最新版本
bun update --latest

檢視過期相依

要檢視過期相依,請執行 bun outdated。它的工作方式類似於 npm outdated,但輸出更加緊湊。

terminal
bun outdated
Text
┌────────────────────────────────────────┬─────────┬────────┬────────┐
│ Package                                │ Current │ Update │ Latest │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ @types/bun (dev)                       │ 1.1.6   │ 1.1.10 │ 1.1.10 │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ @types/react (dev)                     │ 18.3.3  │ 18.3.8 │ 18.3.8  │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ @typescript-eslint/eslint-plugin (dev) │ 7.16.1  │ 7.18.0 │ 8.6.0  │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ @typescript-eslint/parser (dev)        │ 7.16.1  │ 7.18.0 │ 8.6.0  │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ @vscode/debugadapter (dev)             │ 1.66.0  │ 1.67.0 │ 1.67.0 │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ esbuild (dev)                          │ 0.21.5  │ 0.21.5 │ 0.24.0 │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ eslint (dev)                           │ 9.7.0   │ 9.11.0 │ 9.11.0 │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ mitata (dev)                           │ 0.1.11  │ 0.1.14 │ 1.0.2  │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ prettier-plugin-organize-imports (dev) │ 4.0.0   │ 4.1.0  │ 4.1.0  │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ source-map-js (dev)                    │ 1.2.0   │ 1.2.1  │ 1.2.1  │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ typescript (dev)                       │ 5.5.3   │ 5.6.2  │ 5.6.2  │
└────────────────────────────────────────┴─────────┴────────┴────────┘

列出已安裝的包

bun pm ls 列出 node_modules 資料夾中安裝的軟體包,並使用 Bun 的鎖檔案作為真實來源。傳遞 -a 標誌還可以列出傳遞相依項。

terminal
# 列出頂級已安裝的包:
bun pm ls
Text
my-pkg node_modules (781 installed)
├── @types/node@20.16.5
├── @types/react@18.3.8
├── @types/react-dom@18.3.0
├── eslint@8.57.1
├── eslint-config-next@14.2.8
...
terminal
# 列出所有已安裝的包:
bun pm ls -a
Text
my-pkg node_modules
├── @alloc/quick-lru@5.2.0
├── @isaacs/cliui@8.0.2
│   └── strip-ansi@7.1.0
│       └── ansi-regex@6.1.0
├── @jridgewell/gen-mapping@0.3.5
├── @jridgewell/resolve-uri@3.1.2
...

建立包的壓縮包

bun pm pack 會在當前目錄中建立包的 tarball。

terminal
# 建立一個 tarball
bun pm pack
Text
Total files: 46
Shasum: 2ee19b6f0c6b001358449ca0eadead703f326216
Integrity: sha512-ZV0lzWTEkGAMz[...]Gl4f8lA9sl97g==
Unpacked size: 0.41MB
Packed size: 117.50KB

Shebang

如果軟體包在 #!/usr/bin/env node shebang 中引用了 node,bun run 預設會遵循該設定並使用系統的 node 執行檔。若要強制使用 Bun,請將 --bun 傳遞給 bun run。

傳遞 --bun 時,Bun 會在臨時目錄中建立一個名為 "node"、指向本地安裝的 Bun 執行檔的符號連結,並在指令碼執行期間將其新增到 PATH 中。

terminal
# 強制使用 Bun 執行環境而非 node
bun --bun my-script

# 以下用法同樣有效:
bun run --bun my-script

全域性安裝

使用 bun i -g <package> 全域性安裝軟體包。預設情況下,它們會安裝到主目錄下的 .bun/install/global/node_modules 資料夾中。

terminal
# 全域性安裝一個包
bun i -g eslint

# 執行全域性安裝的包,無需 `bun run` 字首
eslint --init