Node.js и Vite: полный обзор, плюсы, минусы и пределы

Для чего нужны Node.js и Vite: 8 сфер, плюсы и минусы, что сегодня встроено в Node.js, Vite 8 с Rolldown, сравнение с Deno, Bun, PHP и Go, примеры кода, пределы и советы.

Стек и технологии Обновлено

Коротко

Node.js выполняет JavaScript и TypeScript вне браузера: на сервере, в скриптах и в инструментах, которые собирают любой современный фронтенд. Сильные стороны — один язык для фронтенда и бэкенда, неблокирующий ввод-вывод, который держит тысячи соединений, крупнейший в мире реестр пакетов и, в свежих версиях, многое встроенное: fetch, запуск тестов, SQLite, запуск файлов .ts напрямую. Vite — сборщик поверх него: мгновенный сервер разработки и оптимизированная сборка для продакшена; его используют Vue, Svelte, Astro, React Router и Laravel. Вместе это стандартная кухня веб-разработки; цена — вес зависимостей и привычка тянуть пакет на каждую мелочь.

Node.js и Vite коротко: паспорт

Главные факты об обоих инструментах одной таблицей.

Node.js
Среда выполнения JavaScript на движке V8 от Google; Райан Даль, 2009 год; OpenJS Foundation; лицензия MIT
Как работает
Один поток с циклом событий; ввод-вывод не блокирует работу
Версии
Чётные версии становятся LTS и поддерживаются 30 месяцев
TypeScript
Свежие версии запускают файлы .ts напрямую, стирая типы
Встроено
fetch, запуск тестов, режим наблюдения, загрузка .env, node:sqlite
Пакеты
npm — крупнейший в мире реестр пакетов, миллионы пакетов
Vite
Сборщик от Эвана Ю, 2020 год; развивается в VoidZero вместе с Rolldown, Oxc и Vitest
При разработке
Отдаёт нативные ES-модули; правка появляется в браузере сразу, без полной пересборки
Для продакшена
Vite 8 собирает через Rolldown — сборщик, написанный на Rust
Кто использует Vite
Vue, SvelteKit, Astro, React Router, Nuxt, Laravel
Альтернативы
Среды — Deno и Bun; сборщики — webpack, esbuild, Rspack

Для чего применяют Node.js и Vite: 8 сфер

Node.js — везде, где JavaScript должен работать вне браузера; Vite — везде, где нужно собрать фронтенд.

  1. 01

    Сборка фронтенда

    Скрипты и стили сжаты, подписаны хешем и разбиты на части.

    ViteRolldown

  2. 02

    API и сервисы

    Бэкенд, который делит типы с интерфейсом.

    FastifyHonoNestJS

  3. 03

    Реальное время

    Чаты, уведомления и живые дашборды по WebSocket.

    WebSocketSocket.IO

  4. 04

    Серверная отрисовка React и Vue

    Страницы приходят с сервера готовыми, а потом оживают в браузере.

    Next.jsNuxtAstro

  5. 05

    Telegram-боты

    Боты и бэкенд Mini Apps на одном языке с интерфейсом.

    grammY

  6. 06

    Скрипты и автоматизация

    Импорт, отчёты и обработка данных по расписанию.

    node:sqlitecron

  7. 07

    Инструменты разработчика

    Линтеры, форматтеры и тесты для JavaScript работают на Node.js.

    ESLintPrettierVitest

  8. 08

    Настольные приложения

    Electron объединяет Node.js и движок браузера.

    Electron

Плюсы и минусы Node.js и Vite

Сильные стороны идут от одного языка везде и огромной экосистемы, слабые — от той же экосистемы.

Плюсы · 8

  • Один язык

    Фронтенд, бэкенд, скрипты и инструменты — на JavaScript или TypeScript.

  • Тысячи соединений

    Неблокирующий ввод-вывод держит множество открытых соединений на скромном железе.

  • Пакет на всё

    Крупнейший реестр: почти любая интеграция уже написана.

  • Больше встроено

    fetch, тесты, SQLite и .env без дополнительных пакетов.

  • Мгновенный сервер разработки

    Vite показывает правку в браузере сразу, даже в больших проектах.

  • Быстрая сборка для продакшена

    Rolldown в Vite 8 написан на Rust и собирает в разы быстрее старых инструментов.

  • Работает с любым бэкендом

    Манифест подсказывает PHP или Go, какие файлы с хешами подключить.

  • Много разработчиков

    JavaScript — один из самых распространённых языков, команду легко найти.

