Что такое Node js?

Node.js — это среда выполнения JavaScript, основанная на движке Google V8, т. е. с помощью Node.js мы можем запускать JavaScript вне браузера. Другие вещи, которые вы, возможно, читали или не читали о Node.js, заключаются в том, что он является однопоточным, основан на архитектуре, управляемой событиями, и не блокируется на основе модели ввода-вывода.

Довольно запутанно, ха… Давайте разберем это определение.

Однопоточный. Можно сказать, что поток похож на процесс в операционной системе. Javascript — это однопоточный язык, что означает, что он обрабатывает один запрос или выполняет одну операцию за раз.
Архитектура, управляемая событиями: Node js работает с архитектурой, управляемой событиями, когда событие происходит в узле. js внутренне сохраняет события и выполняет эти события, когда операция, связанная с этим событием, завершается, или, точнее, выполняет обратный вызов, связанный с событием.
Неблокирующий: однопоточный Итак, вы можете подумать, как это может быть неблокирующим. Неблокирующий означает, что отдельный поток не блокирует код при выполнении медленной, трудоемкой или асинхронной операции. i-e делает вызов базы данных. Я знаю, что это может вас сбить с толку, но позже я объясню, как это работает внутри.
Модель ввода-вывода: ввод-вывод просто означает ввод-вывод, как взаимодействие с файлом. системы, выполнение сетевых вызовов и т. д.

Общая картина узла Js:

Когда приложение узла js запускается, цикл событий запускается внутри самого узла. Цикл событий — это то, что позволяет Node.js выполнять неблокирующие операции ввода-вывода — несмотря на то, что JavaScript является однопоточным — путем разгрузки операций в рабочий пул, когда это возможно.

Цикл событий выполняет только быстрые операции с минимальным временем выполнения. Таким образом, цикл обработки событий обрабатывает только те обратные вызовы, которые содержат код быстрого завершения. Например, при чтении файла при возникновении этого события node js автоматически переносит эту операцию в рабочий пул.

Рабочий пул полностью отделен от javascript и может работать в нескольких потоках, выполняя тяжелую работу. Единственная связь между циклом событий и рабочим пулом заключается в том, что, например, когда операция чтения файла завершена, он инициирует обратный вызов для этой операции чтения, поскольку цикл событий отвечает за события и обратные вызовы. Таким образом, цикл событий выполняет соответствующие обратные вызовы.

Глубокое погружение в цикл событий:

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

Итак, это просто цикл, который продолжает работать, что неудивительно. Вот этапы, через которые он проходит:

Таймеры. В начале каждой итерации проверяется наличие обратных вызовов таймера. Мы еще не настроили никаких таймеров, но в основном это включает setTimeout() и setInterval(). По сути, когда мы вызываем setTimeout и setInterval, мы также передаем им функцию обратного вызова и время в миллисекундах, после которого она будет выполняться. Node js знает об этом поведении и в начале каждой новой итерации цикла выполняет все обратные вызовы таймеров. Итак, любые обратные вызовы, которые должны быть выполнены, потому что таймер завершен.

Ожидаемые обратные вызовы: на этом этапе он выполняет другие обратные вызовы (обратные вызовы, связанные с вводом-выводом), такие как чтение файла, и когда эта операция завершается, он выполняет этот обратный вызов. Теперь важно понимать, что узел js покинет эту фазу в определенный момент времени, и это также может означать, что если будет слишком много невыполненных обратных вызовов, он продолжит итерацию цикла и отложит эти обратные вызовы до следующей итерации для их выполнения.

Опрос.Фаза опроса — это, по сути, фаза, на которой узел js будет искать новые события ввода-вывода и в основном делает все возможное, чтобы немедленно выполнить свои обратные вызовы, если это возможно, а если это невозможно, он будет отложить выполнение и зарегистрировать его как отложенный обратный вызов. Важно, что он также проверяет любые обратные вызовы таймера, которые должны быть выполнены, и, если это так, он перейдет к этой фазе таймера и сразу же выполнит их. Таким образом, он может фактически вернуться туда и не закончить итерацию в противном случае. это будет продолжаться.

Проверить: на этом этапе будут выполняться обратные вызовы setImmidiate(). SetImmediate немного похож на setTimeout и setInterval только тем, что он будет выполняться немедленно, но всегда после выполнения любых открытых обратных вызовов.

Обратные вызовы закрытия: на этом этапе будут выполняться любые обратные вызовы событий закрытия. Итак, если вы зарегистрировали какие-либо события обратного вызова закрытия, это будет момент времени, когда узел js выполняет соответствующие обратные вызовы.

Ну, а затем мы могли бы выйти из всего процесса node js, но только если не осталось зарегистрированных обработчиков событий, и это то, что я имею в виду с этой вещью refs equal null здесь. Внутренне узел js отслеживает свои открытые прослушиватели событий и в основном имеет счетчик, ссылки или ссылки, которые увеличиваются на единицу для каждого нового зарегистрированного обратного вызова и уменьшаются на единицу для каждого прослушивателя событий. что он больше не нужен. В серверной среде мы создаем сервер, а затем слушаем входящие запросы с помощью listen, и это событие, которое никогда не завершается по умолчанию, поэтому у нас всегда есть хотя бы одна ссылка, и поэтому мы не выходим в обычном Интернете. серверная программа. Мы можем вызвать функцию выхода, чтобы явно выйти из процесса узла.

Вывод:

Вам не нужно учить все это наизусть, но, по крайней мере, вы должны знать, как все происходит за кулисами в node js. Это концепции, которые обычно задают на собеседованиях при приеме на работу в Node.js, и хорошее понимание их поможет вам выделиться из толпы. Если вы действительно хотите углубиться в продвинутые концепции, вам следует обратиться к ссылкам ниже:

  1. Официальная документация Node.js: https://nodejs.org/en/docs/guides/
  2. Полный справочник по Node.js (для всех основных модулей): https://nodejs.org/dist/latest/docs/api/
  3. Подробнее о цикле событий Node.js: https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
  4. Блокирующий и неблокирующий код: https://nodejs.org/en/docs/guides/dont-block-the-event-loop/

Пожалуйста, подпишитесь на меня в Twitter, если вам нравится мой контент.

Если этот пост был полезен, пожалуйста, нажмите кнопку хлопка 👏 несколько раз, чтобы выразить свою поддержку! ⬇⬇