Node.js — это не язык программирования и не фреймворк, а автономная среда выполнения (runtime environment) JavaScript, построенная поверх высокопроизводительного движка Google V8, системной библиотеки асинхронного ввода-вывода libuv и слоя низкоуровневых биндингов C++. В отличие от классических серверов на базе многопоточной модели (Apache HTTP Server, где каждый входящий сокет привязывается к выделенному потоку ОС), архитектура Node.js изначально спроектирована вокруг однопоточного цикла событий (Non-blocking I/O Event Loop).
В 2026 году Node.js 24 LTS представляет собой зрелую серверную платформу с нативной поддержкой современных стандартов ECMAScript, модулей ESM, встроенных утилит тестирования, валидации типов и управления безопасностью через Permissions Model.
Главный поток процесса выполняет один стек вызовов JavaScript в изолированном контексте V8 Isolate. Любые длительные дисковые или сетевые операции вытесняются в системные механизмы мультиплексирования ввода-вывода (epoll в Linux, kqueue в macOS, IOCP в Windows) либо в системный пул потоков libuv (uv_threadpool_t). Это позволяет серверу удерживать десятки тысяч одновременных соединений при минимальном потреблении оперативной памяти.
В браузере среда выполнения жестко ограничена песочницей вкладки: JavaScript управляет DOM-деревом, реагирует на пользовательский ввод и не имеет прямого доступа к файловой системе, сетевым сокетам и памяти хост-машины. В среде Node.js глобальный контекст вместо объекта window предоставляет объект globalThis (исторически алиас к global), в котором отсутствуют document, HTMLElement или localStorage, но доступны низкоуровневые серверные примитивы: структуры управления процессом process, бинарные буферы Buffer и доступ к системным API операционной системы.
+-----------------------------------------------------------------------+
| Ваш код (JavaScript / TypeScript) |
+-----------------------------------------------------------------------+
| Node.js Core API (node:fs, node:http) |
+----------------------------------+------------------------------------+
| Google V8 Engine | Node.js C++ Bindings |
| - Парсер AST | - OpenSSL (Криптография, TLS) |
| - Байткод Ignition | - llhttp (Парсинг HTTP/1.1) |
| - JIT-компилятор TurboFan | - c-ares (Асинхронный DNS) |
+----------------------------------+------------------------------------+
| libuv |
| - Event Loop (Цикл событий) |
| - Worker Threadpool (Дефолтно 4 потока для диска и DNS) |
| - Epoll (Linux) / Kqueue (macOS) / IOCP (Windows) |
+-----------------------------------------------------------------------+
| Ядро операционной системы (Syscalls) |
+-----------------------------------------------------------------------+Запуск бинарника `node`, инициализация OpenSSL, парсинг системных аргументов и флагов CLI (`--max-old-space-size`, `--env-file`).
Выделение управляемой кучи (Heap), регистрация встроенных прототипов и внедрение глобального объекта `globalThis` с примитивами `process`, `Buffer`.
Интерпретатор Ignition генерирует байткод из файла `index.js`, стек вызовов исполняет верхнеуровневый синхронный код.
Если в очереди остаются активные хэндлеры (таймеры, открытые сетевые сокеты, файловые дескрипторы), рантайм передает управление Event Loop.
При исчерпании активных хэндлеров срабатывает событие `beforeExit`, затем `exit`, освобождается память V8 и закрывается процесс ОС с кодом 0.
При попытке выполнить код `const width = window.innerWidth;` внутри скрипта `index.js` под управлением Node.js 24 рантайм аварийно завершится с ошибкой ReferenceError: window is not defined. Какова фундаментальная архитектурная причина этого?
Buffer и стримов node:stream позволяет трансформировать гигабайты логов и медиафайлов с фиксированным объемом потребления RAM (менее 50 МБ).Движок Google V8 не использует предварительную компиляцию (AOT) до старта приложения. Процесс компиляции происходит динамически (JIT, Just-In-Time) по двухступенчатому конвейеру:
Преобразование строкового кода JavaScript в структурированное дерево абстрактного синтаксиса с лексической проверкой.
Синтаксические ошибки бросаются до фактического запуска инструкций.
Трансляция AST в компактный регистровый байткод V8 и немедленный запуск в виртуальной машине.
Минимальный Time-to-First-Byte выполнения.
Сбор статистики о структурах объектов (Hidden Classes / Shapes) и мономорфных типах аргументов.
Мономорфный код компилируется без динамических проверок.
Агрессивный инлайнинг функций, удаление лишних аллокаций памяти и генерация ассемблерных инструкций CPU.
При полиморфизме типов происходит аварийный откат (Deopt) в Ignition.
В спецификации ECMAScript введен унифицированный доступ к корню контекста — объект globalThis. В Node.js globalThis === global.
import v8 from 'node:v8';
// 1. Проверка идентичности глобального контекста
console.log('Is globalThis equal to global?', globalThis === global); // true
// 2. Инспекция хост-объектов Node.js
console.log('Platform:', process.platform); // 'linux', 'darwin' или 'win32'
console.log('Node.js Architecture:', process.arch); // 'x64' или 'arm64'
console.log('Node.js Version:', process.version); // 'v24.x.x'
console.log('Process PID:', process.pid);
// 3. Выделение непрерывного сегмента бинарной памяти вне кучи V8 (C++ Heap)
const rawBuffer = Buffer.alloc(16);
rawBuffer.writeUInt32BE(0xDEADBEEF, 0);
console.log('Binary Buffer Slice:', rawBuffer.subarray(0, 4));
// 4. Метрики управляемой памяти кучи (V8 Heap Statistics)
const heapStats = v8.getHeapStatistics();
console.log('Heap Size Limit (MB):', (heapStats.heap_size_limit / 1024 / 1024).toFixed(2));
console.log('Used Heap Size (MB):', (heapStats.used_heap_size / 1024 / 1024).toFixed(2));При запуске команды в терминале:
node --max-old-space-size=4096 --env-file=.env index.js--max-old-space-size=4096 резервирует предел кучи до 4 ГБ) и загружает переменные окружения напрямую в process.env.package.json.Функция calculateTotal(order) обрабатывает миллионы элементов в цикле. В 99% случаев в нее передаются объекты вида { id: number, price: number }. Внезапно в одном из вызовов передается объект { id: number, price: '100' } (цена передана строкой). Что произойдет на уровне движка V8?
Поскольку JavaScript-код выполняется в единственном главном потоке, синхронные циклы, парсинг гигантских JSON-файлов размером в сотни мегабайт через JSON.parse() или вызов синхронных криптографических функций (crypto.pbkdf2Sync) полностью замораживают цикл событий. В этот момент сервер не может принять ни одного нового TCP-соединения. Для тяжелых вычислительных задач всегда используйте пул потоков worker_threads или дочерние процессы node:child_process.
Попытка обратиться к window, document или navigator на этапе рендеринга серверных компонентов (RSC) или при старте Node.js вызывает ReferenceError. В серверном коде необходимо использовать проверку typeof window !== 'undefined' либо выносить клиентский код в соответствующие хуки жизненного цикла (useEffect).
Добавление данных в globalThis.myCache = new Map() приводит к тому, что объекты в этом словаре никогда не будут удалены сборщиком мусора V8 (GC Root reference). В долгоживущем серверном процессе куча будет непрерывно расти вплоть до достижения предела heap_size_limit, после чего процесс завершится с фатальной ошибкой JavaScript heap out of memory.