Релиз Bun 1.4: переписывание на Rust, скачок совместимости с Node.js и встроенное профилирование в Markdown
Команда проекта Bun представила мажорный релиз серверного рантайма 1.4. Обновление знаменует переход проекта на новый этап: ключевые подсистемы платформы переписываются с языка Zig на Rust, а управление памятью унифицировано вокруг оптимизированного аллокатора mimalloc. Вместе с архитектурной перестройкой разработчики объявили о преодолении важного рубежа совместимости: рантайм успешно прошел свыше 1500 новых тестов из официального набора Node.js test/parallel. Кроме того, в CLI появились встроенные генераторы профилей нагрузки CPU и памяти в формате Markdown, ориентированные на терминал и автоматизированные пайплайны.
Для серверной разработки на JavaScript и TypeScript выход этой версии важен не очередным рекордом скорости, а решением практических проблем, сдерживавших промышленное внедрение. Долгое время миграция продакшен-сервисов с Node.js на альтернативные платформы упиралась в неполную поддержку стандартных библиотек, непредсказуемые скачки расхода памяти и сложность отладки в контейнерах. Обновление 1.4 прямо отвечает на эти вызовы.
Архитектурный сдвиг: миграция подсистем на Rust и единый аллокатор mimalloc
Рантайм — это системная среда, которая компилирует и исполняет код JavaScript и TypeScript на сервере, предоставляя доступ к файловой системе и сетевому стеку. Исторически Bun разрабатывался преимущественно на языке Zig с использованием движка JavaScriptCore из проекта WebKit. В версии 1.4 начался планомерный перенос ключевых подсистем платформы на Rust. Это решение направлено на повышение долговременной стабильности архитектуры и расширение сообщества контрибьюторов. При этом JavaScriptCore по-прежнему исполняет JS-байткод, тогда как Rust берет на себя системную обвязку и управление процессами.
Вторым фундаментальным изменением стала унификация подсистемы управления памятью. Аллокатор памяти — это системный менеджер, выделяющий оперативную память объектам программы и возвращающий неиспользуемые страницы операционной системе. Ранее в Bun действовали два независимых аллокатора: библиотека libpas внутри JavaScriptCore и mimalloc в основной кодовой базе Bun. Такое разделение приводило к фрагментации адресов и мешало ОС забирать освобожденную память.
В релизе 1.4 движок JavaScriptCore перевели на расширенную версию mimalloc с добавлением:
- фонового потока-мусорщика (scavenger thread), отслеживающего освободившиеся страницы памяти;
- механизма частичной декоммитации страниц (partial page decommit), отдающего память ядру ОС;
- оптимизированного обнуления диапазонов адресов без блокировки основных потоков выполнения.
В результате рантайм избавился от избыточной синхронизации и снизил базовое потребление памяти при длительной работе под переменной нагрузкой.
Совместимость с Node.js: рубеж в 1500+ тестов и поддержка фреймворков
Главным критерием применимости альтернативного рантайма остается его способность без изменений запускать код из экосистемы npm. В версии 1.4 команда Bun интегрировала и успешно закрыла еще 1517 тестов из официального тестового набора Node.js (test/parallel).
Процент успешного прохождения тестов по базовым модулям распределился так:
node:events,node:trace_events,node:sqlite— 100% покрытие;node:quic— 99% успешно пройденных сценариев;- группа основных модулей ввода-вывода (
node:http,node:fs,node:cluster,node:timers,node:zlib,node:vm,node:stream) — 97% пройденных тестов.
Этот прогресс позволил обеспечить стабильную работу сложных инструментов разработки. Подтверждена поддержка тестового фреймворка Playwright (включая прямое подключение через Chrome DevTools Protocol по вызову connectOverCDP и UI-режим), Next.js 16.3 с компилятором Turbopack и React Compiler, а также тестового раннера Vitest с параллельным исполнением через пулы потоков и форков. Для систем мониторинга добавлена интеграция с трейсингом Datadog (dd-trace, @datadog/pprof) и стандартом OpenTelemetry.
Однако разработчикам важно учитывать: высокий процент покрытия в тестах — это показатель следования спецификациям, а не абсолютная гарантия беспроблемной работы любого сервиса. Продакшен-системы часто зависят от краевых случаев — нюансов обработки ошибок, порядка срабатывания микротасок, противодавления в потоках данных (backpressure) или сборки нативных C++ аддонов.
Замеры производительности: оперативная память и холодный старт
Команда Bun представила сравнительные замеры, демонстрирующие эффект от оптимизации внутренних циклов и перехода на единый аллокатор:
- Нагрузка на процессор в состоянии покоя (idle CPU) снизилась до 5 раз за счет устранения фоновых опросов;
- Пиковое потребление оперативной памяти HTTP-серверами сократилось почти вдвое: Fastify показал снижение на 48%, Express — на 46%, а нативный
node:http— на 40%; - В сценарии серверного рендеринга (SSR) приложения на Next.js процесс под управлением Bun удерживал 238 МБ памяти против 410 МБ на Node.js;
- Время холодного старта процесса на Linux и Windows сократилось в 2–2,5 раза.
Эти показатели отражают результаты разработчиков в контролируемых бенчмарках. Реальный выигрыш в продакшене зависит от архитектуры сервиса, используемых библиотек, профиля трафика и лимитов контейнеров. Для постоянных фоновых API критичными метриками остаются задержки p95/p99 и поведение сборщика мусора, которые необходимо проверять на собственном стеке.
Встроенное профилирование: отчеты в формате Markdown в терминале
Профилирование — это процедура измерения затрат программы, показывающая, какие именно функции потребляют процессорное время (CPU) и оперативную память (Heap). Традиционно для анализа профилей требовалось экспортировать бинарные дампы и открывать их в сторонних графических интерфейсах.
В Bun 1.4 появились встроенные флаги командной строки для текстового профилирования:
--cpu-prof-md— генерирует отчет о нагрузке на процессор с перечнем затратных функций;--heap-prof-md— формирует срез распределения объектов в памяти и точек удержания ресурсов;--metafile-md— создает текстовую сводку структуры бандла с анализом размера модулей и зависимостей.
Отчет в Markdown можно сразу просмотреть в терминале, прикрепить к пулл-реквесту или автоматически передать в пайплайны CI и LLM-агентам для поиска регрессий без ручного анализа графиков.
Расширение нативного инструментария
Платформа развивает концепцию единого рабочего пространства:
- Параллельный запуск: флаги
bun run --parallelиbun test --parallelпозволяют запускать независимые скрипты пакетов и тесты параллельно, задействуя доступные ядра CPU; - Управление зависимостями: команды
bun audit fixдля устранения уязвимостей,bun dedupeдля удаления дубликатов пакетов иbun pruneдля очистки неиспользуемых модулей; - Нативные API: добавлены встроенные модули
Bun.Imageдля обработки графики,Bun.WebViewдля легковесных окон интерфейса,Bun.markdownдля парсинга разметки, планировщикBun.cron()и управление терминаломBun.Terminal.
Команды изменения зависимостей влияют на lockfile, поэтому их применение требует изолированной проверки в отдельной ветке.
Практический чек-лист миграции на Bun 1.4
Для взвешенной оценки и безопасного внедрения новой версии рантайма рекомендуется следовать плану:
- Фиксация эталона на Node.js: зафиксируйте эксплуатационные метрики сервиса (потребление памяти, время старта, RPS, задержки p95/p99, результаты тестов).
- Установка рантайма: выполните установку или обновление Bun по официальной инструкции с ресурса https://bun.com/docs/installation на тестовом сервере или локальной машине.
- Чистая установка зависимостей: выполните команду
bun installв изолированном каталоге, проверив корректность скриптов сборки (postinstall) и отсутствие конфликтов версий. - Прогон тестового набора: запустите модульные, интеграционные и сквозные (e2e) тесты проекта через команду
bun test, обратив внимание на работу моков и таймеров. - Сравнительное нагрузочное тестирование: подайте рабочий профиль трафика на сервис под управлением Bun 1.4 и зафиксируйте задержки, потребление памяти (RSS) и стабильность соединений.
- Диагностика узких мест: с помощью флагов
--cpu-prof-mdи--heap-prof-mdснимите профили работы под нагрузкой и убедитесь в отсутствии утечек памяти. - Постепенный ввод в эксплуатацию: направьте небольшую долю реального трафика через балансировщик, сохранив возможность быстрого отката на Node.js в случае непредвиденных сбоев.


