Что такое Node.js и зачем ее изучать
Node.js — платформа с открытым исходным кодом для работы с JavaScript.
Анастасия Хамидулина
Автор статьи
9 июня 2022 в 19:24
JavaScript разработала компания Mozilla для интеграции клиент-браузерных скриптов. Этот язык программирования работал только в браузере пользователя, но в 2009 году появилась Node.js — платформа, позволяющая исполнять скрипты на сервере.
Для чего нужна Node.js
Node.js написана на С++ и основана на движке V8, который используют в браузере Chrome. Это программа-интерпретатор: позволяет расширить области применения JavaScript.
Ее изучают студенты курса Skypro «Веб-разработчик». А еще учатся писать чистый код и находить ошибки в чужом. За несколько месяцев осваивают профессию на уровне уверенных новичков и могут устроиться на работу по новой специальности сразу после окончания курса.
Node.js подходит для разработки серверных и десктоп-приложений. Ее используют и чтобы создавать RTA — веб-приложения, которые откликаются на действия пользователя в реальном времени. А еще для SPA — одностраничных веб-приложений. Одно из основных преимуществ Node.js в том, что приложения можно запускать на любой операционной системе.
Но чаще Node.js используют, чтобы разработать backend-часть сайта. То есть ту, которую не видит пользователь, но благодаря которой работают кнопки и функции сайта. Платформу на бэкенде применяют Netflix, Uber, eBay, Trello и прочие известные сервисы и компании.
Java-разработчик: новая работа через 11 месяцев
Получится, даже если у вас нет опыта в IT

Чем отличается от PHP и Python
Node.js обгоняет PHP, но уступает Python в популярности. В арсенале Node.js — пакетный менеджер npm и большое количество готовых библиотек и фреймворков под типовые задачи. Но Node.js заточена скорее под веб-разработку. Позволяет создавать сложные веб-приложения, обрабатывающие большое количество запросов.
Сферы, в которых используют Python, не ограничиваются веб-разработкой. Его также применяют:
- для машинного обучения;
- создания CLI-приложений, скриптов автоматизации;
- работы с анализом данных;
- создания десктоп-приложений и игр.
У Python тоже есть готовые библиотеки и фреймворки, которые можно найти и установить с помощью пакетного менеджера pip.
В том числе поэтому Python называют одним из самых простых для изучения языков программирования. Сделать это можно всего за несколько месяцев на курсе Skypro «Python-разработчик». Изучите необходимую теорию, закрепите знания на практике, соберете достойное портфолио и сможете найти новую работу еще до окончания курса.
На PHP работает примерно одна треть всех сайтов в сети. На нём написали множество CMS — систем управления контентом. Например, WordPress или Joomla, которые часто используют в русскоязычном сегменте интернета.
Его пакетный менеджер называют Composer. В нём тоже много различных библиотек и фреймворков, но меньше, чем у Node.js или Python.
Как установить
Процесс зависит от операционной системы. Чтобы установить на Windows, скачайте и запустите установочный пакет с официального сайта.
Чтобы установить на Linux или MacOS, воспользуйтесь встроенным в операционную систему менеджером пакетов:
brew — для MacOS;
Или соберите исходники программного обеспечения node и npm самостоятельно.
Рассмотрим компиляцию Node.js из исходников в среде Debian — дистрибутив Linux. Вам потребуются компилятор make, пакет wget для скачивания файлов из командной строки:
# установите зависимости sudo apt install make wget # скачайте и распакуйте архив с исходниками wget https://nodejs.org/dist/v16.15.0/node-v16.15.0.tar.gz tar -xvf node-v16.15.0.tar.gz # скомпилируйте программу cd node-v16.15.0/ ./configure make sudo make install
С чего начать изучать
В сети найдете видеоуроки, инструкции, переводы зарубежных материалов и русскоязычный контент.
✅ На medium.com опубликовали хороший перевод книги Node Hero. Из первой главы узнаете, что такое Node.js, как установить ее на компьютер и как начать работать. Далее приступите к реальной разработке.

Найдете полезные подсказки
✅ На nodejsdev.ru сделали подробное руководство по Node.js. В нём — работа с модулями и файлами, события, потоки, шаблоны.

Малая часть руководства
https://sky.pro/media/redaktory-dlya-javascript/
✅ На Stepik лежат видеокурсы, нужно только начальное знание JavaScript. На практике познакомитесь со всеми концепциями Node.js и напишете несколько приложений. Например, простую CLI-утилиту прогноза погоды и архитектурно сложное API.

