Bun 全局缓存

所有从注册表下载的包都存储在 ~/.bun/install/cache 的全局缓存中。它们存储在名为${name}@${version} 的子目录中,因此可以缓存一个包的多个版本。

配置全局缓存:

[install.cache]
# the directory to use for the cache
dir = "~/.bun/install/cache"

# when true, don't load from the global cache.
# Bun may still write to node_modules/.cache
disable = false

# when true, always resolve the latest versions from the registry
disableManifest = false

最小化重新下载

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

当 node_modules 文件夹存在时,在安装之前,Bun 会检查 node_modules 是否包含所有预期的软件包和相应的版本。如果是,Bun 就会完成安装。Bun 使用自定义 JSON 解析器,一旦发现 "名称 "和 "版本",就会停止解析。

如果软件包丢失或版本与 package.json 不兼容,Bun 会检查缓存中是否有兼容模块。如果找到,则将其安装到 node_modules。否则,将从注册表下载软件包,然后安装。

快速复制

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

节省磁盘空间

由于 Bun 在 Linux 上使用硬链接将模块 "复制 "到项目的 node_modules 目录中,因此软件包的内容只存在于磁盘的一个位置,从而大大减少了 node_modules 的磁盘空间。

这一优势同样适用于 macOS,但也有例外。它使用的克隆文件是写入时复制,这意味着它不会占用磁盘空间,但会计入驱动器的限制。如果有人试图给 node_modules/* 打补丁,这种行为将非常有用,因为它不可能影响其他安装。

安装策略

这种行为可通过 --backend 标志进行配置,Bun 的所有软件包管理命令都会遵守该标志。

硬链接:默认用于 Linux。
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 参数。有关--preserve-symlinks,请参阅 Node.js 文档。

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

Bun 的运行时目前没有与 --preserve-symlinks 等价的功能。

  • 30
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值