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 — везде, где нужно собрать фронтенд.
-
01
Сборка фронтенда
Скрипты и стили сжаты, подписаны хешем и разбиты на части.
-
02
API и сервисы
Бэкенд, который делит типы с интерфейсом.
-
03
Реальное время
Чаты, уведомления и живые дашборды по WebSocket.
-
04
Серверная отрисовка React и Vue
Страницы приходят с сервера готовыми, а потом оживают в браузере.
-
05
Telegram-боты
Боты и бэкенд Mini Apps на одном языке с интерфейсом.
-
06
Скрипты и автоматизация
Импорт, отчёты и обработка данных по расписанию.
-
07
Инструменты разработчика
Линтеры, форматтеры и тесты для JavaScript работают на Node.js.
-
08
Настольные приложения
Electron объединяет Node.js и движок браузера.
Плюсы и минусы 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.js | Deno | Bun | PHP | Go |
|---|---|---|---|---|---|
| Язык | 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 и частые ошибки
-
Долгое вычисление в запросе
Обработка картинок или разбор огромного файла в основном потоке останавливает все остальные запросы.
-
Необработанные ошибки
Отклонённый промис без обработчика может уронить весь процесс.
-
Зависимости без контроля
Нет файла блокировки и проверки — и новая версия чужого пакета меняет ваш проект.
-
Секреты в сборке
Переменные с префиксом для клиента попадают в браузер — ключи должны оставаться на сервере.
-
Старая версия Node.js
Версии без поддержки не получают исправлений безопасности.
-
Процесс без присмотра
Если сервер после сбоя никто не перезапускает, сайт лежит, пока кто-нибудь не заметит.
8 советов по Node.js и Vite
-
01
Версия LTS
Продакшен работает на актуальной LTS; нечётные версии — для экспериментов.
-
02
Сначала встроенное
fetch,
node:test,node:sqliteи--env-file— прежде чем тянуться за пакетом. -
03
Файл блокировки в репозитории
npm ciставит ровно те версии, которые проверялись. -
04
Проверяйте зависимости
npm auditи меньше пакетов — каждая зависимость это чужой код в вашем проекте. -
05
Тяжёлое — в отдельные потоки
worker_threadsили очередь держат цикл событий свободным. -
06
Присмотр за процессом
systemd или PM2 перезапускают сервер после сбоя и при перезагрузке.
-
07
Манифест Vite для серверных сайтов
Бэкенд читает
manifest.jsonи подключает файлы с хешами — кеширование без устаревших версий. -
08
Измеряйте сборку
Проверяйте, сколько каждая зависимость добавляет к объёму, который скачивает пользователь.
Как выглядят Node.js и Vite: 4 примера
API и тест к нему только на встроенных модулях, импорт прайса во встроенную SQLite и сборка Vite для сайта с серверной отрисовкой. Запущены в Node.js 22 и Vite 8, проверены TypeScript 7.
API без пакетов
Сервер на node:http — нечего устанавливать и нечего обновлять.
// 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 и проверки встроены.
// запуск тестов и 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 и одна транзакция: повторный запуск обновляет цены, а не дублирует строки.
// импорт прайса: встроенная 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 для сайта с серверной отрисовкой
Сборка даёт файлы с хешами и манифест — бэкенд подключает нужную версию.
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, импорт и автоматизация. Расскажите о задаче — отвечу в течение рабочего дня.