Главная / Статьи / Bun 1.4 Встроенные инструменты, которые могут заменить Sharp, Puppeteer, node-pty и другие

Bun 1.4 Встроенные инструменты, которые могут заменить Sharp, Puppeteer, node-pty и другие

Практическое руководство по встроенным функциям Bun 1.4: обработка изображений, браузер, Markdown, cron, терминал, параллельные скрипты и тестирование, а также способы безопасной пробной работы с ними в реальных проектах.

2118 слов

Типичный проект на JavaScript накапливает зависимости для каждой необходимой функции: sharp для обработки изображений, парсер Markdown, Playwright или Puppeteer для автоматизации браузера, библиотека cron, node-pty для псевдотерминалов, concurrently или npm-run-all для параллельной работы скриптов, а также множество настроек CI для ускорения тестирования. Bun 1.4 занимает иной подход: многие из этих функций могут реализованы непосредственно в самом движке. В этом руководстве рассматриваются новые встроенные инструменты с примерами кода, необходимыми для их тестирования, а также предлагается безопасный способ их оценки.

Согласно объявлению о выпуске, Bun 1.4 был выпущен 20 августа 2026 года; он включает более 1 500 тестов на совместимость с Node.js, исправления более 2 900 проблем и снижение использования CPU и памяти в состоянии ожидания. API этой новой версии могут всё ещё изменяться, поэтому рассматривайте приведённую ниже информацию как моментальный снимок и подтверждайте её, сравнивая с официальным объявлением Bun 1.4 и текущей документацией. Основная цель этого выпуска — не столько увеличение скорости, сколько сокращение объёма инструментов.

Установка или обновление

Bun можно установить с помощью скрипта в терминале, npm, Homebrew, PowerShell в Windows или в виде образа Docker. Каждая строка ниже представляет собой один из вариантов; выберите тот, который подходит вашей среде:

--curl
curl -fsSL https://bun.sh/install | bash

--npm
npm install -g bun

--brew
brew install oven-sh/bun/bun

--powershell
powershell -c "irm bun.sh/install.ps1 | iex"

--docker
docker pull oven/bun

Если Bun уже установлен на вашем компьютере, одна команда переведёт вас на последнюю версию:

bun upgrade

Обработка изображений с помощью Bun.Image

Bun.Image позволяет выполнять декодирование, изменение размера, поворот и кодирование изображений в распространённых форматах прямо во время выполнения, поэтому больше не требуется зависимость от нативных библиотек для работы с изображениями. Приведённая ниже цепочка операций читает JPEG-изображение, вкладывает его в прямоугольник размером 1024 на 1024, сохраняя при этом соотношение сторон, поворачивает его, кодирует в формате WebP с качеством 85 и записывает результат:

await Bun.file("photo.jpg")
  .image()
  .resize(1024, 1024, { fit: "inside" })
  .rotate(90)
  .webp({ quality: 85 })
  .write("thumb.webp");

Поскольку каждый шаг возвращает тот же объект-строитель, цепочка операций выполняется сверху вниз, как пошаговая инструкция. Типичные случаи применения включают создание миниатюр при загрузке, изменение размера аватаров, конвертацию JPEG в WebP, использование API для работы с изображениями и оптимизацию ресурсов перед их сохранением в хранилище.

Bun сообщает, что его реализация превосходит sharp в нескольких собственных тестах производительности, включая изменение размеров и кодирование PNG в формате 1080p. Ещё одним значительным преимуществом является отсутствие нативного модуля, который часто усложняет процесс сборки в Docker и работу кэша CI. Если вы используете продвинутые функции sharp, убедитесь, что необходимые операции действительно поддерживаются, прежде чем переходить на Bun.

Автоматизация работы браузера без интерфейса с помощью Bun.WebView

Bun.WebView — это встроенный API браузера без интерфейса, который позволяет навигировать, кликать, прокручивать страницу, выполнять JavaScript-код и делать скриншоты. Обратите внимание на объявление await using: оно связывает срок жизни объекта браузера с контекстом, в котором он используется, так что браузер автоматически освобождается по окончании блока, даже в случае возникновения ошибок.

