Skip to content

Se non viene trovata alcuna directory node_modules nella directory di lavoro o in quelle superiori, Bun abbandonerà la risoluzione dei moduli in stile Node.js a favore dell'algoritmo di risoluzione dei moduli Bun.

Con la risoluzione dei moduli in stile Bun, tutti i pacchetti importati vengono installati automaticamente al volo in una cache globale dei moduli durante lesececuzione (la stessa cache utilizzata da bun install).

ts
import { foo } from "foo"; // installa la versione `latest`

foo();

La prima volta che esegui questo script, Bun installerà automaticamente "foo" e lo memorizzerà nella cache. La prossima volta che eseguirai lo script, verrà utilizzata la versione memorizzata nella cache.


Risoluzione della versione

Per determinare quale versione installare, Bun segue il seguente algoritmo:

  1. Controlla la presenza di un file bun.lock nella root del progetto. Se esiste, usa la versione specificata nel lockfile.
  2. Altrimenti, scansiona verso lalto nellalbero per trovare un package.json che include "foo" come dipendenza. Se trovato, usa la versione o intervallo di versioni semver specificato.
  3. Altrimenti, usa latest.

Comportamento della cache

Una volta determinata una versione o un intervallo di versioni, Bun:

  1. Controlla nella cache dei moduli per una versione compatibile. Se esiste, la usa.
  2. Quando risolve latest, Bun controlla se package@latest è stato scaricato e memorizzato nella cache nelle ultime 24 ore. Se sì, lo usa.
  3. Altrimenti, scarica e installa la versione appropriata dal registry npm.

Installazione

I pacchetti vengono installati e memorizzati nella cache in <cache>/<pkg>@<version>, quindi più versioni dello stesso pacchetto possono essere memorizzate nella cache contemporaneamente. Inoltre, viene creato un symlink sotto <cache>/<pkg>/<version> per rendere più veloce la ricerca di tutte le versioni di un pacchetto presenti nella cache.


Specificatori di versione

Lintero algoritmo di risoluzione può essere scavalcato specificando una versione o un intervallo di versioni direttamente nella tua istruzione di import.

ts
import { z } from "zod@3.0.0"; // versione specifica
import { z } from "zod@next"; // tag npm
import { z } from "zod@^3.20.0"; // intervallo semver

Vantaggi

Questo approccio di auto-installazione è utile per alcuni motivi:

  • Efficienza di spazio — Ogni versione di una dipendenza esiste in un unico posto sul disco. Questo rappresenta un enorme risparmio di spazio e tempo rispetto alle installazioni ridondanti per progetto.
  • Portabilità — Per condividere semplici script e gist, il tuo file sorgente è autosufficiente. Non cè bisogno di creare uno zip di una directory contenente i tuoi file di codice e configurazione. Con gli specificatori di versione nelle istruzioni import, non è nemmeno necessario un package.json.
  • Comodità — Non cè bisogno di eseguire npm install o bun install prima di eseguire un file o script. Basta bun run.
  • Compatibilità con le versioni precedenti — Poiché Bun rispetta ancora le versioni specificate in package.json se esiste, puoi passare alla risoluzione in stile Bun con un singolo comando: rm -rf node_modules.

Limitazioni

  • Nessun Intellisense. Il completamento automatico TypeScript negli IDE si basa sullesistenza di file di dichiarazione dei tipi allinterno di node_modules. Stiamo indagando su varie soluzioni a questo problema.
  • Nessun supporto per patch-package

FAQ

In che modo questo è diverso da ciò che fa pnpm?

Con pnpm, devi eseguire pnpm install, che crea una cartella node_modules di symlink per la risoluzione del runtime. Al contrario, Bun risolve le dipendenze al volo quando esegui un file; non cè bisogno di eseguire alcun comando install in anticipo. Bun non crea nemmeno una cartella node_modules.

In che modo questo è diverso da Yarn Plug'N'Play?

Con Yarn, devi eseguire yarn install prima di eseguire uno script. Al contrario, Bun risolve le dipendenze al volo quando esegui un file; non cè bisogno di eseguire alcun comando install in anticipo.

Yarn Plug'N'Play usa anche file zip per memorizzare le dipendenze. Questo rende il caricamento delle dipendenze più lento a runtime, poiché gli accessi casuali ai file zip tendono a essere più lenti dellequivalente ricerca su disco.

In che modo questo è diverso da ciò che fa Deno?

Deno richiede uno specificatore npm: prima di ogni import npm, non supporta le mappe di import tramite compilerOptions.paths in tsconfig.json e ha un supporto incompleto per le impostazioni di package.json. A differenza di Deno, Bun non supporta attualmente gli import di URL.

Bun a cura di www.bunjs.com.cn