從註冊表下載的所有套件都儲存在 ~/.bun/install/cache
的全球快取中。它們儲存在命名為 ${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 上專案的 node_modules
目錄中,因此套件的內容只存在於磁碟上的單一位置,大幅減少專用於 node_modules
的磁碟空間量。
此優點也適用於 macOS,但有例外。它使用寫入時複製的 clonefile
,表示它不會佔用磁碟空間,但會計入磁碟機的限制。如果某些東西嘗試修補 node_modules/*
,這種行為很有用,因此不可能影響其他安裝。
此行為可透過 --backend
旗標進行設定,Bun 的所有套件管理命令都會遵守此旗標。
hardlink
:Linux 上的預設值。clonefile
macOS 上的預設值。clonefile_each_dir
:類似於 clonefile
,但它會個別複製每個檔案到每個目錄。它僅在 macOS 上可用,而且執行速度往往比 clonefile
慢。copyfile
:當上述任何一個失敗時使用的後備方案。它是速度最慢的選項。在 macOS 上,它使用 fcopyfile()
;在 Linux 上,它使用 copy_file_range()
。symlink
:目前僅用於 file:
(最終為 link:
)相依關係。為了防止無限迴圈,它會略過連結 node_modules
資料夾。
如果你使用 --backend=symlink
安裝,除非每個相依關係都有自己的 node_modules
資料夾,否則 Node.js 無法解析相依關係的 node_modules,或者你將 --preserve-symlinks
傳遞給 node
。請參閱 Node.js 關於 --preserve-symlinks
的文件。
bun install --backend symlink
node --preserve-symlinks ./foo.js
Bun 的執行時期目前未公開等同於 --preserve-symlinks
的功能。