✅ В телеграм-канале «Node.js — русскоговорящее сообщество» можно задать вопросы опытным разработчикам.
Пример использования
Начните с простого Hello, World! Создайте файл example1.js со следующим содержимым:
console.log("Hello, World!");
Запустите его в терминале с помощью команды node example1.js:
node example1.js Hello, World!
Сделайте сервер, который будет отвечать на запросы текстом Hello, World! Для этого создайте файл example2.js и напишите:
// Подключите библиотеку http var http = require('http'); // создайте сервер http .createServer(function (req, res) < // реализуйте функцию-обработчик res.writeHead(200, < 'Content-Type': 'text/html' >); res.end("Hello, World!"); >).listen(3000);
Запустите скрипт командой node example2.js и перейдите в браузере по адресу http://localhost:3000/. В окне увидите текст: Hello, World!
Если хотите отобразить заданный текст, улучшите пример до передачи текста в виде ключевого параметра адресной строки. Создайте файл example3.js, в нём напишите код:
// Кроме библиотеки http подключите библиотеку url, чтобы работать с параметрами var http = require('http'); var url = require('url'); http .createServer(function (req, res) < var queryObject = url.parse(req.url, true).query; // парсите url, получите словарь параметров res.writeHead(200, < 'Content-Type': 'text/html' >); res.end(queryObject['message']); // верните текст, полученный по ключу message >) .listen(3000);
С помощью библиотеки url получите аргументы адресной строки в виде словаря, переданные после знака вопроса. И в теле запроса верните текст аргумента message.
Запустите скрипт (node example3.js) и в браузере перейдите по адресу http://localhost:3000/?message=Hello,%20Node.js!
Сколько платят Node.js-разработчикам
Зарплата специалиста зависит от профессионального уровня. Новичкам (джунам) на хедхантере в вакансиях указывают от 40 000 ₽ до 70 000 ₽. Разработчики среднего уровня (мидлы) получают от 100 000 ₽. Старшие спецы (сеньоры) — от 250 000 ₽.
Начать карьеру можно с курса Skypro «Веб-разработчик». Изучите основы, закрепите знания на практике, поработаете в команде программистов. А центр карьеры поможет составить цепляющее резюме и подготовиться к собеседованиям, чтобы вы быстрее нашли работу по новой специальности.



Примеры вакансий на хедхантере
Сервис zarplan.com в апреле 2022 года проанализировал 673 вакансии и выделил среднюю зарплату: 238 511 ₽. При этом в десяти процентах предложений сумма была от 401 000 ₽.
Лидеры по уровню средней зарплаты — Москва, Казань, Калининград, Санкт-Петербург, Нижний Новгород.
Для чего нужен node js
Разработчик и преподаватель курсов Frontend, Full Stack
Senior Full-stack Developer, Transcenda

- Главная
- Блог
- Что это такое Node JS простыми словами
- 1 Node.js — что это?
- 2 Немного истории
- 3 Характеристики
- 3.1
- 3.2 Основные характеристики:
- 3.2.1 1️⃣ Реализовано на JavaScript
« Что такое node js, где используется и для чего он нужен? » , — самые часто задаваемые вопросы новичков, которые приходят в программирование, чтобы разрабатывать классные продукты с помощью популярного языка программирования Javascript. Но при чем здесь Node JS, почему он считается одной из самых популярных технологий в мире сегодня, в чем его плюсы и минусы и какие топовые мировые приложения были созданы, благодаря этой технологии? В этом материале мы ответим на все актуальные вопросы и расскажем все о Node JS.
Node.js — что это?

