Node.js vs Bun vs Deno 2026: какой JavaScript runtime выбрать
В 2026 году «JavaScript runtime = Node.js» уже не данность. Bun стабилен в production и реально быстрее. Deno 2.0 отказался от принципа «без npm» и поддерживает совместимость. Node.js 22 запускает TypeScript без транспиляции. Выбор стал содержательным.
Что изменилось в 2025-2026
Bun 1.0+ (релиз Sep 2023, production-стабилен с 2025):
- Полная совместимость с npm-пакетами (>95% API)
- Встроенный bundler, test runner, package manager
- Движок JavaScriptCore (движок Safari, не V8)
- Совместимость с Node.js API
Deno 2.0 (релиз Oct 2024):
- Полная поддержка npm через спецификатор
npm: - Режим совместимости с Node.js
- Поддержка workspaces
- Упрощённая модель разрешений
Node.js 22/23:
--experimental-strip-types: запуск.tsфайлов напрямую- Зрелый встроенный test runner
- V8 12.x с улучшенной производительностью
- Компилятор Maglev по умолчанию
Бенчмарки HTTP-сервера
Минимальный HTTP-сервер, возвращающий { "hello": "world" }, на идентичном железе (8 ядер, 16GB RAM):
| Runtime | Запросов/сек | Latency p99 | Память |
|---|---|---|---|
| Bun 1.1 | ~240 000 | 1.2мс | 48 МБ |
| Node.js 22 (uWS) | ~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 native | Bun | ~240k |
| Elysia.js | Bun | ~220k |
| Hono | Bun | ~210k |
| Hono | Node.js | ~130k |
| Fastify | Node.js | ~115k |
| Express.js | Node.js | ~58k |
Hono на Bun — оптимальный выбор для новых проектов, где важна производительность.
Скорость пакетного менеджера
| Операция | npm | pnpm | Yarn | bun install |
|---|---|---|---|---|
| Холодная установка | 28с | 12с | 14с | 2.1с |
| С кэшем | 18с | 3.2с | 4.1с | 0.4с |
| Размер node_modules | 340МБ | 320МБ | 330МБ | 298МБ |
bun install в ~14 раз быстрее npm при использовании кэша. В CI это ощутимо.
Поддержка TypeScript
Node.js 22 — экспериментальный strip types
# Работает без флагов только для простых случаев
node --experimental-strip-types server.ts
Ограничения: нет поддержки enum, экспериментальных декораторов, const enum. Буквально убирает аннотации типов. Для простых случаев — подходит.
Bun — TypeScript первого класса
# Работает без флагов
bun run server.ts
bun run server.tsx
Bun транспилирует TypeScript встроенным бандлером. Никакого tsc. Enum, декораторы — всё работает. Лучший опыт TypeScript-разработки.
Deno — TypeScript из коробки
deno run server.ts
Deno был первым с нативной поддержкой TypeScript. Полный функционал, strict mode по умолчанию.
Совместимость с экосистемой
| Возможность | Node.js | Bun | Deno |
|---|---|---|---|
| npm-пакеты | Нативно | 95%+ | npm: спецификатор |
| CommonJS (require) | Нативно | Да | Частично |
| ESM | Да | Да | Нативно (обязательно) |
__dirname |
Да | Да | Нет (используйте import.meta) |
| Worker Threads | Да | Да | Да (Web Workers) |
| Нативные модули (.node) | Да | Ограниченно | Нет |
Важно: если используете нативные Node.js addons (sharp, better-sqlite3), Bun может не работать. Большинство чистых JS-пакетов работают нормально.
Модель безопасности
Node.js — нет изоляции по умолчанию
Полный доступ к системе. Любой установленный пакет может читать файлы, делать сетевые запросы, запускать процессы.
Deno — разрешения
# Явно указываем что разрешено
deno run --allow-net=api.example.com --allow-read=/tmp server.ts
# Попытка без разрешения = ошибка runtime
Главное преимущество Deno для ненадёжного кода.
Bun — нет изоляции по умолчанию
Аналогично Node.js.
Совместимость с фреймворками
| Фреймворк | Node.js | Bun | Deno |
|---|---|---|---|
| Express.js | ✅ | ✅ | ✅ (npm:) |
| Fastify | ✅ | ✅ | ✅ |
| NestJS | ✅ | ✅ (экспер.) | ✅ |
| Next.js | ✅ | ✅ | Нет |
| Prisma | ✅ | ✅ | ✅ |
| Drizzle | ✅ | ✅ | ✅ |
Next.js на Bun работает. bun run next dev стартует заметно быстрее, чем npm run next dev.
Встроенные инструменты
| Инструмент | Node.js | Bun | Deno |
|---|---|---|---|
| Test runner | node --test |
bun test |
deno test |
| Bundler | Нет (webpack/esbuild) | bun build |
deno bundle |
| TypeScript | Экспериментально | Нативно | Нативно |
| Форматтер | Нет | Нет | deno fmt |
| Линтер | Нет | Нет | deno lint |
| Package manager | npm | bun install |
deno add |
All-in-one тулчейн Deno исключителен для новых проектов. deno fmt + deno lint без конфигурации — реально приятно.
Когда что выбирать
Node.js:
- Существующая production-кодовая база
- Команда глубоко знает экосистему
- Нативные addons (sharp, node-gyp)
- Enterprise с требованиями к LTS-стабильности
- NestJS при известных ops-паттернах
Bun:
- Новый проект с требованиями к производительности
- TypeScript-first разработка
- Быстрее
npm installв CI - Простое HTTP API где важен throughput
- Уже используете Hono или Elysia
Deno:
- Безопасность — первый приоритет
- Edge/serverless (Deno Deploy, Netlify Edge)
- Скрипты с нулевой конфигурацией
- Framework Fresh (собственный веб-фреймворк Deno)
- Нужен встроенный formatter/linter
Миграция с Node.js на Bun
Большинство Node.js приложений запустятся на Bun с минимальными изменениями:
# Замена пакетного менеджера
bun install # вместо npm install
# Запуск скриптов
bun run dev # вместо npm run dev
# Что может сломаться:
# 1. Нативные addons — проверьте совместимость с Bun
# 2. Edge cases в Node.js stream API
# 3. Некоторые случаи package.json "exports"
Практичный подход: запустите тест-сьют на Bun. Если проходит — приложение скорее всего заработает.
Вывод
Для новых production-проектов в 2026: Bun для API и backend-сервисов где вы управляете стеком, Node.js где нужна максимальная совместимость с экосистемой.
Для существующих проектов: оставайтесь на Node.js если нет конкретных проблем (медленный CI, требования к throughput).
Для edge/serverless: Deno Deploy или Cloudflare Workers — лучше справляются с холодным стартом чем Node.js Lambda.
Aunimeda строит высокопроизводительные backend-системы на Node.js и Bun. Обсудим задачу.
Смотрите также: OWASP Top 10 безопасность, WebSocket 100k соединений