Node.js vs Bun vs Deno 2026: бенчмарки и выбор runtime для продакшн
JavaScript-runtime конкуренция достигла зрелости в 2026 году. Bun стабилен и реально быстрее по ряду параметров. Deno 2.0 отказался от своей идеологии «никакого npm». Node.js 22 запускает .ts файлы без транспиляции. Выбор стал содержательным.
Что нового в 2025-2026
Bun 1.0+ (production-стабилен с 2025):
- Совместимость с npm: >95% пакетов работают
- JavaScriptCore движок (Safari, не V8)
- Встроенный bundler + test runner + package manager
- Нативная поддержка TypeScript без конфигурации
Deno 2.0 (октябрь 2024):
- Полная поддержка npm через
npm:спецификатор - Node.js compatibility mode
- Упрощённая модель разрешений
- Workspaces
Node.js 22/23:
--experimental-strip-types— запуск.tsнапрямую- V8 12.x с Maglev компилятором
- Зрелый встроенный test runner
Бенчмарки HTTP-сервера
Минимальный сервер на идентичном железе (8 ядер, 16 ГБ):
| Runtime | Запросов/сек | p99 latency | Память |
|---|---|---|---|
| Bun 1.1 (нативный) | ~240 000 | 1.2мс | 48 МБ |
| Node.js 22 (uWebSockets) | ~210 000 | 1.4мс | 62 МБ |
| Node.js 22 (http) | ~85 000 | 2.8мс | 78 МБ |
| Deno 2.0 | ~78 000 | 3.1мс | 54 МБ |
| Node.js 20 (http) | ~68 000 | 3.4мс | 82 МБ |
С реальными фреймворками:
| Фреймворк | Runtime | Запросов/сек |
|---|---|---|
| Bun нативный | Bun | ~240k |
| Elysia.js | Bun | ~220k |
| Hono | Bun | ~210k |
| Hono | Node.js | ~130k |
| Fastify | Node.js | ~115k |
| Express.js | Node.js | ~58k |
Для нагруженного API — Hono на Bun даёт лучший результат без компромисса по экосистеме.
Package manager: скорость установки
| Операция | npm | pnpm | Yarn | bun |
|---|---|---|---|---|
| Холодная установка | 28с | 12с | 14с | 2.1с |
| С кэшем | 18с | 3.2с | 4.1с | 0.4с |
| disk space | 340МБ | 320МБ | 330МБ | 298МБ |
bun install в 14 раз быстрее npm при наличии кэша. На CI/CD пайплайне это экономит 1-3 минуты каждого деплоя.
TypeScript: сравнение подходов
Node.js 22
# Работает без настройки для простых случаев
node --experimental-strip-types server.ts
Буквально удаляет типы. Не работает: enum, const enum, legacy декораторы. Для простых случаев подходит.
Bun
# Просто работает
bun run server.ts
bun run server.tsx
Встроенная транспиляция TypeScript. Enum, декораторы — всё работает. Самый удобный TypeScript-опыт из трёх.
Deno
deno run --check server.ts
TypeScript первого класса с самого начала. Strict mode по умолчанию. deno check для type checking без запуска.
Совместимость с экосистемой
| Возможность | Node.js | Bun | Deno |
|---|---|---|---|
| npm-пакеты | ✅ нативно | ✅ ~95% | ✅ npm: |
| CommonJS | ✅ | ✅ | ⚠️ частично |
| ESM | ✅ | ✅ | ✅ (обязательно) |
__dirname |
✅ | ✅ | ❌ (import.meta.dirname) |
| Нативные .node | ✅ | ⚠️ ограниченно | ❌ |
Встроенный инструментарий
| Инструмент | Node.js | Bun | Deno |
|---|---|---|---|
| Test runner | node --test |
bun test |
deno test |
| Bundler | Нет | bun build |
deno compile |
| TypeScript | Эксперим. | ✅ нативно | ✅ нативно |
| Formatter | Нет | Нет | deno fmt |
| Linter | Нет | Нет | deno lint |
Deno как all-in-one toolchain исключителен: единый инструмент вместо цепочки prettier + eslint + ts-node + jest.
Безопасность
| Модель | Node.js | Bun | Deno |
|---|---|---|---|
| Изоляция | Нет | Нет | Да (разрешения) |
# Deno: явные разрешения
deno run \
--allow-net=api.kaspi.kz,api.freedompay.kz \
--allow-read=/app/data \
--allow-env=DATABASE_URL,API_KEY \
payment-processor.ts
Особенно важно при работе с финансовыми API.
Практические рекомендации
Используйте Node.js когда:
- Существующий production-проект — не трогайте без причины
- Нативные addons: sharp, canvas, better-sqlite3
- NestJS с большой командой и устоявшимися ops-практиками
- Enterprise, требующий LTS-поддержки
Используйте Bun когда:
- Новый API-сервис или микросервис
- TypeScript-first разработка без лишней настройки
- CI время критично —
bun installэкономит минуты - Работаете с Hono или Elysia
Используйте Deno когда:
- Edge/serverless: Deno Deploy, Netlify Edge Functions
- Скрипты и автоматизация с безопасностью
- Финансовые операции с внешними API (permission model)
- Нужен форматтер + линтер без конфигурации
Переход на Bun: что проверить
# Тест совместимости
bun install # установить зависимости
bun test # запустить тесты
# Что проверить:
# 1. Нативные addons — ищите bun-совместимые альтернативы
# 2. Специфические Node.js stream API
# 3. pkg.json "exports" edge cases
# 4. child_process vs Bun.spawn различия
Если тесты проходят — приложение скорее всего заработает на Bun.
Aunimeda строит высокопроизводительные backend-системы для казахстанских проектов. Обсудим архитектуру.
Смотрите также: Event-driven архитектура Node.js, OWASP безопасность для KZ