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).
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:
- Controlla la presenza di un file
bun.locknella root del progetto. Se esiste, usa la versione specificata nel lockfile. - Altrimenti, scansiona verso lalto nellalbero per trovare un
package.jsonche include"foo"come dipendenza. Se trovato, usa la versione o intervallo di versioni semver specificato. - Altrimenti, usa
latest.
Comportamento della cache
Una volta determinata una versione o un intervallo di versioni, Bun:
- Controlla nella cache dei moduli per una versione compatibile. Se esiste, la usa.
- Quando risolve
latest, Bun controlla sepackage@latestè stato scaricato e memorizzato nella cache nelle ultime 24 ore. Se sì, lo usa. - 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.
import { z } from "zod@3.0.0"; // versione specifica
import { z } from "zod@next"; // tag npm
import { z } from "zod@^3.20.0"; // intervallo semverVantaggi
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 unpackage.json. - Comodità — Non cè bisogno di eseguire
npm installobun installprima di eseguire un file o script. Bastabun run. - Compatibilità con le versioni precedenti — Poiché Bun rispetta ancora le versioni specificate in
package.jsonse 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.