~/.bun/install/cache, or the path set by the BUN_INSTALL_CACHE_DIR environment variable. Packages live in subdirectories named like ${name}@${version}, so multiple versions of a package can be cached.
Configuring cache behavior
Configuring cache behavior
bunfig.toml
Minimizing re-downloads
When installing a package, if the cache already contains a version in the range specified bypackage.json, Bun uses the cached copy instead of downloading it again.
Installation details
Installation details
If the semver version has a pre-release suffix (
1.0.0-beta.0) or a build suffix (1.0.0+20220101), it is replaced with a hash of that value instead, to reduce the chance of errors from long file paths.When the node_modules folder exists, before installing, Bun checks that node_modules contains all expected packages with appropriate versions. If so, bun install completes. Bun uses a custom JSON parser which stops parsing as soon as it finds "name" and "version".If a package is missing or has a version incompatible with the package.json, Bun checks for a compatible module in the cache. If found, it is installed into node_modules. Otherwise, Bun downloads the package from the registry, then installs it.Fast copying
Once a package is downloaded into the cache, Bun still needs to copy those files intonode_modules. It uses the fastest syscalls available for this: hardlinks on Linux, clonefile on macOS.
Saving disk space
Since Bun uses hardlinks to “copy” a module into a project’snode_modules directory on Linux and Windows, the contents of the package only exist in a single location on disk, greatly reducing the disk space used by node_modules.
The same applies on macOS, with a caveat. There Bun uses clonefile, which is copy-on-write: the clone occupies no extra disk space, but it counts towards the drive’s limit. Because the copy only happens on write, patching node_modules/* in one project can’t affect other installations.
Installation strategies
Installation strategies
Configure this with the Bun’s runtime does not expose an equivalent of
--backend flag, which all of Bun’s package management commands respect.hardlink: Default on Linux and Windows.clonefile: Default on macOS.clonefile_each_dir: Similar toclonefile, except it clones each file individually per directory. It is only available on macOS and tends to perform slower thanclonefile.copyfile: The fallback used when any of the above fail. It is the slowest option. On macOS, it usesfcopyfile(); on Linux it usescopy_file_range().symlink: Used only forfile:(and eventuallylink:) dependencies. To prevent infinite loops, it skips symlinking thenode_modulesfolder.
--backend=symlink, Node.js won’t resolve node_modules of dependencies unless each dependency has its own node_modules folder or you pass --preserve-symlinks to node. See Node.js documentation on --preserve-symlinks.terminal
--preserve-symlinks.