Эти заметки сделаны после просмотра курса Anthony Alicea. Примечание: это курс среднего уровня, и некоторые примеры и определения взяты прямо из курса.

Первую из этой серии можно найти здесь:



Давайте приступим к делу.

I. Ядро узла

JavaScript Engine V8: движок JavaScript с открытым исходным кодом от Google, который преобразует наш код JavaScript в машинный код, который может понять процессор компьютера и соответствует стандарту ECMAScript. V8 написан на языке C++ и является основной частью Node.

Серверы и клиенты.На самом базовом уровне сервер — это просто компьютер, который выполняет службы, запрашиваемые у клиента. сильный>. Клиент запрашивает, а сервер отвечает. Интернет работает по этой модели клиент-сервер, когда браузер является клиентом, а веб-сервер — сервером.

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

Управление веб-сервером. Конструкция NodeJS означает, что мы пытаемся ответить на один важный вопрос: Что нужно JavaScript для управления сервером? Какие функции нам нужны для создания сервера, которого нет в JavaScript, но который предоставляет нам Node:

  • Лучшие способы организовать наш код в повторно используемые фрагменты
  • Способы работы с файлами
  • Способы работы с базами данных
  • Возможность общаться через Интернет
  • Возможность принимать запросы и отправлять ответы
  • Способ справиться с работой, которая занимает много времени

II. Модули, экспорт и требование

Модуль. Повторно используемый блок кода, существование которого случайно не влияет на другой код. Модули организуют программу в кластеры кода. Раньше в JavaScript такого не было, и это новая функция ES6.

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

Модули в ES6.Изначально Node JS добавлял функцию модуля в язык JavaScript, потому что язык не имел ее по умолчанию. Однако новая версия JavaScript (ES6) теперь имеет встроенную функцию модуля. Он делает то же самое, что и require в Node, но имеет другой синтаксис, import .

III. События и генератор событий

События: что-то, что произошло в нашем приложении, что мы можем прослушать и на что отреагировать. События/эмиттеры событий — это фундаментальная основополагающая концепция, которая составляет большую часть ядра Node JS API. Все объекты, которые могут генерировать события, наследуют свои возможности от EventEmitter .

Наследование от эмиттера событий (util.inherits vs ES6 Class extends):до ES6 мы использовали util.inherits как способ реализации наследования, подобного классу. ES6 поставляется с концепцией class, которая позволяет нам реализовать наследование более простым способом. Однако следует отметить, что Класс ES6 — это просто синтаксический сахар поверх существующего в JavaScript наследования на основе прототипов, и его не следует приравнивать к классическому объектно-ориентированному наследованию.

  • Наследование с помощью util.inherits
  • Наследование с использованием расширений класса ES6

IV Асинхронный код

Асинхронный: одновременно выполняется более одного процесса. Узел асинхронный. Однако V8 и JavaScript являются синхронными — в каждый момент времени выполняется один процесс. Это означает, что даже несмотря на то, что JS является синхронным, его запуск (изнутри браузера, Node..) может заставить его работать асинхронно, не блокируя выполнение другого кода.

Обратный вызов: функция, переданная какой-либо другой функции, которая, как мы предполагаем, будет вызвана в какой-то момент. Функция «перезванивает», вызывая функцию, которую вы ей даете, когда она выполняет свою работу.

LIBUV и цикл обработки событий. Как мы видели ранее, пользовательские события можно обрабатывать с помощью генератора событий, который основан на JavaScript и существует в Node. Однако системные события обрабатываются на стороне C++ ядра Node, которая на самом деле обрабатывается библиотекой C под названием libUV. В отличие от генератора событий, libUV управляет событиями, исходящими от самой операционной системы.

Управляемый событиями, неблокирующий ввод-вывод. Мы уже видели, что внутри Node V8 является синхронным и выполняет один набор кода за раз. Также внутри Node находится библиотека libUV, которая обрабатывает события, происходящие в операционной системе.

  • На диаграмме выше видно, что libUV подключается, запрашивая что-либо (например, открытие файла) у ОС.
  • Через некоторое время (пока v8 все еще работает без блокировки) ОС отправляет обратно событие, чтобы удовлетворить запрос libUV.
  • Затем событие помещается в очередь, в которой хранятся все завершенные события.
  • Затем Цикл событий постоянно проверяет, не произошло ли что-то внутри очереди.
  • Когда цикл событий находит завершенное событие, он обрабатывает его и отправляет обратный вызов.
  • Затем V8 выполнит обратный вызов, если текущий код выполнен, потому что он синхронный. Однако весь процесс является асинхронным.

