1. Node.js: что это вообще такое?
Если коротко: Node.js — это среда выполнения JavaScript вне браузера. Она позволяет запускать JS-код где угодно: на сервере, на вашем компьютере, в облаке, на Raspberry Pi, даже на холодильнике (если тот достаточно умен). Но давайте разберёмся подробнее.
Историческая справка
Когда-то JavaScript был строго «браузерным» языком. Он мог только менять кнопочки на сайте, валидировать формы и, максимум, показывать всплывающие окна. Но в 2009 году Райан Дал (Ryan Dahl) решил: «А почему бы не использовать JavaScript для серверных задач?» Так появился Node.js.
Node.js построен на движке V8 — это тот же движок, который «крутит» JS в Google Chrome. Но Node.js — это не браузер. Это самостоятельная программа, которая умеет запускать JS-код, работать с файлами, сетью, базами данных, но… не умеет показывать вам кнопочки и DOM.
Краткое определение
Node.js — это среда выполнения JavaScript, построенная на движке V8, позволяющая запускать JS-код вне браузера.
2. Почему Node.js стал таким популярным?
- Один язык для всего. Можно писать и фронтенд, и бэкенд на одном языке — JavaScript. Это мечта ленивого программиста: не нужно учить два языка, чтобы сделать сайт от и до.
- Асинхронность и событийная модель. Node.js идеально подходит для серверов, которые обрабатывают много одновременных запросов (например, чаты, игры, API).
- Скорость. Движок V8 очень быстрый, а Node.js не тратит ресурсы на отрисовку DOM.
- npm — гигантский склад библиотек. Самый крупный репозиторий модулей в мире. Всё, что только можно придумать, уже кто-то написал.
- Кроссплатформенность. Node.js одинаково работает на Windows, Linux, macOS.
3. Как устроен Node.js: архитектура и философия
V8 + C++ = Node.js
Node.js берёт движок V8 (он на C++), добавляет к нему «обвязку» — модули для работы с файлами, сетью, процессами, и предоставляет вам интерфейс на JavaScript. То есть, когда вы пишете fs.readFile(), внутри происходит магия: ваш JS вызывает C++-код, который реально читает файл.
Событийно-ориентированная (event-driven) модель
Node.js не ждёт, когда файл прочитается или запрос к базе завершится. Он просто говорит: «Окей, я начал читать файл, а пока займусь чем-то ещё. Когда будет готово — дёрните меня обратно». Это называется асинхронность и event loop (цикл событий).
Схема работы event loop
+---------------------+
| Ваш JS-код |
+---------------------+
|
v
+---------------------+
| Node.js (V8) |
+---------------------+
|
v
+---------------------+
| Event Loop | <---+
+---------------------+ |
| |
v |
+---------------------+ |
| Системные вызовы |-----+
| (файлы, сеть и т.д.)|
+---------------------+
- Ваш код отдаёт задачу (например, прочитать файл).
- Node.js не блокируется, а продолжает выполнять другие задачи.
- Когда файл прочитан, event loop сообщает вашему коду: «Готово!»
Почему это круто?
В старых языках (например, PHP, Python без async, Java) сервер часто «зависает» на каждом запросе к базе или файлу. В Node.js сервер может обслуживать тысячи клиентов одновременно, не блокируясь на долгих операциях.
4. Node.js vs Браузер: что общего и чем они отличаются?
Пора сравнить Node.js и браузер — ведь оба запускают JavaScript, но делают это совершенно по-разному.
Что у них общего?
- Язык. Синтаксис JS одинаковый (let, const, функции, объекты, стрелочные функции).
- Движок V8. Если у вас Chrome и Node.js — внутри оба используют V8.
- Базовые конструкции:
- Переменные, циклы, условия, функции.
- Массивы, объекты, строки, числа.
- Базовые методы типа Array.map, String.split и т.д.
В чём принципиальные отличия?
| Браузер | Node.js | |
|---|---|---|
| Где работает | На компьютере пользователя | На сервере, в терминале, в облаке |
| Доступ к DOM | Есть (, , ) |
Нет (никакого DOM, только консоль) |
| Доступ к файлам | Нет (ради безопасности) | Есть (можно читать/писать файлы) |
| Сеть | Только HTTP-запросы (, ) |
TCP, UDP, HTTP, сокеты и др. |
| Модули | Нет (до ES6 import/export) | Есть (, , npm) |
| Окружение | Ограничено песочницей браузера | Почти полный доступ к ОС |
| UI | HTML, CSS, Canvas, WebGL | Только вывод в консоль (или API) |
| API | , , |
, , , , |
Пример: что есть в браузере, но нет в Node.js
console.log(window); // В Node.js: ReferenceError: window is not defined
alert('Hello!'); // В Node.js: ReferenceError: alert is not defined
document.body; // В Node.js: ReferenceError: document is not defined
Пример: что есть в Node.js, но нет в браузере
const fs = require('fs');
fs.readFile('text.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
// В браузере: Uncaught ReferenceError: require is not defined
Аналогия
- Браузер — это как театр: вы можете только смотреть спектакль, максимум — аплодировать.
- Node.js — это как закулисье: вы можете управлять светом, сценой, даже менять сценарий или строить сам театр.
5. Где используется Node.js? Примеры и кейсы
Node.js — это не просто «сервер для сайтов». Он используется в огромном количестве задач:
- Серверы и API — Express.js, Koa, Fastify.
- Чаты и онлайн-игры — благодаря асинхронности и WebSocket.
- Инструменты для фронтенда — Webpack, Gulp, ESLint, Prettier, Create React App.
- Автоматизация — скрипты для сборки, тестирования, деплоя.
- Работа с файлами — генерация отчетов, обработка данных.
- Интернет вещей (IoT) — управление устройствами через JS.
- CLI-приложения — например, npm, npx, gitpod и другие.
Пример: запуск простого JS-файла в Node.js
Создайте файл hello.js:
console.log('Привет, Node.js!');
В терминале:
node hello.js
Вывод:
Привет, Node.js!
6. Node.js глазами фронтендера: зачем это мне?
- Автоматизация рутины: Сборка, минификация, тесты, запуск локального сервера — всё это делается через Node.js.
- Разработка серверной части: Можно писать серверы, API и даже целые приложения на одном языке.
- Полный стек JS: Вы можете быть Fullstack-разработчиком, не выходя за пределы JavaScript.
- Работа с файлами и сетью: Генерируйте отчёты, парсите логи, делайте ботов — всё на JS.
- Модули и npm: Используйте миллионы библиотек, не изобретая велосипед.
Как запускается Node.js-приложение?
- Устанавливаете Node.js (про это — в следующей лекции).
- Пишете JS-файл (например, app.js).
- Запускаете его через терминал:
node app.js
Всё! Ваш код выполняется вне браузера, может читать файлы, слушать порты, делать запросы, и никто не скажет ему: «Эй, ты не можешь это делать!»
7. Типичные ошибки новичков при знакомстве с Node.js
Ошибка №1: Ожидание DOM и браузерных API.
Многие пытаются использовать document, window, alert — а их в Node.js нет. Вместо этого используйте консоль (console.log) и модули Node.js.
Ошибка №2: Не понимают, что такое require и import.
В браузере до недавнего времени не было модулей, а в Node.js они есть с самого начала. Здесь можно подключать модули (require('fs'), import ...), использовать npm.
Ошибка №3: Путают назначение Node.js и браузера.
Node.js — не для отрисовки интерфейса, а для серверных задач, автоматизации, работы с файлами и сетью.
Ошибка №4: Ожидание «окна» или визуального вывода.
Всё взаимодействие происходит через консоль, файлы, сеть — а не через окна, кнопки и формы.
Ошибка №5: Непонимание асинхронности.
В Node.js очень много кода работает асинхронно (через колбэки, промисы, async/await). Если вы думаете, что код будет идти строго сверху вниз, можно сильно удивиться!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