Node.js — это однопоточная кроссплатформенная среда выполнения с открытым исходным кодом и библиотека, которая используется для запуска веб-приложений, написанных на JavaScript, вне браузера клиента. Звучит немного сложно, правда?
Проще говоря, Node.js — это программная среда, которая позволяет запускать программы, написанные на языке Javascript, вне браузера. Исторически программы, написанные на Javascript, в отличие от других языков программирования, можно было запустить только в браузерах, которые имели специальный встроенный движок выполнения кода данного языка. Вне браузера Javascript, можно сказать, не работал.
При разработке Node.js за основу был взят движок выполнения JavaScript под названием V8, который был создан компанией Google и использовался в браузере Google Chrome. Так как после создания Node.js Javascript код можно запустить фактически в любой среде, с помощью этой библиотеки можно написать не только фронтенд, но и серверную часть веб-приложения.
Проще говоря, это означает, что целые сайты теперь могут работать с использованием единого «стека», что делает разработку и обслуживание гораздо более быстрой и легкой, позволяя сосредоточиться на достижении бизнес-целей проекта.
Node.js имеет открытый исходный код, поэтому работать с ним можно абсолютно бесплатно. Его и сегодня продолжает развивать и улучшать глобальное сообщество разработчиков.
Важно понимать, что Node.js на самом деле не фреймворк и не библиотека, как в случае с традиционным программным обеспечением, а среда выполнения. Он является легким, гибким и простым в развертывании, а все его функции помогут оптимизировать и ускорить ваше приложение.
Немного истории
Node.js был создан в 2009 году Райаном Далем. Даль критиковал ограничения, предлагаемые существующими на тот момент популярными веб-серверами. Ранее серверы с трудом обрабатывали большое количество одновременных соединений, а выполнение программы либо блокировало весь процесс, либо подразумевало необходимость использования процессора с несколькими ядрами. Все эти проблемы мешали компаниям создавать универсальные продукты, которые могли бы обслужить большое количество пользователей.
В ответ Даль создал Node.js, чтобы дать разработчикам возможность использовать язык JavaScript для разработки серверной части приложения, фактически унифицируя разработку веб-приложений вокруг единого языка программирования.
Первая версия Node.js поддерживала работу только с операционными системами Linux и Mac OS X. Ее разработкой и обслуживанием сначала руководил Даль, а позже ее спонсировала компания Joyent, занимающаяся программным обеспечением и сопутствующими услугами.
В январе 2010 года был представлен диспетчер пакетов для Node.js, который упрощает для программистов публикацию и совместное использование исходного кода пакетов Node.js, а также упрощает установку, удаление и обновление программы.
В 2011 году Microsoft и Joyent объединились для разработки собственной версии Node.js для Windows, расширив число поддерживаемых операционных систем и предоставив разработчикам гораздо больше возможностей.
Тогда был создан Node.js Foundation, который объединил разработчиков в единое сообщество. Node.js Foundation был объединен с JS Foundation в 2019 году, сформировав новый фонд OpenJS Foundation.
Характеристики
Node.js — одна из лучших технологий, которую может использовать разработчик. Помимо простоты в работе, он также очень быстро работает, отправляя ответ клиенту за считанные секунды.

Основные характеристики:
1️⃣ Реализовано на JavaScript
Node.js написан на языке JavaScript. На сегодняшний день это самый популярный язык программирования в мире. Большинство программистов уже хорошо знакомы с JavaScript, его работой и другими базовыми и продвинутыми концепциями. Это делает Node.js простым для понимания и изучения. Кроме того, JavaScript также используется в стеке технологий для разработки клиентского интерфейса, а добавляя использование Node.js, разработчики могут создавать полноценные рабочие веб-проекты, зная только JavaScript.
2️⃣ Асинхронный характер
Важная особенность Node.js — асинхронный характер. Термин асинхронный означает, что сервер, созданный с использованием Node.js, не должен ждать, пока вернутся данные, при выполнении различных внутренних запросов. При этом он также имеет неблокирующий ввод-вывод. Это значит, что несколько различных процессов могут выполняться параллельно, не б локируя друг друга. Оба эти свойства делают Node.js крайне быстрым и обеспечивают лучший пользовательский интерфейс.
3️⃣ Архитектура, управляемая событиями
Термин «управляемый событиями» означает, что код перед выполнением ждет некоего события. В Node.js, при старте выполнения какой-либо операции, можно сразу же передать функцию, которая должна быть выполнена после окончания данной задачи. Такие функции называются функциями обратного вызова, также известны как обработчики события. Функции обратного вызова требуют меньше ресурсов на стороне сервера, а также занимают меньше памяти.
4️⃣ Однопоточная работа
В Node.js все запросы однопоточные и собираются в цикле обработки событий (Event loop). Это означает, что все программы выполняются в одном потоке, начиная с получения запроса и заканчивая выполнением требуемой задачи и отправкой ответа клиенту обратно. Эта функция Node.js предотвращает повторную загрузку запросов и сокращает время их обработки, что делает его более экономичным в использовании.
5️⃣ Совместимость с несколькими платформами
Как мы уже обсуждали ранее, Node.js можно использовать на разных системах, от Windows до Mac OS, Linux, и даже на мобильных платформах. Это позволяет создать самодостаточную среду в любой области разработки.
6️⃣ Быстрая потоковая передача данных
Node.js использует движок выполнения JavaScript V8. Этот движок также используется в браузере Google Chrome. Благодаря этому работа Node.js значительно ускоряется, а следовательно, обеспечивается очень быстрая потоковая передача данных для веб-приложения.
Зарплата Node.js-специалиста

