Skip to content

所有从注册表下载的包都存储在 ~/.bun/install/cache 的全局缓存中,或者存储在环境变量 BUN_INSTALL_CACHE_DIR 定义的路径中。它们存储在名为 ${name}@${version} 的子目录中,因此可以缓存多个版本的包。

配置缓存行为

toml
[install.cache]
# 用于缓存的目录
dir = "~/.bun/install/cache"

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

# 为 true 时,始终从注册表解析最新版本
disableManifest = false

最小化重新下载

Bun 致力于避免多次重新下载包。安装包时,如果缓存已经包含 package.json 指定范围内的版本,Bun 将使用缓存的包而不是再次下载它。

安装详情

如果 semver 版本有预发布后缀(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 的文档

bash
bun install --backend symlink
node --preserve-symlinks ./foo.js

Bun 的运行时目前不提供等效的 --preserve-symlinks

Bun学习网由www.bunjs.com.cn整理维护