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

全域性快取

Bun 如何在全域性快取中儲存和管理包

Bun 會將從登錄檔下載的每個軟體包儲存在全域性快取中,快取路徑為 ~/.bun/install/cache,或由 BUN_INSTALL_CACHE_DIR 環境變數設定的路徑。軟體包儲存在名稱類似 ${name}@${version} 的子目錄中,因此 Bun 可以快取同一軟體包的多個版本。

設定快取行為
bunfig.toml
[install.cache]
# 快取使用的目錄
dir = "~/.bun/install/cache"

# 為 true 時,不從全域性快取載入。
# 但 Bun 可能仍然會寫入 node_modules/.cache
disable = false

# 為 true 時,總是從登錄檔解析最新版本
disableManifest = false

減少重複下載

安裝軟體包時,如果快取中已有 package.json 指定範圍內的某個版本,Bun 會使用快取中的副本,而不是再次下載。

安裝詳情

如果 semver 版本帶有預釋出字尾(1.0.0-beta.0)或建置字尾(1.0.0+20220101),Bun 會將字尾替換為該值的雜湊,以降低長檔案路徑導致錯誤的可能性。

當 node_modules 資料夾存在時,Bun 會在安裝前檢查 node_modules 是否包含所有預期的軟體包及其對應版本。如果是,則 bun install 完成。Bun 使用自定義 JSON 解析器,在找到 "name" 和 "version" 後立即停止解析。

如果缺少軟體包,或其版本與 package.json 不相容,Bun 會在快取中查詢相容的模組。如果快取中有,則 Bun 會將其安裝到 node_modules。否則,Bun 會從登錄檔下載軟體包,然後進行安裝。


快速複製

軟體包下載到快取後,Bun 仍需將這些檔案複製到 node_modules。為此,它會使用最快的系統呼叫:在 Linux 和 Windows 上使用硬連結,在 macOS 上使用 clonefile。


節省磁碟空間

在 Linux 和 Windows 上,Bun 使用硬連結將模組“複製”到專案的 node_modules 目錄中,因此軟體包內容在磁碟上只儲存一份。這大大減少了 node_modules 佔用的磁碟空間。

macOS 上也是如此,但有一個例外。Bun 在 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:為每個檔案建立符號連結,而不是複製檔案。只有提升式安裝會使用它:--backend=symlink 會將其應用於每個軟體包(macOS 和 Linux;Windows 會忽略該標誌);不使用該標誌時,Bun 僅會將其用於專案目錄之外的 file: 相依項(例如 file:../foo)以及傳遞性 file: 相依項。

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

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

Bun 的執行環境同樣支援 --preserve-symlinks。