По статист ике сайта djinni, средняя зарплата Node.js-специалиста в Украине сегодня — $3000-$5000.
Сферы применения
Node.js используется для самых разных приложений. Ниже мы рассмотрим несколько популярных вариантов использования:
❇️ Чаты в реальном времени
Благодаря своей однопоточной асинхронной природе, Node.js можно использовать для обработки сообщений в реальном времени. Он легко масштабируется и часто используется при создании чат-ботов. Node.js также упрощает создание дополнительных функций чата, таких как многопользовательский чат и push-уведомления.
❇️ Интернет вещей (концепция IoT)
Приложения IoT обычно содержат несколько датчиков, поскольку они часто отправляют небольшие фрагменты данных, которые могут накапливаться при большом количестве запросов. Node.js в данном случае — хороший выбор, так как он может быстро обрабатывать эти одновременные запросы.
❇️ Потоковая передача данных
Такие компании, как Netflix, работают с Node.js для потоковой передачи. В основном это связано с тем, что Node.js легкий и быстрый. Кроме того, Node.js предоставляет собственный потоковый API. Эти потоки позволяют пользователям передавать друг другу данные быстрее, чем при использовании других технологий.
❇️ Сложные одностраничные приложения (SPA)
В SPA все приложение загружается один раз на одной HTML-странице. Обычно это означает, что в фоновом режиме выполняется несколько запросов для изменения компонентов на экране пользователя. Здесь на помощь приходит цикл обработки событий Node.js, поскольку он обрабатывает подобные запросы неблокирующим образом.
❇️ Приложения на основе REST API
JavaScript может использоваться как во внешнем, так и во внутреннем интерфейсе сайтов. Таким образом, сервер может легко взаимодействовать с внешним интерфейсом через REST API, используя Node.js. Node.js также предоставляет такие пакеты, как Express.js и Koa, которые позволяют создать веб-сервер с нуля еще проще и быстрее.
Заключение
Node.js является очень перспективной технологией, ведь ее используют многие известные компании, такие как Netflix, Uber, Paypal, LinkedIn и другие. Помимо громких имен, многие стартапы также используют Node.js при разработке своих приложений.
Главный вывод — обучение работе с Node.js сделает вас востребованным кандидатом на рынке IT. Если вы ищете курсы javascript с нуля или курс профессии разработчика Node.JS , то обратите внимания на образовательный центр DAN.IT. За время обучения вы овладеете всеми необходимыми технологиями, языками программирования, а также разработаете веб-интерфейсы и приложения. Курсы javaScript в DAN.IT— это отличный первый шаг навстречу востребованной IT-профессии.
Почему Node.js — это гуд
Краткое введение в платформу, на которой JavaScript покоряет мир.
- Вы написали простое приложение в браузере — например, анализатор текста или ипотечный калькулятор. Так как всё было в браузере, вы сразу написали всё на JavaScript. Софт работает, приносит пользу.
- Со временем вы развиваете проект. Появляются новые функции. Однажды появилась потребность в переносе программы на мощный сервер. Например, вы решили добавить к своему софту интеграцию с Телеграмом, а для этого нужен сервер.
- В обычной ситуации вам бы пришлось выбрать какой-нибудь серверный язык и написать свой софт заново — например, на Python или PHP. Но благодаря NodeJS можно скопипастить существующий код, переписав лишь ввод-вывод, и ваша программа продолжит покорять мир.
Это и есть Node.js.
Что такое Node.js
Node.js — это система, которая исполняет JavaScript отдельно от вашего браузера. Можно сказать, что это самостоятельная среда для выполнения JavaScript.
Node.js можно установить на сервер (так же, как Python) и исполнять на нём ваш код, отдавая результат исполнения пользователям. На нём же можно делать отдельные приложения, используя дополнительные фреймворки.
Чем хорош Node.js
Если вы начинали изучать программирование, вам будет понятна концепция последовательного исполнения программы. Сначала исполняется первая строчка, потом вторая, потом третья и так далее. Может быть, где-то программа прыгнет вперёд-назад, где-то закольцуется, но в целом она исполняется линейно.
У JS есть фишка — он умеет исполнять код параллельно (условно говоря). Программисты называют это обработкой событий. Программе можно сказать: «Если когда-нибудь произойдёт вот это — выполните вон ту функцию, она знает, что делать». Таких событий можно предусмотреть много — получается, процессы как будто параллельны. Программа может просто сидеть и ждать, когда что-то произойдёт.
Больше того, процессы асинхронны: программа может что-то запросить в самом начале работы — например, спросить что-то у базы данных. И пока база данных чешется, программа на Node.js будет заниматься дальше своими делами. А как придёт ответ — возьмёт его и обработает.
При разработке любой программы на Node.js могут возникнуть сотни таких параллельных событий и обработчиков. Чтобы никто из них не перетягивал одеяло на себя, Node.js делает бесконечный цикл, в котором по кругу предоставляет процессорное время каждой функции. В результате создаётся иллюзия, что они работают параллельно и не мешают друг другу, но на самом деле ими жёстко управляет сама платформа.
Именно такое равномерное распределение всего в цикле событий и даёт Node.js преимущество при создании серверных приложений.
Пример: веб-сервер на Node.js
Как работает обычный веб-сервер
Раньше была такая проблема:
- На странице нужно, например, показать аватарку и никнейм пользователя.
- Для этого сервер делал запрос к базе данных, чтобы получить оттуда эту информацию.
- Пока база не ответит, сервер ничего не может сделать — он терпеливо ждёт.
- Сервер ждёт.
- Когда от базы приходит ответ с картинкой и никнеймом, сервер снова оживает, продолжает загружать страницу и в самом конце запрашивает у базы фоновую картинку для сайта.
- Сервер ждёт
- Страница тоже пока не работает, потому что не загрузилась до конца. Половина скриптов тоже не работают, потому что они ждут полной загрузки страницы. Все ждут, пока база ответит.
- На каждый такой запрос нужны ресурсы, чтобы держать соединение с базой.
- Если таких запросов много, ресурсы на сервере быстро заканчиваются, и тогда сайт начинает тормозить у всех сразу.
- Сервер начинает тупить и иногда вываливается с ошибкой. Страницы падают, пользователи психуют и уходят на другой сайт.

