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

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

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

JavaScript - это язык программирования, который был разработан специально для разработчиков браузеров, которые используют его как инструмент, чтобы оживить веб-сайты. Изначально JavaScript был языком только для браузера, что означает, что его могли выполнять только браузеры. Возникает вопрос, что особенного есть во всех браузерах, чтобы они могли преобразовывать код JavaScript, который вы пишете, в машинно-понятный язык?

Все браузеры имеют встроенный движок JavaScript, который отвечает за преобразование кода JavaScript в машинный код, этот движок может быть написан на разных языках. Например, V8, который используется браузером Chrome, был написан на C ++.

Движок JavaScript просто предоставляет среду выполнения для выполнения JavaScript, XMLHttpRequest, DOM (объектная модель документа) API, а другие API веб-платформы не являются частью JavaScript, они предоставляются браузером, чтобы мы могли общаться с помощью JavaScript с решаем наши клиентские проблемы. Эти API-интерфейсы известны как API-интерфейсы BOM (объектной модели браузера).

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

Я видел, как люди сравнивали Node.js с другими языками программирования, это похоже на сравнение пера с геометрическим блоком. Node.js - это среда выполнения JavaScript, а не язык программирования.

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

Неблокирующие модели - это те, в которых текущий поток, не дожидаясь завершения операции, отличной от JavaScript, выполняет оставшийся код, эта операция может считывать / записывать данные с / на системный диск, сетевые вызовы, выполнение HTTP-запросов или выполнение запросов. база данных. Давайте разберемся с этим на примере:

Выход: один три два

В приведенном выше примере «два» печатается в конце, потому что поток вместо ожидания завершения setTimeout выполнил весь код JavaScript, а когда задержка завершилась, он выполнил оператор внутри обратного вызова setTimeout.

В блокирующих моделях оставшийся код JavaScript ожидает завершения операции, отличной от JavaScript, обычно запросы ввода-вывода являются блокирующими по своей природе, что означает, что управление не возвращается в приложение до тех пор, пока ввод-вывод не будет завершен.

Node.js предоставляет 2 типа методов:

1. Синхронные методы: блокирует процесс до завершения их выполнения.

2. Асинхронные методы: неблокирующий характер.

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

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

Во время выполнения программы каждая отдельная функция помещается в стек, чтобы цикл обработки событий мог ее обработать. В случае операции, отличной от JavaScript, она будет зарегистрирована как пара «событие-обратный вызов», а затем вытолкнута из стека. После завершения каждого зарегистрированного события функция обратного вызова, связанная с этим событием, помещается в очередь задач. Например, на изображении выше будет зарегистрирована функция setTimeout, а затем после задержки в 5000 миллисекунд (событие) функция обратного вызова с оператором console.log («там») будет помещена в очередь задач. .

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

Если у вас есть достаточно времени, я настоятельно рекомендую прочитать этот документ: Цикл событий узла, в котором подробно описаны все фазы цикла событий.

Теперь у нас есть представление о том, что такое Node.js и как он работает. Сообщите нам о некоторых других интересных вещах, которые помогут нам использовать Node.js.

Узловой модуль

Каждая программа узла рассматривается как отдельный модуль. Есть три типа модулей:

  1. Основные модули: поставляются с установкой узла.
  2. Локальные модули: модули, созданные локально для узлового приложения.
  3. Сторонние модули: внешние модули, доступные в Интернете и публикуемые разработчиками.

Перед выполнением кода, написанного внутри модуля, Node.js помещает его в оболочку функции, которая выглядит следующим образом:

Все, что определено внутри модуля, является частным и доступно только этому модулю, если вы хотите предоставить что-то другим модулям, вам необходимо явно указать это с помощью объекта module.exports, который предоставляется Node.js для экспорта любого литерала, функции или объекта, определенного внутри модуля.

module.exports.variable = literal | функция | объект

Вы можете импортировать модуль с помощью require, module.exports - это объект, который фактически возвращается в результате вызова require.

const variable = require («ModuleName»);

Если вы хотите поделиться своим модулем с другими разработчиками, вы даже можете опубликовать свой модуль node с помощью npm.

NPM

В Node.js есть собственный менеджер пакетов, известный как Node Package Manager (npm), который позволяет разработчикам легко устанавливать существующие модули и публиковать свои собственные созданные модули, чтобы другие разработчики могли использовать его повторно, не изобретая колесо.

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

  1. npm install ‹module_name›: это наиболее часто используемая команда npm, она используется для установки модулей из репозитория npm.
  2. npm uninstall ‹module_name›: для удаления любого пакета.
  3. npm view ‹module_name›: эта команда предоставляет вам метаданные модулей, таких как их версии.
  4. npm outdated: для проверки того, устарели ли какие-либо установленные зависимости.
  5. npm init: это первая команда, используемая при создании проекта. Эта команда создает файл package.json для вашего проекта.

package.json

Этот файл содержит метаданные проекта, всякий раз, когда вы используете команду npm install для загрузки модулей, его имя автоматически добавляется в этот файл, а модуль сохраняется в папке node_modules. При фиксации кода вы всегда должны исключать папку node_modules, поскольку она резко увеличивает размер репо. Теперь вы будете думать, как люди получат все зависимости проекта после удаления этой папки? После каждой проверки разработчикам просто нужно запускать команду npm install, при ее использовании все зависимости, перечисленные в package.json, будут загружены автоматически, поэтому файл package.json так важен.