如果在工作目錄或更高層級中找不到 node_modules
目錄,Bun 將放棄 Node.js 風格的模組解析,轉而採用Bun 模組解析演算法。
在 Bun 風格的模組解析下,所有匯入的套件都會在執行期間自動安裝到 全域模組快取 中(與 bun install
使用的快取相同)。
import { foo } from "foo"; // install `latest` version
foo();
當您第一次執行此指令碼時,Bun 會自動安裝 "foo"
並快取它。下次您執行指令碼時,它將使用快取的版本。
版本解析
為了確定要安裝哪個版本,Bun 會遵循下列演算法
- 在專案根目錄中檢查是否有
bun.lockb
檔案。如果存在,請使用鎖定檔中指定的版本。 - 否則,向上掃描樹狀結構,尋找包含
"foo"
作為相依項的package.json
。如果找到,請使用指定的 semver 版本或版本範圍。 - 否則,請使用
latest
。
快取行為
一旦確定版本或版本範圍,Bun 將會
- 檢查模組快取是否有相容版本。如果存在,請使用它。
- 在解析
latest
時,Bun 會檢查package@latest
是否已下載並快取在過去 24 小時 內。如果是,請使用它。 - 否則,從
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 install
或bun install
。只要bun run
就可以了。 - 向下相容性 — 由於 Bun 仍然尊重
package.json
中指定的版本(如果存在),您可以使用單一指令切換到 Bun 式解析:rm -rf node_modules
。
限制
- 沒有 Intellisense。IDE 中的 TypeScript 自動完成功能依賴於
node_modules
中的類型宣告檔案。我們正在研究各種解決方案。 - 不支援 patch-package
常見問題
這與 pnpm 的作法有何不同?
這與 Yarn Plug'N'Play 的作法有何不同?
這與 Deno 的作法有何不同?