Как работает сервер на Node.js
- На странице нужно, например, показать аватарку и никнейм пользователя.
- Для этого сервер делает запрос к базе данных, чтобы получить оттуда эту информацию, а сам продолжает формировать страницу дальше.
- Пока не пришла аватарка, сервер уже сделал всё остальное и увидел, что нужна фоновая картинка.
- Сервер запрашивает картинку, а в это время ему пришла аватарка из прошлого запроса. Раз аватарка пришла, сервер вставляет её на нужное место. Пока он это делал — пришла фоновая картинка.
- Все материалы на месте, можно показывать страницу пользователю. Страница загружается быстрее, потому что сборка произошла параллельно.

Для чего ещё нужен Node.js
Кроме веб-приложений этот язык используют для создания любых сервисов, где нужен постоянный обмен информацией с пользователем:
- чаты,
- социальные сети,
- системы совместной работы над проектом,
- онлайн-редакторы текста.
А ещё на нём можно написать практически любое приложение и запустить его под Windows, MacOs или Linux. Это можно использовать для разработки универсальных приложений, например, списка задач, который должен работать на всех платформах, синхронизировать данные в реальном времени и уметь отправлять всё на мобильное устройство.
Последнее время большую популярность набирает использование Node.js для «интернета вещей» — умных чайников, весов и прочей бытовой техники. Здесь Node.js помогает управлять этими приборами и делать серверы, которые могут обрабатывать много запросов одновременно.
Кто это использует
Node.js в качестве основы для своей платформы выбрали много известных компаний:
- Walmart — крупнейшая сеть американских розничных магазинов,
- LinkedIn — социальная сеть деловых контактов,
- Uber — такси,
- E-bay — аукцион-платформа для продажи товаров по всему миру,
- GitHub — репозиторий проектов для программистов,
- Netflix — производство и съёмка сериалов,
- Trello — сервис для управлениями проектами.
С чего начать
Если хотите попробовать Node.js уже сейчас, начните с этих ресурсов — там достаточно информации для быстрого старта.
Медиум — очень кратко, но всё по делу.
RuVDS (.pdf) — отличное руководство по Node.js. Много, объёмно, но интересно.
Node.js — это бэкенд
От бэкенда зависит многое: скорость загрузки страниц, надёжность сайтов и безопасность передачи данных. Хотите во всём этом разбираться и получить новую профессию — мы только за.

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Всё что вам нужно знать о Node.js
Привет, Хабр! Представляю вашему вниманию перевод статьи «Everything you need to know about Node.js» автора Jorge Ramón.

