Сервис развивается: тестируем формат, собираем идеи, улучшаем сервис. Есть идеи?

Написать
Войти
Дайджесты новостей
Иллюстрация: релиз JavaScript-рантайма Bun 1.4 и оптимизация системной производительности

Релиз Bun 1.4: переписывание на Rust, скачок совместимости с Node.js и встроенное профилирование в Markdown

Команда Bun представила масштабный релиз 1.4: ключевые подсистемы переписываются на Rust, а рантайм проходит свыше 1500 новых тестов Node.js. Переход на аллокатор mimalloc снизил потребление памяти серверов до 48%, а встроенные флаги теперь генерируют подробные профили CPU и памяти в формате Markdown.

Релиз 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

Для взвешенной оценки и безопасного внедрения новой версии рантайма рекомендуется следовать плану:

  1. Фиксация эталона на Node.js: зафиксируйте эксплуатационные метрики сервиса (потребление памяти, время старта, RPS, задержки p95/p99, результаты тестов).
  2. Установка рантайма: выполните установку или обновление Bun по официальной инструкции с ресурса https://bun.com/docs/installation на тестовом сервере или локальной машине.
  3. Чистая установка зависимостей: выполните команду bun install в изолированном каталоге, проверив корректность скриптов сборки (postinstall) и отсутствие конфликтов версий.
  4. Прогон тестового набора: запустите модульные, интеграционные и сквозные (e2e) тесты проекта через команду bun test, обратив внимание на работу моков и таймеров.
  5. Сравнительное нагрузочное тестирование: подайте рабочий профиль трафика на сервис под управлением Bun 1.4 и зафиксируйте задержки, потребление памяти (RSS) и стабильность соединений.
  6. Диагностика узких мест: с помощью флагов --cpu-prof-md и --heap-prof-md снимите профили работы под нагрузкой и убедитесь в отсутствии утечек памяти.
  7. Постепенный ввод в эксплуатацию: направьте небольшую долю реального трафика через балансировщик, сохранив возможность быстрого отката на Node.js в случае непредвиденных сбоев.