Skip to main content
从注册表下载的所有包都存储在全局缓存中,位置为 ~/.bun/install/cache,或者是环境变量 BUN_INSTALL_CACHE_DIR 定义的路径。它们存储在名为 ${name}@${version} 的子目录中,因此可以缓存一个包的多个版本。
bunfig.toml
[install.cache]
# 用于缓存的目录
dir = "~/.bun/install/cache"

# 当为 true 时,不从全局缓存加载。
# Bun 仍可能写入 node_modules/.cache
disable = false

# 当为 true 时,总是从注册表解析最新版本
disableManifest = false

最小化重新下载

Bun 努力避免多次重新下载包。安装包时,如果缓存已包含 [package.json] 指定范围内的版本,Bun 将使用缓存的包而不是再次下载。
如果语义化版本有预发布后缀(1.0.0-beta.0)或构建后缀(1.0.0+20220101),它将被替换为此值的哈希,以减少与长文件路径相关的错误的可能性。当存在 [node_modules] 文件夹时,在安装之前,Bun 会检查 [node_modules] 是否包含所有具有适当版本的预期包。如果是,bun install 完成。Bun 使用自定义 JSON 解析器,一旦找到 "name""version" 就停止解析。如果包缺失或版本与 [package.json] 不兼容,Bun 会检查缓存中是否有兼容的模块。如果找到,它将被安装到 [node_modules] 中。否则,包将从注册表下载然后安装。

快速复制

包下载到缓存后,Bun 仍需要将这些文件复制到 [node_modules]。Bun 使用可用的最快系统调用执行此任务。在 Linux 上,它使用硬链接;在 macOS 上,它使用 clonefile

节省磁盘空间

由于 Bun 在 Linux 和 Windows 上使用硬链接将模块”复制”到项目的 [node_modules] 目录,包的内容只存在于磁盘上的单个位置,大大减少了专用于 [node_modules] 的磁盘空间。 此好处也适用于 macOS,但有例外。它使用 clonefile,这是写时复制,意味着它不会占用磁盘空间,但它会计入驱动器的限制。如果某些内容试图修补 [node_modules/*],此行为很有用,因此不可能影响其他安装。
此行为可通过 --backend 标志配置,Bun 的所有包管理命令都支持此标志。
  • hardlink: Linux 和 Windows 上的默认选项。
  • clonefile macOS 上的默认选项。
  • clonefile_each_dir: 类似于 clonefile,只是它按目录分别克隆每个文件。仅在 macOS 上可用,且往往比 clonefile 性能较慢。
  • copyfile: 当上述任何方法失败时使用的备选方案。这是最慢的选项。在 macOS 上使用 fcopyfile();在 Linux 上使用 copy_file_range()
  • symlink: 当前仅用于 file:(以及最终的 link:)依赖。为防止无限循环,它会跳过 [node_modules] 文件夹的符号链接。
如果使用 --backend=symlink 安装,Node.js 不会解析依赖的 node_modules,除非每个依赖都有自己的 [node_modules] 文件夹或你向 node 传递 --preserve-symlinks。请参阅 Node.js 关于 --preserve-symlinks 的文档
terminal
bun install --backend symlink
node --preserve-symlinks ./foo.js
Bun 的运行时目前没有公开相当于 --preserve-symlinks 的功能。