logo
Ещё

Node.js – что это и почему он популярен

Node.js – вторая по популярности программная платформа после Python. В основном ее используют для создания веб-серверов, хотя технически платформа позволяет установить пакеты и запустить их практически на любых устройствах. Возможно, популярность Node в том числе обусловлена тем, что для разработки приложений используется язык JavaScript – фактически единственный язык фронтендеров, и последние с помощью Node.js получают возможность «выйти за рамки» браузеров создавать приложения для серверов или изолированных устройств. Ниже мы предоставим обзор Node.js, но сразу предупреждаем: полный гайд для начинающий по Node.js занимает порядка 150 страниц, поэтому мы не будем вдаваться в подробности, наша цель – дать вам краткое представление о технологии.

Node.js – что это такое

Начнем с истоков – с 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 так популярен:

  1. JavaScript.
  2. Event-driven модель.
  3. Пакеты

Начнем с языка – JavaScript. JS – довольно легкий язык в плане освоения, кроме того, он используется при разработке фронтэнда. Когда появился Node.js, многие фронтэндеры поняли, что теперь они могут писать код не только для фронтэнда, но для бэкенда – то есть появилась перспектива стать фулстэк-разработчиком, которому существенно больше платят. Поскольку фронтэндеров – много, Node.js уже при появлении обзавелся большой базой разработчиков – вот и первая причина популярности.

Вторая, более техническая часть – event-driven модель работы и «встроенная» асинхронность. Большинство языков программирования рассчитано на синхронную работу кода – строки кода выполняются одна за другой, для того, чтобы «активировать асинхронность», вам нужно сделать запрос с помощью специальных инструментов. Для JavaScript эта схема работала бы очень плохо (ввиду того, что команда запроса данных по сети исполняется в миллионы раз медленнее, чем команда вычисления чего-либо на процессоре), поэтому в язык изначально была положена event-driven модель вместе с асинхронностью: команды исполняются по мере поступления и в таком порядке, чтобы какой-нибудь ожидающий процесс не блокировал весь поток. Эта модель языка, унаследованная в Node.js, оказалась очень выгодной для серверных приложений: им как раз обычно не хватает оптимизированной реакции на события и встроенных инструментов неблокирующего ввода/вывода. Все это в сумме приводит к тому, что серверные приложения на Node.js крайне быстро работают и не требуют при этом больших усилий в разработке.

Наконец, третья причина востребованности – npm. Npm – это утилита, которая позволяет устанавливать пакеты, то есть готовые решения от сторонних разработчиков. Поскольку Node.js – платформа с открытым исходным кодом, большинство готовых решений лежат в открытом доступе и распространяются бесплатно. Кроме того, этих пакетов – крайне много, и иногда можно решить сложную задачу в несколько команд npm и пару строк кода – установить npm, установить пакеты, кодом связать готовые решения.

Минусы Node.js

Node.js – не панацея от всех бед, как и у любой другой технологии, у Ноды есть свои недостатки – вот они:

  • Однопоточность. Несмотря на асинхронность, Node.js утилизирует только одно ядро процессора – это делается с помощью сложного планировщика задач. Однопоточность не является минусом, пока мы обрабатываем тысячи мелких задач, но если Node.js получит на вход одну крупную задачу – она забьет весь поток, что по «симптомам» очень похоже на блокирование ввода/вывода. Эту проблему можно обойти специальными библиотеками, но с ними нужно уметь работать.
  • Нестабильные библиотеки, неразвитость некоторых областей. Обе проблемы исходят из того, что пакеты npm в основном разрабатываются «всем миром», то есть нет какой-то централизации – из-за этого разные версии пакета могут существенно отличаться друг от друга, а менее востребованные пакеты просто некому развивать.
  • Легко написать плохой код. Асинхронность, заложенная в Node.js, требует своих жертв – для того, чтобы ее правильно использовать, нужно использовать колбэки/промисы/async-await. Эти инструменты языка нужно хорошо знать, потому что те же колбэки при неправильном использовании приведут к «callback hell», и поддерживать код станет очень сложно.

Где используется Node.js

99.9% – это серверная сторона приложений. Node.js используется там, где нужна скорость, в том числе – в приложениях с мгновенным обменом информацией и приложениях, в которых нужно работать с десятками тысяч пользователей одновременно.

Установка 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 – серверная (в основном) технология, ей приходится конкурировать с другими серверными решениями:

  • Python + фреймворки Django или Flask. Код пишется проще, фреймворки – более гибкие. Единственная существенная проблема – эти фреймворки работают медленнее, чем Node.js, особенно если мы говорим про большое количество одновременных запросов.
  • Ruby + фреймворк Ruby on Rails. Код на RoR пишется и поддерживается довольно просто, но сам по себе язык – непростой, да и популярность еще с каждым годом все больше падает, поэтому найти хорошую работу будет проблематично.
  • Java с фреймворком Spring. Мощный и многофункциональный фреймворк. Основной минус – крайне высокий порог входа, освоить и Java, и Spring будет непросто.
  • PHP. Язык, полностью заточенный под бэкенд-разработку. Самый большой минус: PHP – не «модный» язык, за ним закрепилась дурная слава медленного и непонятного. На практике же – довольно быстрый (особенно в последних версиях) и вполне адекватный язык, на котором уже написано множество решений.
  • Golang. Еще один язык для бэкенд-разработки. С каждым месяцем набирает все больше популярности из-за своей скорости и гибкости. Не самый простой в изучении, поскольку наследует многие практики из C++.

Кратко о главном

Тезисно:

  • Node.js – платформа для разработки на языке JavaScript. Технически Node.js может исполнять код на любых устройствах, в 99.9% случаев мы говорим именно о бэкенд разработке.
  • Node.js работает по такому же принципу, как Java – код переводится в машинный виртуальной машиной.
  • Основные преимущества Node.js – event-driven модель, асинхронность, большой набор готовых пакетов и легкость языка JavaScript.
  • Если JavaScript вам не нравится, можете рассмотреть популярные альтернативы: Python, Ruby, Java, PHP, Golang.