Skip to content

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

toml
[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 = false

Neu-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 wie clonefile, außer dass es jede Datei einzeln pro Verzeichnis klont. Es ist nur unter macOS verfügbar und tendiert dazu, langsamer als clonefile zu sein.
  • copyfile: Die Fallback-Methode, wenn eine der oben genannten Methoden fehlschlägt. Es ist die langsamste Option. Unter macOS verwendet es fcopyfile(); unter Linux verwendet es copy_file_range().
  • symlink: Wird derzeit nur für file:- (und schließlich link:-) Abhängigkeiten verwendet. Um Endlosschleifen zu verhindern, überspringt es das Symlinking des node_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.

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

Buns Laufzeitumgebung stellt derzeit kein Äquivalent zu --preserve-symlinks bereit.

Bun von www.bunjs.com.cn bearbeitet