Tutti i pacchetti scaricati dal registro vengono archiviati in una cache globale in ~/.bun/install/cache, o il percorso definito dalla variabile d'ambiente BUN_INSTALL_CACHE_DIR. Sono archiviati in sottodirectory nominate come ${name}@${version}, quindi più versioni di un pacchetto possono essere memorizzate nella cache.
Configurare il comportamento della cache
[install.cache]
# la directory da usare per la cache
dir = "~/.bun/install/cache"
# quando true, non caricare dalla cache globale.
# Bun può ancora scrivere in node_modules/.cache
disable = false
# quando true, risolvi sempre le ultime versioni dal registro
disableManifest = falseRidurre al minimo i nuovi download
Bun si impegna a evitare di scaricare più volte gli stessi pacchetti. Quando installa un pacchetto, se la cache contiene già una versione nell'intervallo specificato da package.json, Bun userà il pacchetto nella cache invece di scaricarlo di nuovo.
Dettagli sull'installazione
Se la versione semver ha un suffisso pre-release (1.0.0-beta.0) o un suffisso build (1.0.0+20220101), viene sostituito con un hash di quel valore, per ridurre le possibilità di errori associati a percorsi di file lunghi.
Quando la cartella node_modules esiste, prima di installare, Bun controlla che node_modules contenga tutti i pacchetti previsti con le versioni appropriate. Se così è, bun install viene completato. Bun usa un parser JSON personalizzato che interrompe l'analisi non appena trova "name" e "version".
Se un pacchetto manca o ha una versione incompatibile con il package.json, Bun cerca un modulo compatibile nella cache. Se trovato, viene installato in node_modules. Altrimenti, il pacchetto verrà scaricato dal registro e poi installato.
Copia veloce
Una volta che un pacchetto è scaricato nella cache, Bun deve ancora copiare quei file in node_modules. Bun usa le syscall più veloci disponibili per eseguire questo compito. Su Linux, usa hardlink; su macOS, usa clonefile.
Risparmiare spazio su disco
Poiché Bun usa hardlink per "copiare" un modulo nella directory node_modules di un progetto su Linux e Windows, i contenuti del pacchetto esistono in una singola posizione su disco, riducendo notevolmente la quantità di spazio su disco dedicata a node_modules.
Questo beneficio si applica anche a macOS, ma ci sono eccezioni. Usa clonefile che è copy-on-write, il che significa che non occuperà spazio su disco, ma conterà verso il limite dell'unità. Questo comportamento è utile se qualcosa tenta di patchare node_modules/*, quindi è impossibile influenzare altre installazioni.
Strategie di installazione
Questo comportamento è configurabile con il flag --backend, che è rispettato da tutti i comandi di gestione pacchetti di Bun.
hardlink: Predefinito su Linux e Windows.clonefile: Predefinito su macOS.clonefile_each_dir: Simile aclonefile, eccetto che clona ogni file individualmente per directory. È disponibile solo su macOS e tende a essere più lento diclonefile.copyfile: Il fallback usato quando uno qualsiasi dei precedenti fallisce. È l'opzione più lenta. Su macOS, usafcopyfile(); su Linux usacopy_file_range().symlink: Attualmente usato solo per dipendenzefile:(e eventualmentelink:). Per prevenire loop infiniti, salta il collegamento simbolico della cartellanode_modules.
Se installi con --backend=symlink, Node.js non risolverà i node_modules delle dipendenze a meno che ogni dipendenza abbia la propria cartella node_modules o passi --preserve-symlinks a node. Vedi documentazione di Node.js su --preserve-symlinks.
bun install --backend symlink
node --preserve-symlinks ./foo.jsIl runtime di Bun non espone attualmente un equivalente di --preserve-symlinks.