Углубление в управляемую событиями архитектуру. В этой статье мы раскроем тонкости эмиттеров событий, очередей и циклов в среде выполнения JavaScript Node, что даст вам более глубокое понимание того, как события и асинхронные процессы формируют современные приложения JavaScript.

Node: внедрение JavaScript в серверную часть

Node — это ключ к использованию JavaScript для внутренних (серверных) задач. До Node JavaScript не мог работать на сервере, не полагаясь на фреймворки или другие обходные пути. Узел был создан для решения этой проблемы.

Node — это не отдельный язык или фреймворк; это среда выполнения. Проще говоря, среда выполнения — это место, где выполняется код.

Среды выполнения

  1. Браузер (Google Chrome, Firefox, Safari)
  2. Node.JS

При запуске кода в браузере:

  • Код не имеет доступа к ресурсам на нашей машине.
  • Он имеет доступ к объектной модели документа (DOM).
  • Код привязан к тегу ‹script›.

При запуске кода в узле:

  • Код имеет доступ к ресурсам нашей машины.
  • У него нет доступа к DOM.
  • Код можно запустить в терминале.

Модули в узле

Модули представляют собой предварительно упакованный код, который разработчик может импортировать в любой проект Node по мере необходимости. Некоторые популярные модули включают в себя:

  • HTTP и HTTPS (для веб-серверов)
  • FS (для чтения и записи файлов)
  • ОС (для взаимодействия с операционной системой)

Доступно гораздо больше модулей, и вы можете найти их в менеджерах пакетов, таких как Node Package Manager (NPM). Кроме того, любой код, который мы пишем в Node, можно импортировать и экспортировать как модуль в нашем коде, что позволяет нам создавать абстракции и отдельные задачи.

Модули Node играют решающую роль во многих приложениях, но важно помнить, что многие из них специально разработаны для работы на Node. Попытка использовать модуль Node в браузере может привести к ошибке, например «Не удается найти модуль ‘fs’».

Одной из самых больших проблем для новичков является понимание разницы между клиентскими и серверными модулями, а также их правильное использование. Невыполнение этого требования приведет к ошибкам. Зная, к чему относится каждый модуль, и используя их по назначению, вы можете обеспечить более плавную разработку.

Но не беспокойтесь! Чтобы понять разницу, вам просто нужно продолжать экспериментировать, и, по крайней мере, теперь вы знаете, что это может вызвать проблемы. Теперь давайте углубимся в Node.

Программирование, управляемое событиями

  1. Излучатель событий. Излучатель событий — это модуль в JavaScript, который позволяет объектам взаимодействовать с помощью событий. Как следует из названия, эмиттер отправляет сигнал, обычно инициируемый действиями пользователя, такими как нажатие кнопки в браузере или чтение файла в серверном приложении. Когда это происходит, функция слушателя, специально предназначенная для перехвата сигнала от источника, перехватывает его и выполняет блок кода.
  2. События. В веб-приложениях события могут принимать разные формы, например наведение курсора на раздел, нажатие кнопки, отправка формы или перетаскивание элемента на стороне клиента. Или получение фрагментов данных при чтении файла, обеспечение установки HTTP-соединения, или событие, связанное с жизненным циклом приложения, например, код завершается с ошибкой. Проще говоря, событие — это действие, которое пользователь может выполнить на веб-сайте (в браузере) или на сервере (узле), которое может охватывать широкий спектр взаимодействий.
  3. Цикл событий. Когда событие запускается, это похоже на зеленый свет для события, которое входит в цикл событий и находит соответствующую функцию. Имейте в виду, что каждое испускаемое событие связано с определенным прослушивателем, который может воздействовать на него. Мы углубимся в цикл событий в следующем разделе.
  4. Обработчик событий. Обработчик событий — это функция, которую мы создаем для прослушивания определенных событий. Эта функция должна содержать логику, которая при обнаружении целевого события выполняет такое действие, как отправка данных в базу данных, перенаправление трафика на другую страницу, изменение состояния программы или просто запись чего-либо в консоль. Как следует из названия, функция, которую мы здесь определяем, должна отвечать за обработку получаемого события.

Цикл событий

JavaScript является однопоточным, то есть он может выполнять только одно действие за раз в одном потоке процессора. Однако мы можем выполнять код асинхронно благодаря циклу обработки событий.

  1. Входящие запросы. Запросы генерируются, когда инициируются события, которые могут возникать, когда пользователь нажимает кнопку (в браузере) или читает файл (узел), какое-либо событие с прикрепленным генератором событий.
  2. Очередь событий. Очередь событий содержит список всех ожидающих событий, которые были инициированы и ожидают выполнения соответствующей функции прослушивателя для выполнения задачи. Эта модель известна как неблокирующая модель и жизненно важна для современного программирования на JavaScript.
  3. Цикл событий: Node сначала обрабатывает самое старое событие в очереди, затем второе по старшинству и так далее. Цикл событий — это непрерывный цикл, который ожидает выполнения задач, а затем приостанавливается до тех пор, пока не станет доступна новая задача. Хотя цикл обработки событий имеет определенные этапы и временные интервалы, этот уровень детализации выходит за рамки этого вводного обсуждения.
  4. Пул потоков: не все события могут быть выполнены за один проход. Некоторые задачи требуют дополнительной обработки. Пул потоков — это набор дополнительных потоков ЦП, которыми JavaScript управляет для более интенсивных процессов ввода-вывода. В браузере веб-API, предоставляемые ядром браузера, управляют пулом потоков. В Node пул потоков управляется библиотекой libuv, которая отвечает за обработку асинхронных операций ввода-вывода.
  5. Операция завершена: как только событие выполняется циклом обработки событий, место в стеке вызовов (список событий, использующих потоки) освобождается, и завершенное событие возвращается источнику исходного события.
  6. Исходящий запрос: наконец, обработанный запрос отправляется обратно либо с ошибкой, если таковая произошла, либо с ожидаемым значением, когда процесс начался.

Давайте подключим!

🌎 Линкедин | Гитхаб | Электронная почта 🌎

Пожалуйста, не стесняйтесь обращаться по любому из этих каналов. Я приветствую отзывы о моем содержании и написании! Также рассмотрите возможность подписаться на мою учетную запись Medium для регулярных статей о программировании.

Спасибо!