Skip to content

bun install — это совместимый с Node.js npm-клиент, разработанный для быстрой замены npm.

Мы приложили много усилий, чтобы сделать процесс миграции с npm install на bun install максимально простым — достаточно выполнить bun install вместо npm install.

  • Разработан для Node.js и Bun: bun install устанавливает совместимую с Node.js папку node_modules. Вы можете использовать его вместо npm install для проектов Node.js без каких-либо изменений кода и без использования среды выполнения Bun.
  • Автоматически конвертирует package-lock.json в формат lockfile bun.lock от Bun, сохраняя существующие версии зависимостей без какой-либо ручной работы с вашей стороны. Вы можете тайно использовать bun install вместо npm install на работе, и никто не заметит.
  • Совместим с .npmrc: bun install читает конфигурацию npm-registry из .npmrc от npm, поэтому вы можете использовать одну и ту же конфигурацию для npm и Bun.
  • Жёсткие ссылки: В Windows и Linux bun install использует жёсткие ссылки для экономии места на диске и времени установки.
bash
# Для миграции требуется только одна команда
bun i

# Для добавления зависимостей:
bun i @types/bun

# Для добавления devDependencies:
bun i -d @types/bun

# Для удаления зависимости:
bun rm @types/bun

Запуск скриптов package.json быстрее

Запускайте скрипты из package.json, исполняемые файлы из node_modules/.bin (похоже на npx) и JavaScript/TypeScript файлы (как node) — всё это с помощью одной простой команды.

NPMBun
npm run <script>bun <script>
npm exec <bin>bun <bin>
node <file>bun <file>
npx <package>bunx <package>

Когда вы используете bun run <executable>, он выберет локально установленный исполняемый файл

sh
# Запустить скрипт package.json:
bun my-script
bun run my-script

# Запустить исполняемый файл в node_modules/.bin:
bun my-executable # например tsc, esbuild и т.д.
bun run my-executable

# Запустить JavaScript/TypeScript файл:
bun ./index.ts

Workspaces? Да.

bun install поддерживает workspaces аналогично npm, с дополнительными функциями.

В package.json вы можете установить "workspaces" в массив относительных путей.

json
{
  "name": "my-app",
  "workspaces": ["packages/*", "apps/*"]
}

Фильтрация скриптов по имени workspace

В Bun флаг --filter принимает glob-шаблон и запускает команду параллельно для всех workspace-пакетов с name, соответствующим шаблону, соблюдая порядок зависимостей.

sh
bun --filter 'lib-*' my-script
# вместо:
# npm run --workspace lib-foo --workspace lib-bar my-script

Обновление зависимостей

Для обновления зависимости вы можете использовать bun update <package>. Это обновит зависимость до последней версии, удовлетворяющей диапазону semver, указанному в package.json.

sh
# Обновить одну зависимость
bun update @types/bun

# Обновить все зависимости
bun update

# Игнорировать semver, обновить до последней версии
bun update @types/bun --latest

# Обновить зависимость до определённой версии
bun update @types/bun@1.3.3

# Обновить все зависимости до последних версий
bun update --latest

Просмотр устаревших зависимостей

Для просмотра устаревших зависимостей выполните bun outdated. Это похоже на npm outdated, но с более компактным выводом.

sh
bun outdated
txt
┌────────────────────────────────────────┬─────────┬────────┬────────┐
│ Package                                │ Current │ Update │ Latest │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ @types/bun (dev)                       │ 1.1.6   │ 1.1.10 │ 1.1.10 │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ @types/react (dev)                     │ 18.3.3  │ 18.3.8 │ 18.3.8 │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ @typescript-eslint/eslint-plugin (dev) │ 7.16.1  │ 7.18.0 │ 8.6.0  │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ @typescript-eslint/parser (dev)        │ 7.16.1  │ 7.18.0 │ 8.6.0  │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ @vscode/debugadapter (dev)             │ 1.66.0  │ 1.67.0 │ 1.67.0 │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ esbuild (dev)                          │ 0.21.5  │ 0.21.5 │ 0.24.0 │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ eslint (dev)                           │ 9.7.0   │ 9.11.0 │ 9.11.0 │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ mitata (dev)                           │ 0.1.11  │ 0.1.14 │ 1.0.2  │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ prettier-plugin-organize-imports (dev) │ 4.0.0   │ 4.1.0  │ 4.1.0  │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ source-map-js (dev)                    │ 1.2.0   │ 1.2.1  │ 1.2.1  │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ typescript (dev)                       │ 5.5.3   │ 5.6.2  │ 5.6.2  │
└────────────────────────────────────────┴─────────┴────────┴────────┘

Список установленных пакетов

Для просмотра списка установленных пакетов вы можете использовать bun pm ls. Это отобразит все пакеты, установленные в папке node_modules, используя lockfile от Bun в качестве источника истины. Вы можете передать флаг -a для отображения всех установленных пакетов, включая транзитивные зависимости.

sh
# Список установленных пакетов верхнего уровня:
bun pm ls
txt
my-pkg node_modules (781)
├── @types/node@20.16.5
├── @types/react@18.3.8
├── @types/react-dom@18.3.0
├── eslint@8.57.1
├── eslint-config-next@14.2.8
...
sh
# Список всех установленных пакетов:
bun pm ls -a
txt
my-pkg node_modules
├── @alloc/quick-lru@5.2.0
├── @isaacs/cliui@8.0.2
│   └── strip-ansi@7.1.0
│       └── ansi-regex@6.1.0
├── @jridgewell/gen-mapping@0.3.5
├── @jridgewell/resolve-uri@3.1.2
...

Создание tarball пакета

Для создания tarball пакета вы можете использовать bun pm pack. Это создаст tarball пакета в текущей директории.

sh
# Создать tarball
bun pm pack
txt
Total files: 46
Shasum: 2ee19b6f0c6b001358449ca0eadead703f326216
Integrity: sha512-ZV0lzWTEkGAMz[...]Gl4f8lA9sl97g==
Unpacked size: 0.41MB
Packed size: 117.50KB

Shebang

Если пакет ссылается на node в shebang #!/usr/bin/env node, bun run по умолчанию будет уважать это и использовать системный исполняемый файл node. Вы можете принудительно использовать node от Bun, передав --bun в bun run.

Когда вы передаёте --bun в bun run, мы создаём символическую ссылку на локально установленный исполняемый файл Bun с именем "node" во временной директории и добавляем её в ваш PATH на время выполнения скрипта.

sh
# Принудительно использовать среду выполнения Bun вместо node
bun --bun my-script

# Это тоже работает:
bun run --bun my-script

Глобальные установки

Вы можете устанавливать пакеты глобально с помощью bun i -g <package>. По умолчанию это установит в папку .bun/install/global/node_modules внутри вашей домашней директории.

sh
# Установить пакет глобально
bun i -g eslint

# Запустить глобально установленный пакет без префикса `bun run`
eslint --init

Bun от www.bunjs.com.cn