Буфер. Место временного хранения данных, перемещаемых из одного места в другое. Он намеренно ограничен в размерах. Обычно эти данные поступают и перемещаются через Stream. Буфер в конечном итоге содержит необработанные двоичные данные. Таким образом, мы не очень часто имеем дело непосредственно с буферами. В большинстве случаев буферы возвращаются из какой-то другой утилиты.

Поток. Последовательность данных, доступных с течением времени (вместо попыток получить все данные сразу). Части данных в конечном итоге объединяются в единое целое. Например, просмотр потокового фильма через Интернет вместо загрузки полного фильма.

Каналы. Соединение двух потоков путем записи в один поток того, что читается из другого потока. В Node мы передаем данные из потока для чтения в поток для записи. Поскольку метод pipe возвращает целевой поток, мы можем связать другой вызов метода канала с целевым потоком (теперь доступным для чтения потоком) и потоком в другой доступный для записи поток.

V. Веб-сервер HTTP

Протокол. Набор правил, которые стороны договариваются использовать при общении. И клиент, и сервер запрограммированы на понимание и использование определенного набора правил.

TCP/IP:в модели клиент-сервер каждому компьютеру назначается уникальный IP-адрес (протокол Интернета), чтобы клиент и сервер могли идентифицировать друг друга. После идентификации друг друга клиент и сервер затем открывают сокетное соединение между ними. Мы отправляем информацию через это соединение сокета. Информация, которую мы отправляем, разбивается на небольшие пакеты данных и отправляется через сокет с одного компьютера на другой. Действие/способ разделения этой информации на небольшие пакеты и отправки их через сокет называется TCP (протокол управления передачей). Отдельный пакет информации может определяться другими протоколами, такими как HTTP, FTP, SMTP и другими. Операционная система поддерживает TCP/IP, а Node предоставляет нам доступ к этим функциям.

Порт. Таким образом, получив пакет, компьютер узнает, в какую программу его отправить. Когда программа настроена в операционной системе для получения пакетов с определенного порта, говорят, что программа «слушает» этот порт. Например, компьютер с IP-адресом 78.132.160.4 и запущенная программа NodeJs, прослушивающая порт 443, будет иметь полный адрес сокета 78.132.160.4:443 . Очевидно, мы обычно назначаем домен, который сопоставляется с адресом сокета, например https://www.google.com

Протокол передачи гипертекста (HTTP):набор правил (и формата) для пакета данных, передаваемых в Интернете с помощью протоколов TCP/IP. Например,

Методы HTTP (глаголы). Определяет тип действия, которое конкретный запрос хочет выполнить внутри самого запроса. ПОЛУЧИТЬ, ОТПРАВИТЬ, УДАЛИТЬ и т. д.

Интерфейс прикладного программирования (API): набор инструментов, доступных нам для создания программного приложения. В Интернете инструменты обычно доступны через набор URL-адресов, которые принимают и отправляют данные только через HTTP и TCP/IP. Другими словами, вместо того, чтобы возвращать веб-приложение, URL-адрес отправляет данные. Мы также можем отправлять данные на этот URL как часть нашего запроса HTTP, и API что-то сделает с этими данными.

Representational State Transfer (REST): архитектурный стиль для создания API. Это означает, что когда мы обрабатываем HTTP-запросы, мы решаем, что глаголы и URL-адреса что-то значат. Наличие RESTFul API означает, что вы проектируете свой API таким образом, чтобы он отвечал на глаголы HTTP-запроса так, как ожидается. Он стандартизирует способ использования HTTP-запросов, чтобы при отправке они соответствовали тому, что происходит на самом деле.

ВИ экспресс

Express: минималистичный веб-фреймворк для Node.js.

Промежуточное ПО: код, который находится между двумя уровнями программного обеспечения. В случае с Express, находится между запросом и ответом.

Статические файлы: файлы, которые никаким образом не обрабатываются кодом. Файлы HTML, CSS и изображения являются «статическими» файлами. Они просто загружаются на сервер и просто находятся там.

Готово…