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 использует жесткие ссылки для «копирования» модуля в каталог 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.

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

Среда выполнения Bun в настоящее время не предоставляет эквивалента --preserve-symlinks.

Bun от www.bunjs.com.cn