Skip to content

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).

ts
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:

  1. Suche nach einer bun.lock-Datei im Projektstammverzeichnis. Wenn sie existiert, verwende die in der Lockfile angegebene Version.
  2. 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.
  3. Andernfalls verwende latest.

Cache-Verhalten

Sobald eine Version oder ein Versionsbereich bestimmt wurde, wird Bun:

  1. Den Modul-Cache nach einer kompatiblen Version durchsuchen. Wenn eine existiert, verwende sie.
  2. Bei der Auflösung von latest prüft Bun, ob package@latest in den letzten 24 Stunden heruntergeladen und gecacht wurde. Wenn ja, verwende es.
  3. 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.

ts
import { z } from "zod@3.0.0"; // spezifische Version
import { z } from "zod@next"; // npm-Tag
import { z } from "zod@^3.20.0"; // Semver-Bereich

Vorteile

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 in import-Anweisungen ist nicht einmal eine package.json erforderlich.
  • Bequemlichkeit — Es ist nicht notwendig, npm install oder bun install auszuführen, bevor eine Datei oder ein Skript ausgeführt wird. Einfach bun run verwenden.
  • Abwärtskompatibilität — Da Bun weiterhin die in package.json angegebenen 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.

Bun von www.bunjs.com.cn bearbeitet