Минусы · 8

  • Вес зависимостей

    Типичный проект тянет сотни пакетов и сотни мегабайт node_modules.

  • Риск цепочки поставок

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

  • Тяжёлые вычисления блокируют

    Одно долгое вычисление останавливает цикл событий для всех; ему нужны отдельные потоки.

  • Модули ESM и CommonJS

    Две системы модулей до сих пор доставляют мучения с настройкой.

  • Частые изменения

    Инструменты и их настройки меняются от версии к версии — проекты нужно обновлять.

  • Хостинг

    Долгоживущему серверу на Node.js нужен VPS или платформа, а не виртуальный хостинг.

  • Пакет на каждую мелочь

    Привычка добавлять зависимость ради трёх строк кода растит риск и вес.

  • Память

    Процесс Node.js занимает больше памяти, чем сопоставимый сервис на Go.

Node.js и другие: сравнение с Deno, Bun, PHP и Go

Качественное сравнение сред для серверной части.

КритерийNode.jsDenoBunPHPGo
Язык JS / TS JS / TS JS / TS PHP Go
Зрелость самая высокая из трёх зрелая молодая очень высокая высокая
Совместимость с npm родная высокая высокая — —
Долгие соединения из коробки из коробки из коробки с доп. инструментами из коробки
Тяжёлые вычисления отдельные потоки воркеры воркеры слабо сильно
Хостинг VPS или платформа VPS или Deno Deploy VPS любой VPS, один файл
Лучше всего для API, реального времени, инструментов безопасных скриптов и края сети быстрых скриптов и инструментов сайтов, магазинов, админок нагруженных сервисов

Когда брать Node.js, а когда нет

Двенадцать типичных задач с вердиктом. Где Node.js не лучший выбор, названа альтернатива.

  • Сборка любого фронтенда

    Лучший выбор

    Vite — стандарт, даже для сайтов на PHP и Go.

  • API для интерфейса на React

    Лучший выбор

    Общие типы между сервером и экраном.

  • Чат и живые уведомления

    Лучший выбор

    WebSocket — родная стихия цикла событий.

  • Сайт на Next.js или Nuxt

    Лучший выбор

    Серверная отрисовка требует Node.js.

  • Telegram-бот

    Лучший выбор

    Зрелые библиотеки и тот же язык, что у Mini App.

  • Скрипты и импорт

    Лучший выбор

    Встроенные fetch и SQLite закрывают многое без пакетов.

  • Корпоративный сайт

    Подходит

    Для сборки — да; для сервера проще PHP или статические страницы.

  • Очереди фоновых задач

    Подходит

    BullMQ справляется; для огромных потоков смотрите на Go.

  • Только виртуальный хостинг

    Другой язык

    PHP — он работает везде.

  • Очень высокая нагрузка с тяжёлыми вычислениями

    Другой язык

    Go или Rust.

  • Машинное обучение

    Другой язык

    Python.

  • Очень мало памяти

    Другой язык

    Go: компактный бинарник.

Экосистема Node.js: инструменты для частых задач

Средняя колонка — то, что встроено в сам Node.js.

ЗадачаВстроеноИнструменты
Сборка — Vite, Rolldown, esbuild
HTTP-сервер node:http Fastify, Hono, Express
HTTP-клиент fetch undici
Тесты node:test Vitest
База данных node:sqlite pg, mysql2, Drizzle, Prisma
Переменные окружения --env-file dotenv
Перезапуск при правке --watch nodemon
Очереди — BullMQ
Запуск TypeScript стирание типов tsx
Пакеты npm pnpm, Yarn
Менеджер процессов — systemd, PM2

Пределы Node.js и частые ошибки

  1. Долгое вычисление в запросе

    Обработка картинок или разбор огромного файла в основном потоке останавливает все остальные запросы.

  2. Необработанные ошибки

    Отклонённый промис без обработчика может уронить весь процесс.

  3. Зависимости без контроля

    Нет файла блокировки и проверки — и новая версия чужого пакета меняет ваш проект.

  4. Секреты в сборке

    Переменные с префиксом для клиента попадают в браузер — ключи должны оставаться на сервере.

  5. Старая версия Node.js

    Версии без поддержки не получают исправлений безопасности.

  6. Процесс без присмотра

    Если сервер после сбоя никто не перезапускает, сайт лежит, пока кто-нибудь не заметит.

8 советов по Node.js и Vite

  1. 01

    Версия LTS

    Продакшен работает на актуальной LTS; нечётные версии — для экспериментов.

  2. 02

    Сначала встроенное

    fetch, node:test, node:sqlite и --env-file — прежде чем тянуться за пакетом.

  3. 03

    Файл блокировки в репозитории

    npm ci ставит ровно те версии, которые проверялись.

  4. 04

    Проверяйте зависимости

    npm audit и меньше пакетов — каждая зависимость это чужой код в вашем проекте.

  5. 05

    Тяжёлое — в отдельные потоки

    worker_threads или очередь держат цикл событий свободным.

  6. 06

    Присмотр за процессом

    systemd или PM2 перезапускают сервер после сбоя и при перезагрузке.

  7. 07

    Манифест Vite для серверных сайтов

    Бэкенд читает manifest.json и подключает файлы с хешами — кеширование без устаревших версий.

  8. 08

    Измеряйте сборку

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

