Пошук уроків, статей та іншого контенту
Як JavaScript, мова браузера, стала мовою серверів — і чого в Node.js немає порівняно з браузером.
До 2009 року JavaScript виконувався винятково в браузері — двигун (V8 у Chrome, SpiderMonkey у Firefox) був вбудований у браузер і не існував як окрема, самостійна програма. Node.js узяв двигун V8 (той самий, що в Chrome) і запустив його поза браузером, додавши доступ до файлової системи, мережі та інших можливостей операційної системи, яких у браузера з міркувань безпеки немає.
Node.js — це не нова мова й не новий двигун JavaScript, а середовище виконання (runtime), побудоване на двох частинах: V8 — компілює й виконує сам JavaScript-код, libuv — бібліотека на C, що надає доступ до файлової системи, мережі, таймерів і реалізує неблокувальну модель вводу-виводу, на якій побудований Event Loop Node.js (детально — в окремому уроці цього модуля).
Синтаксис мови — змінні, функції, класи, async/await, методи масивів — той самий, що й у браузері (курс JavaScript уже його покриває повністю). Різниця — у доступному глобальному оточенні:
Немає window, document, DOM — Node.js не показує сторінки, тому браузерних API для роботи з інтерфейсом просто не існує.
Є доступ до файлової системи, мережевих сокетів, змінних середовища операційної системи — того, що браузер навмисно забороняє звичайним вебсторінкам з міркувань безпеки.
Глобальний об'єкт називається global, а не window, і Node.js додає власні глобальні змінні — process, __dirname (у CommonJS), Buffer.
// У браузері:
console.log(window.location.href);
// У Node.js — window не існує, натомість є доступ до файлової системи:
const fs = require("node:fs");
const content = fs.readFileSync("./data.txt", "utf-8");Головна практична перевага — одна мова для фронтенду й бекенду в одній команді чи навіть в одному розробнику: спільні типи даних, спільні бібліотеки валідації, менше перемикання контексту між «мовою браузера» і «мовою сервера». Крім того, неблокувальна модель вводу-виводу Node.js добре підходить для навантажень із великою кількістю паралельних, але переважно недовгих операцій — типових HTTP-запитів, звернень до бази даних.
Node.js — однопотоковий для виконання самого JavaScript-коду (детально в уроці про Event Loop): важкі, синхронні обчислення (складна математика, стиснення великих файлів на льоту) блокують обробку інших запитів, поки не завершаться. Це прицільна модель для I/O-навантаженого коду (запити до мережі, бази даних, файлів), а не для обчислювально важких задач.
Очікувати, що весь браузерний код (window, document, localStorage) запрацює в Node.js без змін — глобальне оточення принципово інше.
Вважати Node.js окремою мовою програмування — це середовище виконання того самого JavaScript, а не нова мова.
Виконувати важкі синхронні обчислення в звичайному Node.js-сервері, не усвідомлюючи, що це блокує обробку всіх інших вхідних запитів, поки обчислення не завершиться.
Node.js — середовище виконання JavaScript поза браузером, побудоване на движку V8 і бібліотеці libuv, що додає доступ до файлової системи, мережі та інших можливостей ОС замість браузерних API на кшталт DOM. Мова та сама, що в браузері, — глобальне оточення інше. Модель Node.js добре підходить для I/O-навантажених задач (мережа, файли, база даних) і погано — для важких синхронних обчислень, які блокують єдиний потік виконання JavaScript-коду.