所有從註冊表下載的套件都儲存在全域快取中,路徑為 ~/.bun/install/cache
,或由環境變數 BUN_INSTALL_CACHE_DIR
定義的路徑。它們儲存在類似 ${name}@${version}
的子目錄中,因此可以快取套件的多個版本。
[install.cache]
# the directory to use for the cache
dir = "~/.bun/install/cache"
# when true, don't load from the global cache.
# Bun may still write to node_modules/.cache
disable = false
# when true, always resolve the latest versions from the registry
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
資料夾,或者您將 --preserve-symlinks
傳遞給 node
。請參閱 Node.js 關於 --preserve-symlinks
的文件。
bun install --backend symlink
node --preserve-symlinks ./foo.js
Bun 的執行時環境目前沒有公開與 --preserve-symlinks
等效的功能。