await using view = new Bun.WebView({
  width: 800,
  height: 600,
});

await view.navigate("https://bun.sh");
await view.click("a[href='/docs']");
const title = await view.evaluate("document.title");
await Bun.write(
  "page.png",
  await view.screenshot()
);

Скрипт открывает страницу, переходит по ссылке, считывает заголовок документа и сохраняет скриншот. Это позволяет выполнять множество небольших задач без необходимости использования полноценной автоматизационной платформы: сервисов для создания скриншотов, тестов на работоспособность, инструментов для парсинга, проверок времени доступности, инструментов для проверки ссылок и простых процессов тестирования качества. Когда требуется более низкий уровень контроля, Bun.WebView предоставляет возможность воспользоваться протоколом Chrome DevTools. Для крупных комплексов тестов, требующих совместимости с разными браузерами, всё равно вероятнее, что лучшим решением будет специализированный инструмент.

Отрисовка Markdown с помощью Bun.markdown

Bun.markdown преобразует Markdown в несколько форматов. Самый простой вариант возвращает строку HTML:

const html = Bun.markdown.html(
  "# Hello **world**"
);

Он также может напрямую генерировать элементы React, что удобно, когда компонент отображает страницу README или документацию:

export default function Page() {
  return Bun.markdown.react(readme);
}

Рендеринг можно дальше настраивать, например для форматирования вывода в терминале. Поддерживаются расширения Markdown в стиле GitHub, такие как таблицы, списки задач, подчеркивание текста и автопереходы. Это подходит для сайтов с документацией, порталов разработчиков, блогов, просмотрщиков README, помощи в CLI, баз знаний и интерфейсов, отображающих Markdown, сгенерированный моделями.

Есть один важный момент, который имеет большее значение, чем все остальные: HTML-вывод не проходит обработку дезинфекции. Любой Markdown от пользователей, сторонних организаций или ИИ-моделей должен пройти процедуру дезинфекции перед тем, как попасть в браузер, иначе существует риск внедрения скриптов.

Задания с расписанием с помощью Bun.cron

Bun.cron() работает в двух режимах. В первом он регистрирует задачу у планировщика операционной системы: crontab в Linux, launchd в macOS и Task Scheduler в Windows. При вызове указываются путь к скрипту, выражение cron и имя задачи; в приведённом примере задача запускает рабочий процесс каждый понедельник в 02:30:

await Bun.cron(
  "./worker.ts",
  "30 2 * * MON",
  "weekly-report"
);

Поскольку планирование находится в ведении операционной системы, задача выполняется даже тогда, когда процесс Bun не активен. Во втором режиме планирование находится внутри работающего процесса, причём задача выполняется каждые пять минут. Декларация using прерывает выполнение задачи по окончании её области видимости:

using job = Bun.cron(
  "*/5 * * * *",
  async () => {
    await cleanupTempFiles();
  }
);

Задания выполняются без перекрытия, поддерживаются явные часовые пояса. Хорошими примерами являются задачи по очистке, генерация отчетов, техническое обслуживание базы данных, синхронизация данных, обработка пачек электронных писем и периодический опрос. Имейте в виду, что задания внутри процесса исчезают при его перезапуске, и если вы запускаете несколько копий, каждая из них будет выполняться отдельно, если только вы не добавите механизм координации.

Параллельное выполнение скриптов

bun run --parallel заменяет concurrently и npm-run-all. Передайте несколько имён скриптов, чтобы выполнить их одновременно:

bun run --parallel build test

Шаблоны glob выбирают группу скриптов:

bun run --parallel "build:*"

В сочетании с --filter этот же флаг позволяет запустить скрипт во всех рабочих пространствах:

bun run --parallel --filter '*' build

Обычно одна ошибка прерывает всё выполнение; --no-exit-on-error позволяет оставшимся задачам завершиться, что полезно для сбора всех ошибок тестов одновременно:

bun run --parallel --no-exit-on-error --filter '*' test

Каждая строка вывода сопровождается указанием скрипта, который её генерировал, благодаря чему смешанные логи остаются читаемыми. В монорепозитории это позволяет заменить последовательную обработку на распределение задач между ядрами процессора:

package A → build
package B → build
package C → build

Параллельные запуски не учитывают зависимости между пакетами, поэтому если один пакет должен быть собран до другого, всё равно требуется определение порядка выполнения или использование инструмента для управления задачами, способного моделировать структуру зависимостей.

Более быстрые тесты

bun test получил флаг --parallel:

bun test --parallel

Вы можете явно указать количество рабочих процессов:

bun test --parallel=4

Файлы передаются рабочим процессам динамически, а не разделяются заранее на фиксированные группы, поэтому медленный файл не заставляет остальные процессы простаивать. Три связанных флага предназначены для использования в системах CI. Механизм шардинга распределяет тесты между разными машинами; здесь показан первый из трех фрагментов:

bun test --shard=1/3

Запуск только тестов, затронутых вашими изменениями, сокращает временные циклы обратной связи:

bun test --changed

Запись времени выполнения позволяет при последующих запусках сбалансировать нагрузку с использованием реальных данных о времени:

bun test --timings=timings.json

Параллельная обработка выявляет тесты, которые используют общие ресурсы, такие как база данных, фиксированные порты или временные файлы. Ожидайте необходимости устранения некоторых проблем с изоляцией при первом включении этой функции.

Устранение уязвимых зависимостей

Для поддержания безопасности существует встроенная команда:

bun audit fix

Она обновляет уязвимые пакеты до исправленных версий и устанавливает их. Если для исправления требуется повышение версии до более высокой, Bun сообщает об этом вместо того, чтобы применить изменения; для активации этой функции добавьте параметр --latest. Рассматривайте такие крупные обновления как любые изменения, влияющие на работу приложения. В среде CI безопасность зависимостей интегрируется в обычный шаг установки.

Удаление дублирующихся зависимостей

В крупных проектах часто существует несколько практически идентичных версий одного пакета:

esbuild@0.15.10
esbuild@0.15.11

Когда одна версия удовлетворяет всем требованиям, этот командный инструмент объединяет дубликаты:

bun dedupe

Проверка сбрасывается с ошибкой, если дубликаты остаются, что делает её подходящим элементом систем контроля качества:

bun dedupe --check

Меньшее количество дубликатов означает более компактные деревья зависимостей, быстрее установку, меньшее использование диска, упрощённое обслуживание и потенциально меньшие размеры развертываний.

Управление интерактивными программами с Bun.Terminal

Bun.Terminal — это встроенный псевдотерминал, который позволяет JavaScript управлять интерактивными программами без использования node-pty:

bash
vim
htop

Псевдотерминал важен, поскольку подобные программы ведут себя иначе при обнаружении настоящего терминала: они отображают интерфейсы в полноэкранном режиме, используют цвета и ожидают нажатий клавиш. Именно поэтому Bun.Terminal имеет значение для инструментов разработчиков, CLI-инструментов, панелей управления терминалом, инструментов удаленной разработки, интерактивных автоматизаций и агентов для написания кода на основе ИИ, которые всё чаще работают непосредственно в оболочке.

Совместимость с Node.js и Next.js

Самым значимым изменением может стать улучшение совместимости, а не появление нового API. В этой версии добавлено 1 517 тестов для Node.js, а также отмечены улучшения в модулях http, fs, stream, cluster, timers, zlib и vm. Также улучшена поддержка в нескольких категориях: фреймворков (Next.js 16, Nuxt, Fastify), инструментов тестирования (Vitest, Playwright, Testcontainers), систем наблюдаемости (OpenTelemetry и dd-trace от Datadog) а также клиентов для работы с данными или инфраструктурой (TypeORM, RabbitMQ и AWS S3).