В наши дни платформа Node.js является одной из самых популярных платформ для построения эффективных и масштабируемых REST API’s. Она так же подходит для построения гибридных мобильных приложений, десктопных программ и даже для IoT.
Я работаю с платформой Node.js более 6 лет и я на самом деле люблю её. Этот пост главным образом пытается быть путеводителем по тому, как Node.js работает на самом деле.
Давайте же начнём!!
О чем пойдёт речь:
- Мир до Node.js
- Проблема C10K
- Node.js и цикл событий
- Проблема CPU-ёмких задач
- Воркеры и их потоки
Мир до Node.js
Многопоточный сервер
Веб-приложения, написанные следуя клиент/серверной архитектуре, работают по следующей схеме — клиент запрашивает нужный ресурс у сервера и сервер отправляет ресурс в ответ. В этой схеме сервер, ответив на запрос, прерывает соединение.
Такая модель эффективна поскольку каждый запрос к серверу потребляет ресурсы (память, процессорное время и т.д.). Для того чтобы обрабатывать каждый последующий запрос от клиента, сервер должен завершить обработку предыдущего.
Значит ли это, что сервер может обрабатывать только один запрос за раз? Не совсем! Когда сервер получает новый запрос он создаёт отдельный поток для его обработки.
Поток, если простыми словами, это время и ресурсы, что CPU выделяет на выполнение небольшого блока инструкций. С учётом сказанного, сервер может обрабатывать несколько запросов одновременно, но только по одному на поток. Такая модель так же называться thread-per-request model.

Для обработки N запросов серверу нужно N потоков. Если сервер получает N+1 запросов, тогда он должен ждать пока один из потоков не станет доступным.
На рисунке выше, сервер может обрабатывать до 4 запросов (потоков) единовременно и когда он получает следующие 3 запроса, эти запросы должны ждать пока любой из этих 4 потоков не станет доступным.
Один из способов избавиться от ограничений — добавить больше ресурсов (памяти, ядер процессора и т. д.) на сервер, но это не самое лучшее решение….
И, конечно, не забываем о технологических ограничениях.
Блокирующий ввод/вывод
Ограниченное число потоков на сервере не единственная проблема. Возможно, Вам стало интересно почему один поток не может обрабатывать несколько запросов одновременно? всё из-за блокирующих операций ввода/вывода.
Допустим, Вы разрабатываете онлайн магазин и Вам нужна страница где пользователь может просматривать список всех товаров.
Пользователь стучится на http://yourstore.com/products и сервер рендерит HTML файл со всеми продуктами с базы данных в ответ. Совсем не сложно, да?
Но, что же происходит за кулисами?
- Когда пользователь стучится на /products особый метод или функция должна выполниться, что бы обработать запрос. Маленький кусочек кода (Ваш или фреймворка) анализирует URL-адрес запроса и ищет подходящий метод или функцию. Поток работает.

- Теперь нужный метод или функция выполняться, так как и в первом пункте — поток работает.

- Так как Вы хороший разработчик, Вы сохраняете все системные логи в файл, ну и конечно же, что бы быть уверенными, что роутер выполняет нужный метод/функцию — Вы так же логируете строку «Method X executing!!». Но всё это блокирующие операции ввода/вывода. Поток ждёт.

- Все логи сохранены и следующие строки функции выполняются. Поток работает снова.

- Время обращаться к базе данных и получать все продукты – простой запрос, вроде SELECT * FROM products , выполняет свою работу, но угадайте что? Да-да, это блокирующая операция ввода/вывода. Поток ждёт.

- Вы получили массив или список всех продуктов, но убедитесь, что Вы всё это залогировали. Поток ждёт.

- Теперь у Вас есть все продукты и пришло время рендерить шаблон для будущей страницы, но перед этим Вам нужно их прочитать. Поток ждёт.

- Движок рендеринга делает свою работу и шлёт ответ клиенту. Поток работает снова.

- Поток свободен, словно птица в небесах.

На сколько медленны операции ввода/вывода? Ну это зависит от конкретной. Давайте обратимся к таблице:
Операция Количество CPU тактов CPU Registers 3 такта L1 Cache 8 тактов L2 Cache 12 тактов RAM 150 тактов Disk 30,000,000 тактов Network 250,000,000 тактов Операции сети и чтения с диска слишком медленные. Представьте сколько запросов или обращений к внешним API ваша система могла бы обработать за это время.
Подбивая итоги: операции ввода/вывода заставляют поток ждать и тратить ресурсы впустую.
Проблема C10K
Проблема
C10k (англ. C10k; 10k connections — проблема 10 тысяч соединений)
В ранние 2000-е, серверные и клиентские машины были медленными. Проблема возникала при параллельной обработке 10 000 клиентских соединений к одной машине.
Но почему традиционная модель thread-per-request (поток на запрос) не могла решить эту проблему? Что ж, давайте используем немного математики.
Нативная реализация потоков выделяет больше 1 Мб памяти на поток, выходя из этого – для 10 тысяч потоков требуется 10 Гб оперативной памяти и это только для стека потоков. Да, и не забывайте, мы в начале 2000-х!!

