Skip to content

所有從注冊表下載的包都存儲在 ~/.bun/install/cache 的全局緩存中,或者存儲在環境變量 BUN_INSTALL_CACHE_DIR 定義的路徑中。它們存儲在名為 ${name}@${version} 的子目錄中,因此可以緩存多個版本的包。

配置緩存行為

toml
[install.cache]
# 用於緩存的目錄
dir = "~/.bun/install/cache"

# 為 true 時,不從全局緩存加載。
# Bun 仍可能寫入 node_modules/.cache
disable = false

# 為 true 時,始終從注冊表解析最新版本
disableManifest = false

最小化重新下載

Bun 致力於避免多次重新下載包。安裝包時,如果緩存已經包含 package.json 指定范圍內的版本,Bun 將使用緩存的包而不是再次下載它。

安裝詳情

如果 semver 版本有預發布後綴(1.0.0-beta.0)或構建後綴(1.0.0+20220101),它會被替換為該值的哈希值,以減少與長文件路徑相關的錯誤機會。

node_modules 文件夾存在時,在安裝之前,Bun 會檢查 node_modules 是否包含所有具有適當版本的預期包。如果是這樣,bun install 完成。Bun 使用自定義 JSON 解析器,一旦找到 "name""version" 就會停止解析。

如果包缺失或具有與 package.json 不兼容的版本,Bun 會在緩存中檢查兼容的模塊。如果找到,它會被安裝到 node_modules 中。否則,包將從注冊表下載然後安裝。


快速復制

一旦包被下載到緩存中,Bun 仍然需要將這些文件復制到 node_modules 中。Bun 使用可用的最快系統調用來執行此任務。在 Linux 上,它使用硬鏈接;在 macOS 上,它使用 clonefile


節省磁盤空間

由於 Bun 在 Linux 和 Windows 上使用硬鏈接將模塊"復制"到項目的 node_modules 目錄中,包的內容只存在於磁盤上的一個位置,大大減少了專用於 node_modules 的磁盤空間量。

此好處也適用於 macOS,但有例外。它使用 clonefile 進行寫時復制,這意味著它不會佔用磁盤空間,但會計入驅動器的限制。如果某些東西試圖修補 node_modules/*,此行為很有用,因此不可能影響其他安裝。

安裝策略

此行為可以使用 --backend 標志進行配置,Bun 的所有包管理命令都遵循此標志。

  • hardlink:Linux 和 Windows 上的默認值。
  • clonefile:macOS 上的默認值。
  • clonefile_each_dir:類似於 clonefile,只是它逐個目錄克隆每個文件。它僅適用於 macOS,並且往往比 clonefile 慢。
  • copyfile:當上述任何一項失敗時使用的回退方案。它是最慢的選項。在 macOS 上,它使用 fcopyfile();在 Linux 上,它使用 copy_file_range()
  • symlink:當前僅用於 file:(最終也會用於 link:)依賴項。為防止無限循環,它會跳過符號鏈接 node_modules 文件夾。

如果你使用 --backend=symlink 安裝,Node.js 將無法解析依賴項的 node_modules,除非每個依賴項都有自己的 node_modules 文件夾,或者你向 node 傳遞 --preserve-symlinks。請參閱 Node.js 關於 --preserve-symlinks 的文檔

bash
bun install --backend symlink
node --preserve-symlinks ./foo.js

Bun 的運行時目前不提供等效的 --preserve-symlinks

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