Wenn im Arbeitsverzeichnis oder in übergeordneten Verzeichnissen kein node_modules-Verzeichnis gefunden wird, verwendet Bun anstelle der Node.js-artigen Modulauflösung den Bun-Modulauflösungsalgorithmus.
Bei der Bun-artigen Modulauflösung werden alle importierten Pakete während der Ausführung automatisch in einen globalen Modul-Cache installiert (derselbe Cache, der von bun install verwendet wird).
import { foo } from "foo"; // installiert `latest`-Version
foo();Beim ersten Ausführen dieses Skripts installiert Bun "foo" automatisch und cached es. Beim nächsten Ausführen des Skripts wird die gecachte Version verwendet.
Versionsauflösung
Um zu bestimmen, welche Version installiert werden soll, folgt Bun dem folgenden Algorithmus:
- Suche nach einer
bun.lock-Datei im Projektstammverzeichnis. Wenn sie existiert, verwende die in der Lockfile angegebene Version. - Andernfalls durchsuche den Verzeichnisbaum nach einer
package.json, die"foo"als Abhängigkeit enthält. Wenn gefunden, verwende die angegebene Semver-Version oder den Versionsbereich. - Andernfalls verwende
latest.
Cache-Verhalten
Sobald eine Version oder ein Versionsbereich bestimmt wurde, wird Bun:
- Den Modul-Cache nach einer kompatiblen Version durchsuchen. Wenn eine existiert, verwende sie.
- Bei der Auflösung von
latestprüft Bun, obpackage@latestin den letzten 24 Stunden heruntergeladen und gecacht wurde. Wenn ja, verwende es. - Andernfalls lade die entsprechende Version aus der
npm-Registry herunter und installiere sie.
Installation
Pakete werden in <cache>/<pkg>@<version> installiert und gecacht, sodass mehrere Versionen desselben Pakets gleichzeitig gecacht werden können. Zusätzlich wird unter <cache>/<pkg>/<version> ein Symlink erstellt, um das Nachschlagen aller Versionen eines Pakets im Cache zu beschleunigen.
Versionsbezeichner
Dieser gesamte Auflösungsalgorithmus kann umgangen werden, indem eine Version oder ein Versionsbereich direkt in der Import-Anweisung angegeben wird.
import { z } from "zod@3.0.0"; // spezifische Version
import { z } from "zod@next"; // npm-Tag
import { z } from "zod@^3.20.0"; // Semver-BereichVorteile
Dieser Auto-Installationsansatz ist aus mehreren Gründen nützlich:
- Platzeffizienz — Jede Version einer Abhängigkeit existiert nur an einem Ort auf der Festplatte. Dies ist eine enorme Platz- und Zeitersparnis im Vergleich zu redundanten pro-Projekt-Installationen.
- Portabilität — Um einfache Skripte und Gists zu teilen, ist Ihre Quelldatei in sich geschlossen. Es ist nicht notwendig, ein Verzeichnis mit Ihrem Code und Konfigurationsdateien zusammen zu
zippen. Mit Versionsbezeichnern inimport-Anweisungen ist nicht einmal einepackage.jsonerforderlich. - Bequemlichkeit — Es ist nicht notwendig,
npm installoderbun installauszuführen, bevor eine Datei oder ein Skript ausgeführt wird. Einfachbun runverwenden. - Abwärtskompatibilität — Da Bun weiterhin die in
package.jsonangegebenen Versionen respektiert, wenn eine existiert, können Sie mit einem einzigen Befehl zur Bun-artigen Auflösung wechseln:rm -rf node_modules.
Einschränkungen
- Kein Intellisense. Die TypeScript-Autovervollständigung in IDEs basiert auf der Existenz von Typdeklarationsdateien in
node_modules. Wir untersuchen verschiedene Lösungen dafür. - Keine patch-package-Unterstützung
FAQ
Wie unterscheidet sich dies von pnpm?">
Mit pnpm müssen Sie pnpm install ausführen, was einen node_modules-Ordner mit Symlinks für die Laufzeitauflösung erstellt. Im Gegensatz dazu löst Bun Abhängigkeiten bei der Ausführung einer Datei zur Laufzeit auf; es ist nicht notwendig, vorher einen install-Befehl auszuführen. Bun erstellt auch keinen node_modules-Ordner.
Wie unterscheidet sich dies von Yarn Plug'N'Play?">
Mit Yarn müssen Sie yarn install ausführen, bevor Sie ein Skript ausführen. Im Gegensatz dazu löst Bun Abhängigkeiten bei der Ausführung einer Datei zur Laufzeit auf; es ist nicht notwendig, vorher einen install-Befehl auszuführen.
Yarn Plug'N'Play verwendet auch ZIP-Dateien zum Speichern von Abhängigkeiten. Dies macht das Laden von Abhängigkeiten zur Laufzeit langsamer, da wahlfreie Lesezugriffe auf ZIP-Dateien tendenziell langsamer sind als der entsprechende Festplattenzugriff.
Wie unterscheidet sich dies von dem, was Deno macht?">
Deno erfordert einen npm:-Bezeichner vor jedem npm-import, unterstützt keine Import-Maps über compilerOptions.paths in tsconfig.json und hat eine unvollständige Unterstützung für package.json-Einstellungen. Im Gegensatz zu Deno unterstützt Bun derzeit keine URL-Importe.