В наши дни серверные и клиентские компьютеры работают быстрее и эффективней и почти любой язык программирования или фреймворк справляются с этой проблемой. Но фактически проблема не исчерпана. Для 10 миллионов клиентских соединений к одной машине проблема возвращается вновь (но теперь она C10M Problem).
JavaScript спасение?

Осторожно, спойлеры.
Node.js на самом деле решает проблему C10K… но как?!Серверный JavaScript не был чем-то новым и необычным в начале 2000-х, на тот момент уже существовали реализации поверх JVM (java virtual machine) – RingoJS и AppEngineJS, что работали на модели thread-per-request.
Но если они не смогли решить проблему, тогда как Node.js смог?! Всё из-за того, что JavaScript однопоточный.
Node.js и цикл событий
Node.js
Node.js это серверная платформа, что работает на движке Google Chrome – V8, который умеет компилировать JavaScript код в машинный код.
Node.js использует событийно-ориентированную модель и неблокирующую ввод / вывод архитектуру, что делает его легковесным и эффективным. Это не фреймворк, и не библиотека, это среда выполнения JavaScript.
Давайте напишем маленький пример:
// Importing native http module const http = require('http'); // Creating a server instance where every call // the message 'Hello World' is responded to the client const server = http.createServer(function(request, response) < response.write('Hello World'); response.end(); >); // Listening port 8080 server.listen(8080);Non-blocking I/O
Node.js использует неблокирующие ввод/вывод операции, что же это значит:
- Главный поток не будет блокироваться операциями ввода/вывода.
- Сервер будет продолжать обслуживать запросы.
- Нам придётся работать с асинхронным кодом.
Давайте напишем пример, в котором на запрос к /home сервер в ответ шлёт HTML страницу, а для всех других запросов — ‘Hello World’. Что бы отослать HTML страницу сначала ее нужно прочитать из файла.
This is home page
const http = require('http'); const fs = require('fs'); const server = http.createServer(function(request, response) < if (request.url === '/home') < fs.readFile(`$< __dirname >/home.html`, function (err, content) < if (!err) < response.setHeader('Content-Type', 'text/html'); response.write(content); >else < response.statusCode = 500; response.write('An error has ocurred'); >response.end(); >); > else < response.write('Hello World'); response.end(); >>); server.listen(8080);Если запрашиваемый url-адрес /home , тогда используется нативный модуль fs для чтения файла home.html .
Функции что попадают в http.createServer и fs.readFile как аргументы — колбэки. Эти функции будут выполнены в какой-то из моментов в будущем (Первая, как только сервер получит запрос, а вторая — когда файл будет прочитан с диска и помещён в буфер).
Пока файл считывается с диска, Node.js может обрабатывать другие запросы и даже считывать файл снова и всё это в одном потоке… но как?!
Цикл событий
Цикл событий — это магия, которая происходит внутри Node.js. Это буквально бесконечный цикл и на самом деле один поток.

Libuv — C библиотека которая реализует этот паттерн и является частью ядра Node.js. Вы можете узнать больше о libuv здесь.
Цикл событий имеет 6 фаз, каждое исполнение всех 6 фаз называют tick-ом.

- timers: в этой фазе выполняются коллбэки, запланированные методами setTimeout() и setInterval() ;
- pending callbacks: выполняются почти все коллбэки, за исключением событий close , таймеров и setImmediate() ;
- idle, prepare: используется только для внутренних целей;
- poll: ответственен за получение новых событий ввода/вывода. Node.js может блокироваться на этом этапе;
- check: коллбэки, вызванные методом setImmediate() , выполняються на этом этапе;
- close callbacks: например, socket.on(‘close’, . ) ;
Хорошо, есть только один поток, и этот поток и есть цикл событий, но тогда кто выполняет все операции ввода/вывода?

Обратите внимание.
Когда циклу событий нужно выполнить операцию ввода/вывода он использует поток ОС с тредпула (thread pool), а когда задача выполнена, коллбэк ставится в очередь во время фазы pending callbacks.
Разве это не круто?
Проблема CPU-ёмких задач
Node.js кажется идеальным! Вы можете создавать всё, что захотите.
Давайте напишем API для вычислений простых чисел.
Простое число – это целое (натуральное) число больше единицы и делимое только на 1 и на само себя.