Флаг --bun заставляет интерфейс командной строки инструмента работать под управлением Bun вместо бинарника Node.js, указанного в её shebang. Согласно информации о выпуске, это работает с Next.js 16.3, Turbopack и React Compiler:

bun --bun next build

Успех внедрения в конечном итоге зависит от того, сможет ли ваша существующая приложение выдержать переход на новую платформу, поэтому успешная сборка собственного проекта ценнее любых опубликованных тестов производительности.

Утверждения о производительности в контексте

Результаты тестов Bun версии 1.4 показывают в пять раз меньшую нагрузку на CPU в режиме ожидания, значительно меньшее потребление памяти при обработке HTTP-запросов, а также более быстрый старт работы на Linux и Windows. Это данные, предоставленные производителем, поэтому их следует рассматривать как ориентир. Меньшая нагрузка на CPU, память и время старта могут привести к более дешевым и быстрым сервисам, но только ваши собственные тесты могут это подтвердить. Чтобы получить более полное представление о компромиссах при работе среды выполнения, ознакомьтесь с нашим сравнением Node.js, Deno и Bun.

Безопасный способ оценки Bun 1.4

Полная замена производственной системы редко бывает разумной. Лучше использовать небольшие, обратимые эксперименты.

Начните работу с новым API

Создайте структуру проекта и разработайте небольшой сервис с помощью Bun.serve:

bun init

Замените один процесс обработки изображений

Перенесите одну цепочку обработки с использованием sharp на Bun.Image и сравните качество вывода и время выполнения.

Переместите одну запланированную задачу

Выберите простую задачу cron и переимплементируйте её с помощью Bun.cron().

Параллелизуйте тесты

Запустите существующий набор тестов параллельно и отметьте, какие из них выходят за рамки из-за общего состояния:

bun test --parallel

Очистите зависимости

Попробуйте команды по улучшению безопасности и удалению дубликатов на отдельной ветке и просмотрите результаты изменений:

bun audit fix
bun dedupe

Соберите приложение Next.js под управлением Bun

Запустите производственную сборку с использованием среды выполнения Bun и сравните её со своей текущей цепочкой обработки:

bun --bun next build

В любом случае измеряйте реальные результаты, а не полагайтесь на опубликованные тест-данные.

Тренд консолидации

Bun 1.4 — это не столько набор новых API, сколько среда выполнения, которая берёт на себя функции, ранее выполняемые отдельными пакетами. Основная структура включает слой среды выполнения с API Node.js, слой инструментов для тестирования, скриптов, обеспечения безопасности, CI и терминалов, а также слой библиотек для работы с изображениями, Markdown, браузерами и cron:

Bun 1.4
               │
     ┌─────────┼──────────┐
     │         │          │
 Runtime    Tooling    Libraries
     │         │          │
 Node.js     Testing    Image
 APIs        Scripts    Markdown
             Security   Browser
             CI         Cron
             Terminal

Экосистема npm получила свою мощность за счёт объединения тысяч небольших пакетов, но эта мощность сопряжена с проблемами в виде зависимостей, настройки, необходимости обеспечения совместимости, обновлений безопасности и фрагментированности инструментов. Bun делает ставку на противоположное: включает полезные базовые компоненты непосредственно в среду выполнения.

Основные выводы

  • Вопрос, который стоит задать, изменился с «Является ли Bun быстрее Node.js?» на «Какие компоненты моей технологической стека может заменить Bun?»
  • Встроенные функции сокращают количество зависимостей, но перед заменой таких проверенных библиотек, как sharp или Playwright, необходимо убедиться в совместимости функций.
  • Санитаризируйте HTML-вывод, генерируемый Bun.markdown, каждый раз, когда исходные данные ненадежны.
  • Параллельная обработка скриптов и тестов приносит быстрые результаты, но может выявить скрытые проблемы с порядком выполнения и общим состоянием системы.
  • Рассматривайте тесты от производителей как гипотезу и проверяйте каждую функцию на соответствие вашим собственным нагрузкам перед принятием решения.