Alle aus der Registry heruntergeladenen Pakete werden in einem globalen Cache unter ~/.bun/install/cache oder dem durch die Umgebungsvariable BUN_INSTALL_CACHE_DIR definierten Pfad gespeichert. Sie werden in Unterverzeichnissen mit dem Namen ${name}@${version} gespeichert, sodass mehrere Versionen eines Pakets im Cache gespeichert werden können.
Cache-Verhalten konfigurieren
[install.cache]
# das Verzeichnis für den Cache
dir = "~/.bun/install/cache"
# wenn true, nicht aus dem globalen Cache laden.
# Bun kann weiterhin nach node_modules/.cache schreiben
disable = false
# wenn true, immer die neuesten Versionen aus der Registry auflösen
disableManifest = falseNeu-Downloads minimieren
Bun bemüht sich, das erneute Herunterladen von Paketen zu vermeiden. Bei der Installation eines Pakets verwendet Bun das zwischengespeicherte Paket, wenn der Cache bereits eine Version im von package.json angegebenen Bereich enthält.
Installationsdetails
Wenn die Semver-Version ein Pre-Release-Suffix (1.0.0-beta.0) oder ein Build-Suffix (1.0.0+20220101) hat, wird es durch einen Hash dieses Werts ersetzt, um die Wahrscheinlichkeit von Fehlern im Zusammenhang mit langen Dateipfaden zu verringern.
Wenn der node_modules-Ordner existiert, prüft Bun vor der Installation, ob node_modules alle erwarteten Pakete mit entsprechenden Versionen enthält. Wenn ja, wird bun install abgeschlossen. Bun verwendet einen benutzerdefinierten JSON-Parser, der das Parsen stoppt, sobald er "name" und "version" findet.
Wenn ein Paket fehlt oder eine Version hat, die nicht mit der package.json kompatibel ist, prüft Bun nach einem kompatiblen Modul im Cache. Wenn gefunden, wird es in node_modules installiert. Andernfalls wird das Paket aus der Registry heruntergeladen und dann installiert.
Schnelles Kopieren
Sobald ein Paket in den Cache heruntergeladen wurde, muss Bun diese Dateien noch in node_modules kopieren. Bun verwendet die schnellsten verfügbaren Syscalls, um diese Aufgabe auszuführen. Unter Linux verwendet es Hardlinks; auf macOS verwendet es clonefile.
Festplattenspeicher sparen
Da Bun Hardlinks verwendet, um ein Modul in das node_modules-Verzeichnis eines Projekts unter Linux und Windows zu "kopieren", existiert der Inhalt des Pakets nur an einem einzigen Ort auf der Festplatte, was die Menge des für node_modules dedizierten Festplattenspeichers erheblich reduziert.
Dieser Vorteil gilt auch für macOS, jedoch mit Ausnahmen. Es verwendet clonefile, was Copy-on-Write ist, was bedeutet, dass es keinen Festplattenspeicher belegt, aber es zählt zum Limit des Laufwerks. Dieses Verhalten ist nützlich, wenn etwas versucht, node_modules/* zu patchen, sodass es unmöglich ist, andere Installationen zu beeinflussen.
Installationsstrategien
Dieses Verhalten kann mit dem --backend-Flag konfiguriert werden, das von allen Paketverwaltungsbefehlen von Bun respektiert wird.
hardlink: Standard unter Linux und Windows.clonefile: Standard unter macOS.clonefile_each_dir: Ähnlich wieclonefile, außer dass es jede Datei einzeln pro Verzeichnis klont. Es ist nur unter macOS verfügbar und tendiert dazu, langsamer alsclonefilezu sein.copyfile: Die Fallback-Methode, wenn eine der oben genannten Methoden fehlschlägt. Es ist die langsamste Option. Unter macOS verwendet esfcopyfile(); unter Linux verwendet escopy_file_range().symlink: Wird derzeit nur fürfile:- (und schließlichlink:-) Abhängigkeiten verwendet. Um Endlosschleifen zu verhindern, überspringt es das Symlinking desnode_modules-Ordners.
Wenn Sie mit --backend=symlink installieren, löst Node.js node_modules von Abhängigkeiten nicht auf, es sei denn, jede Abhängigkeit hat ihren eigenen node_modules-Ordner oder Sie übergeben --preserve-symlinks an node. Siehe Node.js-Dokumentation zu --preserve-symlinks.
bun install --backend symlink
node --preserve-symlinks ./foo.jsBuns Laufzeitumgebung stellt derzeit kein Äquivalent zu --preserve-symlinks bereit.