Представьте:
- Вы написали простое приложение в браузере — например, анализатор текста или ипотечный калькулятор. Так как всё было в браузере, вы сразу написали всё на 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. Много, объёмно, но интересно.