Год назад Bun 1.0 был громким релизом и тихим прототипом в проде. К версии 1.1 (апрель 2024) и далее по minor-релизам ситуация изменилась. Расскажем, где у нас Bun уже бежит, и где мы пока остаёмся на Node.js.
Где Bun однозначно выигрывает
Скрипты, миграции, CI-задачи
Bun стартует за 30 мс, Node - за 200 мс. На скрипте, который запускается 50 раз в CI, это уже минуты. Все наши seed-скрипты, миграционные обёртки, lint-агрегаторы переехали на Bun.
Установка зависимостей
bun install в 5–15 раз быстрее npm и в 3–8 раз быстрее pnpm на наших проектах. На большом монорепо время CI-этапа install сократилось с 4 минут до 35 секунд. Это самая лёгкая победа Bun.
Тесты
bun test - встроенный jest-совместимый раннер. На простых юнит-тестах работает быстрее vitest и заметно быстрее jest. На сложных проектах с большим количеством mock-ов - пока проседает.
Где мы пока на Node.js
Production HTTP-сервера на критичной нагрузке. Bun стабильнее, чем год назад, но мы видели несколько случаев странных утечек памяти под продолжительной нагрузкой и с долгоживущими WebSocket-соединениями. Node.js в этом классе задач - проверенный, отладочный инструментарий зрелый.
Серверы с тяжёлым native-зависимостями: image processing (sharp), ML (onnxruntime), некоторые drivers БД. Нативная совместимость подтянулась, но edge-cases встречаются.
Что нас удивило
- Совместимость с Node.js APIs - выше, чем ожидали. Большинство наших скриптов запустились без правок.
- Встроенный SQLite-клиент с синхронным API - приятно для скриптов и встроенных кэшей.
- Bun.serve() даёт неплохой HTTP-сервер из коробки, но мы предпочитаем Hono поверх него.
- Bundler работает, но мы всё равно используем esbuild/Rollup для прод-сборок.
Наш текущий стек
- Локальная разработка: Bun как раннер скриптов и тест-раннер. Application server остаётся на Node.
- CI: Bun для install и test, Node для интеграционных тестов.
- Прод: Node.js. Bun рассматриваем для нового сервиса в следующем квартале.