Как выглядят Node.js и Vite: 4 примера

API и тест к нему только на встроенных модулях, импорт прайса во встроенную SQLite и сборка Vite для сайта с серверной отрисовкой. Запущены в Node.js 22 и Vite 8, проверены TypeScript 7.

API без пакетов

Сервер на node:http — нечего устанавливать и нечего обновлять.

server.ts
// API только на встроенных модулях: нечего устанавливать и обновлять
import { createServer } from 'node:http';

const products = [
  { sku: 'A-100', title: 'Дубовый стол', price: 24000 },
  { sku: 'B-200', title: 'Сосновая полка', price: 5000 },
];

export const server = createServer((req, res) => {
  const url = new URL(req.url ?? '/', 'http://localhost');
  if (url.pathname === '/api/products') {
    const max = Number(url.searchParams.get('max') ?? Infinity);
    res.writeHead(200, { 'content-type': 'application/json' });
    res.end(JSON.stringify(products.filter((p) => p.price <= max)));
    return;
  }
  res.writeHead(404).end();
});

Тест встроенными средствами

Запускается node --test; fetch и проверки встроены.

server.test.ts
// запуск тестов и fetch тоже встроены
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { server } from './ex1.ru.ts';

test('фильтрует товары по цене', async () => {
  server.listen(0);
  const { port } = server.address() as { port: number };
  const res = await fetch(`http://localhost:${port}/api/products?max=10000`);
  assert.deepEqual(await res.json(), [{ sku: 'B-200', title: 'Сосновая полка', price: 5000 }]);
  server.close();
});

Импорт прайса

Встроенная SQLite и одна транзакция: повторный запуск обновляет цены, а не дублирует строки.

import.ts
// импорт прайса: встроенная SQLite, одна транзакция, без зависимостей
import { DatabaseSync } from 'node:sqlite';
import { readFileSync } from 'node:fs';

const db = new DatabaseSync('shop.db');
db.exec('CREATE TABLE IF NOT EXISTS prices (sku TEXT PRIMARY KEY, price INTEGER NOT NULL) STRICT');

const rows = readFileSync('prices.csv', 'utf8').trim().split('\n').slice(1);
const upsert = db.prepare(
  'INSERT INTO prices (sku, price) VALUES (?, ?) ON CONFLICT (sku) DO UPDATE SET price = excluded.price',
);

db.exec('BEGIN');
for (const row of rows) {
  const [sku, price] = row.split(',');
  upsert.run(sku!, Number(price));
}
db.exec('COMMIT');

const { n } = db.prepare('SELECT count(*) AS n FROM prices').get() as { n: number };
console.log(n); // 2 — повторный импорт обновляет цены, а не дублирует строки

Vite для сайта с серверной отрисовкой

Сборка даёт файлы с хешами и манифест — бэкенд подключает нужную версию.

vite.config.ts
import { defineConfig } from 'vite';

// Vite собирает скрипты и стили для сайта с серверной отрисовкой (PHP, Go)
export default defineConfig({
  build: {
    outDir: 'public/build',
    manifest: true, // manifest.json: какой файл с хешем подключить на странице
    rolldownOptions: {
      input: ['src/main.ts', 'src/style.css'],
    },
  },
});

Вопросы о Node.js и Vite

Что такое Node.js простыми словами?

Программа, которая выполняет JavaScript вне браузера — на сервере, в скриптах и в инструментах разработчика.

Зачем нужен Vite?

Чтобы разрабатывать с мгновенным обновлением в браузере и собирать компактные файлы для продакшена.

Нужен ли Node.js сайту на PHP?

Только для сборки скриптов и стилей; на рабочем сервере Node.js не работает.

Node.js, Deno или Bun?

Node.js самый зрелый и совместимый. Deno и Bun местами быстрее и запускают TypeScript из коробки, но моложе.

Какую версию Node.js использовать?

Актуальную LTS — чётную версию с поддержкой 30 месяцев.

Может ли Node.js запускать TypeScript без сборки?

Да, свежие версии стирают типы на лету; сами типы проверяет отдельно tsc.

Vite или webpack?

Для новых проектов — Vite: быстрее в разработке и проще в настройке. webpack остаётся во многих существующих проектах.

Где размещать сервер на Node.js?

На VPS под systemd или на платформе; виртуальный хостинг обычно не держит долгоживущие процессы.

Форма

Node.js
и Vite

Использую Node.js и Vite для сборки, сервисов и скриптов: быстрая сборка фронтенда для сайтов с серверной отрисовкой, небольшие API, импорт и автоматизация. Расскажите о задаче — отвечу в течение рабочего дня.

Или пишите на [email protected]