Node или Node.js — это программная платформа, которая позволяет использовать JavaScript не только для браузера. В этой статье мы подробно разберем, что такое Node.js и какие особенности она имеет.
Node.js
Node.js ― это не отдельный язык программирования, а среда для выполнения JavaScript. Или, другими словами, платформа для работы с JavaScript на стороне сервера. Раньше JavaScript мог выполнять только браузер. С помощью Node.js это можно делать без него.
Чаще всего Node используют для написания серверной части сайта (для неё он и был создан изначально), однако сейчас на нём пишут и десктопные программы. На данный момент эту технологию для своего бэкенда используют PayPal, eBay, Amazon и Netflix.
Платформу разработал Райан Дал, а спонсором разработки выступила компания Joyent. Среда была представлена в 2009 году. Node.js основана на движке V8. V8 ― это программа, которая преобразует JavaScript в машинный код, то есть код понятный процессору. Этот же движок используется в основе браузера Google Chrome.
Одного V8 для удобной работы мало, так как он может работать только с JavaScript. Он не умеет читать файлы, не может работать с сетью вне браузера, поэтому Райан Дал вместе с разработчиками с помощью дополнительных библиотек и кода добавили дополнительные возможности к V8. Это позволило сделать из JavaScript веб-сервер.
Плюсы Node.js:
- Использование одного языка JavaScript как на клиентской стороне в браузере, так и на сервере.
- NPM (Node Package Manager) ― это менеджер пакетов, или набор готовых модулей. Это своеобразный склад, где программисты делятся своим кодом. Комьюнити очень большое, поэтому в NPM на данный момент собрано огромное количество решений для разных задач.
- Увеличение скорости работы. Node.js ― это однопоточная и асинхронная система. Вы можете читать файлы, отправлять электронные письма, запрашивать данные и совершать другие действия одновременно. Подробнее об однопоточной работе мы расскажем ниже.
Node.js основы: что такое многопоточная и однопоточная работа
При изучении серверных процессов нужно знать, что есть 2 схемы работы с сервером ― многопоточная и однопоточная.
Работа с веб-приложением ― это передача запроса и получение ответа от сервера. Многопоточная система линейна. Вначале выполняется один запрос, затем другой и так далее по очереди. Например, нам нужно обратиться к базе данных. Веб-сервер делает запрос и ждёт, пока не придёт ответ. Как только ответ вернулся, он обрабатывает его и может приступить к отправке других запросов. Как видите, в процессе ожидания веб-сервер тратит ресурсы, но ничего не делает.
При выполнении запроса потребляются ресурсы сервера: память, процессорное время и количество ядер. Получается, при многопоточном подходе сервер может выполнить только один запрос за раз? Нет. Каждый запрос помещается в отдельный поток. Поток ― это время и ресурсы, которые выделяет сервер для выполнения небольшого блока инструкций. Таким образом, количество потоков зависит от мощности машины. Чем больше ресурсов, тем больше потоков и тем больше запросов может выполнить сервер одновременно. Такая модель работы называется thread-per-request model (модель потока на запрос).
Многопоточная система
Если свободные потоки заканчиваются, сервер не может выполнить задачу. Она попадает в очередь и ждёт, пока не освободиться один из потоков. Например, вам нужно выполнить 3 запроса. Вам доступно 4 потока. Мощность сервера позволяет вам выполнить их все за раз. Если вам нужно будет выполнить 5 запросов, то одна задача не поместится и ей придётся ждать свободного потока. Из-за нескольких потоков, которые обрабатывают запросы, система и получила название многоканальная.
Как работает Node.js?
Node.js работает по однопоточному принципу в рамках событийно-ориентированной модели. Его архитектура не блокирует ввод и вывод. При этом подходе:
- все запросы обрабатываются в рамках одного потока,
- веб-сервер не тратит время на ожидание ответа,
- веб-сервер посылает запросы и обрабатывает ответы по мере их поступления.
Таким образом, веб-сервер всегда находится в работе, а не в процессе ожидания. Такой способ позволяет эффективно использовать ресурсы и выполнять команды намного быстрее.
Node.js для начинающих. Однопоточная система
Отличным примером является загрузка страницы сайта. Представьте, вы хотите загрузить страницу сайта. Веб-ресурс может показаться пользователю, как только браузер получит весь необходимый контент. При использовании обычного веб-сервера с многопоточной системой каждый файл (картинка, название, основной текст, фон) будет запрашиваться по отдельности. Например, сначала фон, затем, как только данные фона будут получены, веб-сервер отправит запрос на картинки и так далее. Из-за долгого ожидания ответа страница будет грузиться дольше. Как мы уже говорили Node.js не тратит время на ожидание. Во время поиска фоновой картинки нода запросит другую картинку. За счёт этого сайт загрузится быстрее.
Однопотоковая система работает благодаря циклу событий, который состоит из 6 фаз. Практически на каждой фазе выполняются коллбэки (обратные вызовы) — функции, которые срабатывают сразу после завершения работы предыдущих функций.
- 1. Таймеры (timers). На этом этапе срабатывают коллбэки методов setInterval() и setTimeout();
- 2. Ожидающие обратные вызовы (pending callbacks). В этой фазе срабатывает практически все коллбэки, отложенные в предыдущую фазу. Исключение — setImmediate(), close и таймеры;
- 3. Ожидание и подготовка (idle, prepare). Отвечает за внутренние цели;
- 4. Опрос (poll). Принимает новые события ввода/вывода;
- 5. Проверка (check). На этом этапе срабатывают коллбэки, вызванные методом setImmediate();
- 6. Закрытие (close callbacks). Закрывает обратный вызов, например, socket.on('close', …).
Чаще всего платформу Node используют для создания веб-сервисов, которые требуют интенсивного обмена информацией с пользователями, например, чатов, социальных сетей и подобных систем. Также Node хорошо подходит для разработки RTA — веб-приложений, которые реагируют на действия пользователя в режиме реального времени. Например, онлайн-редакторов типа Google Docs, который позволяет работать над одним документом нескольким пользователям одновременно.
Node.js модули
Любой сложный проект состоит из файлов с кодом. Благодаря файловой системе удобно структурировать проект, а также выносить нужные части для других проектов. Каждый файл в Node.js называется модуль.
Модуль можно подключить с помощью функции require()
. В скобках нужно указать путь к файлу. Набор модулей уже обширен. Например, вы можете использовать модуль Node.js PostgreSQL для взаимодействия с базой данных.
Подробнее о встроенных модулях и их функциональности можно узнать в официальной документации.
Node.js, PHP или Python?
Node.js не такой популярный как PHP. На PHP написаны такие CMS как WordPress, Joomla!, Drupal. И именно на этих системах управления работает большинство сайтов.
Фреймворков для PHP пока больше, чем для Node.js. Инфраструктура ноды только начинает развиваться. Популярными фреймворками для Ноды являются:
AdonisJs. Это фреймворк, который работает на всех основных операционных системах. Он обладает стабильной экосистемой для написания серверных веб-приложений. Идеально подходит для разработчиков Laravel, которые пробуют переход на Node.js. Особенности AdonisJs:
- есть ORM, который помогает создавать безопасные SQL-запросы,
- API и система аутентификации на основе сеансов,
- лёгкий в освоении конструктор запросов,
- высокая безопасность,
- поддержка баз данных No-SQL, таких как MongoDB.
Express.js. Это самый простой, гибкий и быстрый фреймворк Node.js. Express.js подходит для быстрой разработки простых приложений, так как имеет легкодоступные инструменты генерации API. Особенности Express.js:
- высокая настраиваемость,
- быстрое освоение программы,
- быстрая разработка на стороне сервера,
- поддерживает архитектуру MVC,
- поддержка NoSQL-баз данных из коробки.
Koa.js. Этот фреймворк был создан командой Express.js. Разработчики хотели учесть все недостатки Express.js и создать более совершенный продукт. Koa работает в разных браузерах, без использования обратных вызовов и обладает мощной системой обработки ошибок. Может использоваться для фронтенд- и бэкэнд-системы. Особенности Koa.js:
- встроенный catchall ошибок,
- использование генераторов для управления и обработки обратных вызовов,
- использует каскадную модель промежуточного ПО.
Если сравнивать Python и Node, то их главное различие ― сфера применения. Нода подходит для веб-разработки и некоторых десктопных программ, в то время как Python является универсальным решением. С его помощью можно сделать не только веб-разработку, но и Data Science, Machine Learning.
Как попробовать работу в Node.js? Вам поможет статья Как установить Node.js на Ubuntu. Как проверить версию Node.js, если программа уже установлена? Зайдите в терминал и введите команду node -v
. В результате вы увидите примерно такой вывод:
Помогла ли вам статья?
Спасибо за оценку. Рады помочь 😊