Node.js – вторая по популярности программная платформа после Python. В основном ее используют для создания веб-серверов, хотя технически платформа позволяет установить пакеты и запустить их практически на любых устройствах. Возможно, популярность Node в том числе обусловлена тем, что для разработки приложений используется язык JavaScript – фактически единственный язык фронтендеров, и последние с помощью Node.js получают возможность «выйти за рамки» браузеров создавать приложения для серверов или изолированных устройств. Ниже мы предоставим обзор Node.js, но сразу предупреждаем: полный гайд для начинающий по Node.js занимает порядка 150 страниц, поэтому мы не будем вдаваться в подробности, наша цель – дать вам краткое представление о технологии.
Начнем с истоков – с JavaScript. JS – это язык программирования, который создавался специально для того, чтобы расширить возможности браузеров по отображению информации: переходы, интерактивные кнопки, сменяющиеся картинки и другие красивые вещи на страницах сайтов в основном написаны на JS. Со своей задачей JS прекрасно справлялся, и на рынке он был единственным языком, не требующим для своего изучения пары лет – поэтому довольно быстро JavaScript стал основным (и практически единственным) языком для создания фронтэнда.
Но на этом, собственно, все. Дело в том, что язык программирования – это просто соглашение о том, как писать команды, без движка, исполняющего написанные команды, язык не представляет собой никакой ценности. JavaScript исполнялся движками браузеров, поэтому за пределами браузеров его было сложно как-то применить – скорее всего, какие-то самописные инструменты разработки под JS вне браузеров существовали, но большого применения они не нашли.
Все изменилось, когда Google выпустила новый движок для своего браузера Chrome – V8. У V8 было много отличительных особенностей, но в контексте Node.js нас интересует одно конкретное: движок V8 мог работать отдельно от браузера. JavaScript работает в браузерном движке, браузерный движок V8 можно поставить вне браузера – вопрос создания среды разработки на JavaScript, выходящей за рамки браузера, стал вопросом времени. Так 27 мая 2009 года Node.js и появился – изначально как фреймворк + среда выполнения для серверов, а потом и как среда выполнения для любых устройств.
По сути своей Node.js работает так же, как и JVM (Java Virtual Machine). Вы пишете код, после чего c помощью NPM (менеджера пакетов) отдаете его и все необходимые зависимости движку V8 – который, в свою очередь, переводит код в машинный. Этот машинный код впоследствии может быть запущен на любом устройстве, на котором установлен V8.
В качестве сравнения мы привели JVM, но по факту так работают многие кросс-платформенные языки программирования. Что важно понять: этот механизм позволяет запускать код JavaScript где угодно, потому что за низкоуровневое исполнение кода отвечает не разработчик, а движок V8.
Есть 3 основные причины, по которым Node.js так популярен:
Начнем с языка – JavaScript. JS – довольно легкий язык в плане освоения, кроме того, он используется при разработке фронтэнда. Когда появился Node.js, многие фронтэндеры поняли, что теперь они могут писать код не только для фронтэнда, но для бэкенда – то есть появилась перспектива стать фулстэк-разработчиком, которому существенно больше платят. Поскольку фронтэндеров – много, Node.js уже при появлении обзавелся большой базой разработчиков – вот и первая причина популярности.
Вторая, более техническая часть – event-driven модель работы и «встроенная» асинхронность. Большинство языков программирования рассчитано на синхронную работу кода – строки кода выполняются одна за другой, для того, чтобы «активировать асинхронность», вам нужно сделать запрос с помощью специальных инструментов. Для JavaScript эта схема работала бы очень плохо (ввиду того, что команда запроса данных по сети исполняется в миллионы раз медленнее, чем команда вычисления чего-либо на процессоре), поэтому в язык изначально была положена event-driven модель вместе с асинхронностью: команды исполняются по мере поступления и в таком порядке, чтобы какой-нибудь ожидающий процесс не блокировал весь поток. Эта модель языка, унаследованная в Node.js, оказалась очень выгодной для серверных приложений: им как раз обычно не хватает оптимизированной реакции на события и встроенных инструментов неблокирующего ввода/вывода. Все это в сумме приводит к тому, что серверные приложения на Node.js крайне быстро работают и не требуют при этом больших усилий в разработке.
Наконец, третья причина востребованности – npm. Npm – это утилита, которая позволяет устанавливать пакеты, то есть готовые решения от сторонних разработчиков. Поскольку Node.js – платформа с открытым исходным кодом, большинство готовых решений лежат в открытом доступе и распространяются бесплатно. Кроме того, этих пакетов – крайне много, и иногда можно решить сложную задачу в несколько команд npm и пару строк кода – установить npm, установить пакеты, кодом связать готовые решения.
Node.js – не панацея от всех бед, как и у любой другой технологии, у Ноды есть свои недостатки – вот они:
99.9% – это серверная сторона приложений. Node.js используется там, где нужна скорость, в том числе – в приложениях с мгновенным обменом информацией и приложениях, в которых нужно работать с десятками тысяч пользователей одновременно.
Для начала – вкратце о версиях Node.js: четные – LTS (long time support), нечетные – экспериментальные. Вам необходимо установить последнюю LTS-версию, экспериментальную устанавливать не стоит – ваше обучение может омрачиться багами, которые пофиксят еще очень нескоро.
Если вы собираетесь установить Node.js на Windows, то вам нужно посетить официальный сайт Node, скачать установщик, запустить его и следовать инструкциям. На Linux Node.js можно установить с помощью команд:
curl -fsSL https://fnm.vercel.app/install | bash
source ~/.bashrc
fnm use --install-if-missing 22
node -v # should print 'v22.11.0'
npm -v # should print '10.9.0'
На Mac OS Node.js можно установить командой:
brew install node@22
Проверить установку можно командами:
node -v
npm -v
Первая покажет версию Node.js, вторая покажет версию npm.
Необязательный шаг настройки – установить IDE, с ним работать будет легче. Самый предпочтительный IDE сейчас – Visual Studio.
Что же касается самой настройки Node.js – вам нужно только инициализировать проект. Для этого создайте где-нибудь каталог, в котором будут лежать файлы вашего проекта, перейдите в этот каталог в терминале и введите:
npm init
Это создаст файл package.json, который и является результатом инициализации проекта.
Все готово – создайте файл с расширением .js и пишите в нем код, код можно будет запустить командой «node [имя_файла]» в терминале. Например – создайте файл «index.js» и напишите такой скрипт:
console.log('Hello, Node.js!');
Когда вы наберете «node index.js», консоль выдаст вам результат исполнения – приветствие.
Создание нового сервера:
// server.mjs
import { createServer } from 'node:http';
const server = createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World!\n');
});
// starts a simple http server locally on port 3000
server.listen(3000, '127.0.0.1', () => {
console.log('Listening on 127.0.0.1:3000');
});
// run with `node server.mjs`
Создание пайплайна для чтения/передачи потока данных:
// streams.mjs
import { pipeline } from 'node:stream/promises';
import { createReadStream, createWriteStream } from 'node:fs';
import { createGzip } from 'node:zlib';
// ensure you have a `package.json` file for this test!
await pipeline
(
createReadStream('package.json'),
createGzip(),
createWriteStream('package.json.gz')
);
// run with `node streams.mjs`
Работа с тредами:
// threads.mjs
import { Worker, isMainThread,
workerData, parentPort } from 'node:worker_threads';
if (isMainThread) {
const data = 'some data';
const worker = new Worker(import.meta.filename, { workerData: data });
worker.on('message', msg => console.log('Reply from Thread:', msg));
} else {
const source = workerData;
parentPort.postMessage(btoa(source.toUpperCase()));
}
// run with `node threads.mjs`
Поскольку Node.js – серверная (в основном) технология, ей приходится конкурировать с другими серверными решениями:
Тезисно: