Все пакеты, загруженные из реестра, хранятся в глобальном кэше по пути ~/.bun/install/cache или в пути, определенном переменной окружения BUN_INSTALL_CACHE_DIR. Они хранятся в подкаталогах с именем вида ${name}@${version}, поэтому в кэше может храниться несколько версий пакета.
Настройка поведения кэша
[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 использует жесткие ссылки для «копирования» модуля в каталог node_modules проекта в Linux и Windows, содержимое пакета существует только в одном месте на диске, что значительно уменьшает объем дискового пространства, выделяемого для node_modules.
Это преимущество также относится к macOS, но есть исключения. Он использует clonefile, который является copy-on-write, что означает, что он не занимает дисковое пространство, но будет учитываться в лимите диска. Такое поведение полезно, если что-то пытается патчить 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 или вы не передадите --preserve-symlinks в node. См. документацию Node.js о --preserve-symlinks.
bun install --backend symlink
node --preserve-symlinks ./foo.jsСреда выполнения Bun в настоящее время не предоставляет эквивалента --preserve-symlinks.