Если в рабочем каталоге или выше не найден каталог node_modules, Bun откажется от разрешения модулей в стиле Node.js в пользу алгоритма разрешения модулей Bun.
При разрешении модулей в стиле Bun все импортируемые пакеты автоматически устанавливаются на лету в глобальный кэш модулей во время выполнения (тот же кэш, что используется bun install).
import { foo } from "foo"; // установить версию `latest`
foo();При первом запуске этого скрипта Bun автоматически установит "foo" и закэширует его. При следующем запуске скрипта будет использована закэшированная версия.
Разрешение версий
Для определения версии для установки Bun следует следующему алгоритму:
- Проверить наличие файла
bun.lockв корне проекта. Если он существует, использовать версию, указанную в файле блокировки. - В противном случае просканировать дерево вверх в поисках
package.json, который включает"foo"как зависимость. Если найден, использовать указанную версию или диапазон версий semver. - В противном случае использовать
latest.
Поведение кэша
После определения версии или диапазона версий Bun будет:
- Проверять кэш модулей на наличие совместимой версии. Если она существует, использовать её.
- При разрешении
latestBun проверит, был лиpackage@latestзагружен и закэширован в последние 24 часа. Если да, использовать его. - В противном случае загрузить и установить соответствующую версию из реестра
npm.
Установка
Пакеты устанавливаются и кэшируются в <cache>/<pkg>@<version>, поэтому несколько версий одного и того же пакета могут быть закэшированы одновременно. Кроме того, создаётся симлинка в <cache>/<pkg>/<version> для ускорения поиска всех версий пакета, существующих в кэше.
Спецификаторы версий
Весь этот алгоритм разрешения можно обойти, указав версию или диапазон версий непосредственно в операторе импорта.
import { z } from "zod@3.0.0"; // конкретная версия
import { z } from "zod@next"; // тег npm
import { z } from "zod@^3.20.0"; // диапазон semverПреимущества
Такой подход к автоматической установке полезен по нескольким причинам:
- Эффективность пространства — Каждая версия зависимости существует только в одном месте на диске. Это огромная экономия пространства и времени по сравнению с избыточными установками на проект.
- Портативность — Для распространения простых скриптов и gist ваш исходный файл самодостаточен. Нет необходимости архивировать каталог, содержащий ваш код и файлы конфигурации. Со спецификаторами версий в операторах
importдажеpackage.jsonне требуется. - Удобство — Нет необходимости запускать
npm installилиbun installперед запуском файла или скрипта. Простоbun run. - Обратная совместимость — Поскольку Bun всё ещё уважает версии, указанные в
package.json, если он существует, вы можете переключиться на разрешение в стиле Bun одной командой:rm -rf node_modules.
Ограничения
- Отсутствие Intellisense. Автодополнение TypeScript в IDE полагается на наличие файлов объявлений типов внутри
node_modules. Мы исследуем различные решения этой проблемы. - Отсутствие поддержки patch-package
Часто задаваемые вопросы
Чем это отличается от того, что делает pnpm?
С pnpm вы должны запустить pnpm install, который создаёт папку node_modules из симлинков для разрешения средой выполнения. В отличие от этого, Bun разрешает зависимости на лету при запуске файла; нет необходимости заранее запускать какую-либо команду install. Bun также не создаёт папку node_modules.
Чем это отличается от того, что делает Yarn Plug'N'Play?
С Yarn вы должны запустить yarn install перед запуском скрипта. В отличие от этого, Bun разрешает зависимости на лету при запуске файла; нет необходимости заранее запускать какую-либо команду install.
Yarn Plug'N'Play также использует zip-файлы для хранения зависимостей. Это делает загрузку зависимостей медленнее во время выполнения, так как случайные чтения zip-файлов обычно медленнее, чем эквивалентное чтение с диска.
Чем это отличается от того, что делает Deno?
Deno требует спецификатора npm: перед каждым npm import, не поддерживает карты импорта через compilerOptions.paths в tsconfig.json и имеет неполную поддержку настроек package.json. В отличие от Deno, Bun в настоящее время не поддерживает импорты по URL.