Дано число N, API должен вычислять и возвращать первые N простых чисел в список (или массив).
function isPrime(n) < for(let i = 2, s = Math.sqrt(n); i return n > 1; > function nthPrime(n) < let counter = n; let iterator = 2; let result = []; while(counter >0) < isPrime(iterator) && result.push(iterator) && counter--; iterator++; >return result; > module.exports = < isPrime, nthPrime >;const http = require('http'); const url = require('url'); const primes = require('./primes'); const server = http.createServer(function (request, response) < const < pathname, query >= url.parse(request.url, true); if (pathname === '/primes') < const result = primes.nthPrime(query.n || 0); response.setHeader('Content-Type', 'application/json'); response.write(JSON.stringify(result)); response.end(); >else < response.statusCode = 404; response.write('Not Found'); response.end(); >>); server.listen(8080);prime.js это реализация нужных вычислений: функция isPrime проверяет является ли число простым, а nthPrime возвращает N таких чисел.
Файл же index.js отвечает за создание сервера и использует модуль prime.js для обработки каждого запроса на /primes . Число N прокидывается через строку запроса в URL-адресе.
Что бы получить первых 20 простых чисел нам нужно сделать запрос на http://localhost:8080/primes?n=20 .
Предположим, к нам стучатся 3 клиента и пытаются получить доступ к нашему не блокирующемуся вводом/выводом API:
- Первый запрашивает 5 простых чисел каждую секунду.
- Второй запрашивает 1000 простых чисел каждую секунду
- Третий запрашивает 10 000 000 000 простых чисел, но.
Когда третий клиент шлёт запрос – главный поток блокируется и это главный признак проблемы CPU-ёмких задач. Когда главный поток занят исполнением «тяжёлой» задачи он становится недоступен для других задач.
Но как насчёт libuv? Если Вы помните, эта библиотека помогает Node.js исполнять операции ввода/вывода с помощью потоков ОС избегая блокировки главного потока и Вы абсолютно правы, это решение нашей проблемы, но для того, что бы это стало возможным, наш модуль должен быть написан на языке C++, что бы libuv могла с ним работать.
К счастью, начиная с v10.5 в Node.js добавлен нативный модуль Worker Threads.
Воркеры и их потоки
Воркеры полезны для выполнения CPU-ёмких JavaScript операций; не используйте их для операций ввода/вывода, уже встроенные в Node.js механизмы более эффективно справляются с такими задачами, чем Worker thread.
Исправление кода
Пришло время переписать наш код:
const < workerData, parentPort >= require('worker_threads'); function isPrime(n) < for(let i = 2, s = Math.sqrt(n); i 1; > function nthPrime(n) < let counter = n; let iterator = 2; let result = []; while(counter >0) < isPrime(iterator) && result.push(iterator) && counter--; iterator++; >return result; > parentPort.postMessage(nthPrime(workerData.n));const http = require('http'); const url = require('url'); const < Worker >= require('worker_threads'); const server = http.createServer(function (request, response) < const < pathname, query >= url.parse(request.url, true); if (pathname === '/primes') < const worker = new Worker('./primes-workerthreads.js', < workerData: < n: query.n || 0 >>); worker.on('error', function () < response.statusCode = 500; response.write('Oops there was an error. '); response.end(); >); let result; worker.on('message', function (message) < result = message; >); worker.on('exit', function () < response.setHeader('Content-Type', 'application/json'); response.write(JSON.stringify(result)); response.end(); >); > else < response.statusCode = 404; response.write('Not Found'); response.end(); >>); server.listen(8080);В файле index-workerthreads.js при каждом запросе на /primes создаётся экземпляр класса Worker (с нативного модуля worker_threads ) для выгрузки и исполнения файла primes-workerthreads.js в поток воркера. Когда список простых чисел просчитан и готов, инициируется событие message – результат попадает в главный поток из-за того, что у воркера не осталось работы он также инициирует событие exit , позволяя основному потоку отправлять данные клиенту.
primes-workerthreads.js изменён немного. Он импортирует workerData (это копия параметров, переданных с основного потока) и parentPort через который результат работы воркера передаётся назад в главный поток.
Теперь давайте испробуем наш пример снова и посмотрим, что случиться:

Основной поток больше не блокируется .
Теперь всё работает как нужно, но плодить воркеры без всяких на то причин все же не лучшая практика, создавать потоки не дешёвое удовольствие. Обязательно создайте пул потоков перед этим.
Заключение
Node.js мощная технология, которую стоит изучить при возможности.
Моя личная рекомендация – всегда будьте любопытными! Если Вы знаете, как что-то работает изнутри, Вы сможете работать с этим более эффективно.Это всё на сегодня, ребята. Я надеюсь этот пост был полезен для Вас и вы узнали что-то новое о Node.js.

Спасибо за прочтение и до встречи в следующих постах.
