Bun

自動安裝

如果在工作目錄或更高層級中找不到 node_modules 目錄,Bun 將放棄 Node.js 風格的模組解析,轉而採用Bun 模組解析演算法

在 Bun 風格的模組解析下,所有匯入的套件都會在執行期間自動安裝到 全域模組快取 中(與 bun install 使用的快取相同)。

import { foo } from "foo"; // install `latest` version

foo();

當您第一次執行此指令碼時,Bun 會自動安裝 "foo" 並快取它。下次您執行指令碼時,它將使用快取的版本。

版本解析

為了確定要安裝哪個版本,Bun 會遵循下列演算法

  1. 在專案根目錄中檢查是否有 bun.lockb 檔案。如果存在,請使用鎖定檔中指定的版本。
  2. 否則,向上掃描樹狀結構,尋找包含 "foo" 作為相依項的 package.json。如果找到,請使用指定的 semver 版本或版本範圍。
  3. 否則,請使用 latest

快取行為

一旦確定版本或版本範圍,Bun 將會

  1. 檢查模組快取是否有相容版本。如果存在,請使用它。
  2. 在解析 latest 時,Bun 會檢查 package@latest 是否已下載並快取在過去 24 小時 內。如果是,請使用它。
  3. 否則,從 npm 登錄下載並安裝適當的版本。

安裝

套件會安裝並快取到 <cache>/<pkg>@<version>,因此可以同時快取同一個套件的許多版本。此外,在 <cache>/<pkg>/<version> 下會建立一個符號連結,以加快查詢快取中存在的套件的所有版本。

版本指定

整個解析演算法可以透過在匯入陳述式中直接指定版本或版本範圍來短路。

import { z } from "zod@3.0.0"; // specific version
import { z } from "zod@next"; // npm tag
import { z } from "zod@^3.20.0"; // semver range

好處

這種自動安裝方法有幾個好處

  • 空間效率 — 相依項的每個版本只會存在於磁碟上的單一位置。與重複的每個專案安裝相比,這節省了大量的空間和時間。
  • 可攜性 — 為了分享簡單的腳本和摘要,您的原始檔是 獨立的。不需要將包含程式碼和設定檔的目錄 zip 在一起。使用 import 陳述式中的版本指定,甚至不需要 package.json
  • 便利性 — 在執行檔案或腳本之前,不需要執行 npm installbun install。只要 bun run 就可以了。
  • 向下相容性 — 由於 Bun 仍然尊重 package.json 中指定的版本(如果存在),您可以使用單一指令切換到 Bun 式解析:rm -rf node_modules

限制

  • 沒有 Intellisense。IDE 中的 TypeScript 自動完成功能依賴於 node_modules 中的類型宣告檔案。我們正在研究各種解決方案。
  • 不支援 patch-package

常見問題

這與 pnpm 的作法有何不同?

這與 Yarn Plug'N'Play 的作法有何不同?

這與 Deno 的作法有何不同?