Si no se encuentra un directorio node_modules en el directorio de trabajo o superior, Bun abandonará la resolución de módulos al estilo de Node.js en favor del algoritmo de resolución de módulos de Bun.
Bajo la resolución de módulos al estilo de Bun, todos los paquetes importados se instalan automáticamente sobre la marcha en una caché global de módulos durante la ejecución (la misma caché utilizada por bun install).
import { foo } from "foo"; // instalar versión `latest`
foo();La primera vez que ejecutes este script, Bun instalará automáticamente "foo" y lo almacenará en caché. La próxima vez que ejecutes el script, utilizará la versión almacenada en caché.
Resolución de versiones
Para determinar qué versión instalar, Bun sigue el siguiente algoritmo:
- Buscar un archivo
bun.locken la raíz del proyecto. Si existe, usar la versión especificada en el lockfile. - De lo contrario, escanear hacia arriba en el árbol buscando un
package.jsonque incluya"foo"como dependencia. Si se encuentra, usar la versión o rango de versiones semver especificado. - De lo contrario, usar
latest.
Comportamiento de la caché
Una vez determinada la versión o rango de versiones, Bun:
- Verificará la caché de módulos en busca de una versión compatible. Si existe, la usará.
- Al resolver
latest, Bun verificará sipackage@latestse ha descargado y almacenado en caché en las últimas 24 horas. Si es así, lo usará. - De lo contrario, descargará e instalará la versión apropiada desde el registro
npm.
Instalación
Los paquetes se instalan y almacenan en caché en <cache>/<pkg>@<version>, por lo que múltiples versiones del mismo paquete pueden estar almacenadas en caché simultáneamente. Además, se crea un enlace simbólico bajo <cache>/<pkg>/<version> para hacer más rápido buscar todas las versiones de un paquete que existen en la caché.
Especificadores de versión
Todo este algoritmo de resolución puede omitirse completamente especificando una versión o rango de versiones directamente en tu declaración de importación.
import { z } from "zod@3.0.0"; // versión específica
import { z } from "zod@next"; // etiqueta npm
import { z } from "zod@^3.20.0"; // rango semverBeneficios
Este enfoque de instalación automática es útil por varias razones:
- Eficiencia de espacio — Cada versión de una dependencia existe en un solo lugar en el disco. Esto representa un gran ahorro de espacio y tiempo en comparación con instalaciones redundantes por proyecto.
- Portabilidad — Para compartir scripts y gists simples, tu archivo fuente está autocontenido. No es necesario
zipar un directorio que contenga tu código y archivos de configuración. Con especificadores de versión en declaracionesimport, ni siquiera es necesario unpackage.json. - Conveniencia — No es necesario ejecutar
npm installobun installantes de ejecutar un archivo o script. Simplemente usabun run. - Compatibilidad hacia atrás — Porque Bun aún respeta las versiones especificadas en
package.jsonsi existe uno, puedes cambiar a la resolución al estilo de Bun con un solo comando:rm -rf node_modules.
Limitaciones
- Sin Intellisense. El autocompletado de TypeScript en IDEs depende de la existencia de archivos de declaración de tipos dentro de
node_modules. Estamos investigando varias soluciones para esto. - Sin soporte para patch-package
FAQ
¿En qué se diferencia de lo que hace pnpm?">
Con pnpm, tienes que ejecutar pnpm install, lo cual crea una carpeta node_modules de enlaces simbólicos para que el runtime los resuelva. Por el contrario, Bun resuelve las dependencias sobre la marcha cuando ejecutas un archivo; no es necesario ejecutar ningún comando install con anticipación. Bun tampoco crea una carpeta node_modules.
¿En qué se diferencia de lo que hace Yarn Plug'N'Play?">
Con Yarn, debes ejecutar yarn install antes de ejecutar un script. Por el contrario, Bun resuelve las dependencias sobre la marcha cuando ejecutas un archivo; no es necesario ejecutar ningún comando install con anticipación.
Yarn Plug'N'Play también utiliza archivos zip para almacenar dependencias. Esto hace que la carga de dependencias sea más lenta en tiempo de ejecución, ya que las lecturas de acceso aleatorio en archivos zip tienden a ser más lentas que la búsqueda equivalente en disco.
¿En qué se diferencia de lo que hace Deno?">
Deno requiere un especificador npm: antes de cada import de npm, carece de soporte para mapas de importación vía compilerOptions.paths en tsconfig.json, y tiene soporte incompleto para configuraciones de package.json. A diferencia de Deno, Bun no soporta actualmente importaciones por URL.