Todos los paquetes descargados desde el registro se almacenan en una caché global en ~/.bun/install/cache, o la ruta definida por la variable de entorno BUN_INSTALL_CACHE_DIR. Se almacenan en subdirectorios nombrados como ${name}@${version}, por lo que múltiples versiones de un paquete pueden ser cacheadas.
Configurar el comportamiento de la caché
[install.cache]
# el directorio a usar para la caché
dir = "~/.bun/install/cache"
# cuando es true, no cargar desde la caché global.
# Bun aún puede escribir en node_modules/.cache
disable = false
# cuando es true, siempre resolver las últimas versiones desde el registro
disableManifest = falseMinimizar re-descargas
Bun se esfuerza por evitar volver a descargar paquetes múltiples veces. Al instalar un paquete, si la caché ya contiene una versión en el rango especificado por package.json, Bun usará el paquete cacheado en lugar de descargarlo nuevamente.
Detalles de instalación
Si la versión semver tiene un sufijo de pre-lanzamiento (1.0.0-beta.0) o un sufijo de compilación (1.0.0+20220101), se reemplaza con un hash de ese valor, para reducir las posibilidades de errores asociados con rutas de archivo largas.
Cuando la carpeta node_modules existe, antes de instalar, Bun verifica que node_modules contenga todos los paquetes esperados con las versiones apropiadas. Si es así, bun install se completa. Bun usa un analizador JSON personalizado que deja de analizar tan pronto como encuentra "name" y "version".
Si falta un paquete o tiene una versión incompatible con el package.json, Bun busca un módulo compatible en la caché. Si se encuentra, se instala en node_modules. De lo contrario, el paquete se descargará desde el registro y luego se instalará.
Copiado rápido
Una vez que un paquete se descarga en la caché, Bun aún necesita copiar esos archivos en node_modules. Bun usa las llamadas al sistema más rápidas disponibles para realizar esta tarea. En Linux, usa hardlinks; en macOS, usa clonefile.
Ahorrar espacio en disco
Dado que Bun usa hardlinks para "copiar" un módulo en el directorio node_modules de un proyecto en Linux y Windows, el contenido del paquete solo existe en una única ubicación en el disco, reduciendo enormemente la cantidad de espacio en disco dedicado a node_modules.
Este beneficio también se aplica a macOS, pero hay excepciones. Usa clonefile que es copy-on-write, lo que significa que no ocupará espacio en disco, pero contará hacia el límite de la unidad. Este comportamiento es útil si algo intenta parchear node_modules/*, por lo que es imposible afectar otras instalaciones.
Estrategias de instalación
Este comportamiento es configurable con la bandera --backend, que es respetada por todos los comandos de gestión de paquetes de Bun.
hardlink: Predeterminado en Linux y Windows.clonefile: Predeterminado en macOS.clonefile_each_dir: Similar aclonefile, excepto que clona cada archivo individualmente por directorio. Solo está disponible en macOS y tiende a tener un rendimiento más lento queclonefile.copyfile: La alternativa usada cuando cualquiera de las anteriores falla. Es la opción más lenta. En macOS, usafcopyfile(); en Linux usacopy_file_range().symlink: Usado actualmente solo para dependenciasfile:(y eventualmentelink:). Para prevenir bucles infinitos, omite crear enlaces simbólicos en la carpetanode_modules.
Si instalas con --backend=symlink, Node.js no resolverá los node_modules de las dependencias a menos que cada dependencia tenga su propia carpeta node_modules o pases --preserve-symlinks a node. Ver documentación de Node.js sobre --preserve-symlinks.
bun install --backend symlink
node --preserve-symlinks ./foo.jsEl runtime de Bun actualmente no expone un equivalente de --preserve-symlinks.