ВВЕДЕНИЕ

Node JS — это версия Java Script, разработанная для реализации бэкенда в приложениях. Райан Даль считается отцом Node JS. Node JS был разработан в результате работы над языком для создания веб-сайтов в реальном времени с возможностями push (веб-сокеты). Разработанный таким образом Node JS представляет собой кроссплатформенную среду выполнения с открытым исходным кодом для серверных и сетевых приложений.

Node JS становится высокоэффективным по нескольким причинам.

  1. Он построен на движке V8, движок java-скриптов Chrome обеспечивает кроссплатформенные функциональные возможности.
  2. Неблокирующая модель ввода-вывода делает ее легкой и эффективной.
  3. Содержит несколько библиотек java-скриптов, помогающих в базовом программировании.
  4. Экосистема Node JS — это «npm», крупнейшая в мире библиотека с открытым исходным кодом.

Цикл событий Node JS

Как основной поток обрабатывается на протяжении всего цикла обработки событий?

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

Процесс происходит следующим образом,

  1. Команда «Читать файл» дается основному потоку для «чтения определенного файла».
  2. Сразу после получения этой команды основной поток сообщит циклу обработки событий, что ему требуется «прочитать файл, упомянутый командой». (В этот момент, когда цикл событий находится поверх базового пула потоков, он передаст запрошенную операцию в пул потоков. Следовательно, базовый пул потоков будет выполнять операцию чтения упомянутого файла).
  3. Следующая команда «отправить HTTP-запрос» дается основному потоку для «отправки HTTP-запроса».
  4. Как и в предыдущем сценарии, основной поток инструктирует цикл событий выполнить команду, которая в конечном итоге будет передана в базовый пул потоков.
  5. Следующая команда «отправить запрос БД» дается основному потоку для «отправки запроса БД».
  6. Опять же, как и в предыдущем сценарии, основной поток инструктирует цикл событий для выполнения команды, которая в конечном итоге будет передана в базовый пул потоков.

Следует отметить, что когда основной поток получает команду «отправить HTTP-запрос», он свободен, поэтому принимает команду. Так что же случилось с функцией «Чтение файла»?

Это концепция неблокирующего ввода-вывода. Проще говоря, как только основной поток получил команду «Прочитать файл», он был передан в четный цикл, а затем в пул потоков. Таким образом, пока «Чтение файла» обрабатывается внутри пула потоков, основной поток освобождается и принимает новый запрос. Предположим, что в середине приема нового запроса пул потоков также завершил предыдущую задачу и хочет отправить результат, но это невозможно сделать (из-за неблокирующего характера ввода-вывода). Пока основной поток не будет полностью свободен, базовый пул потоков не может прервать основной поток ни при каком сценарии. На рисунке 2 вы можете видеть оранжевые слоты, куда базовый пул потоков отправлял результаты операций, над которыми он работал.

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

Учитывая функции, которые инкапсулирует Node JS, можно понять, что

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

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

  1. Приложения, привязанные к вводу-выводу
  2. Приложения для потоковой передачи данных
  3. Приложения с интенсивным использованием данных в реальном времени
  4. Приложения на основе JSON API
  5. Одностраничные приложения

Преимущества и недостатки NodeJS

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

  1. Создайте проект Node JS -> npm init

Это инициализирует проект node JS, создав package.json. Этот package.json будет содержать всю информацию, связанную с JS-приложением узла, такую ​​как имя, версия, автор, репозиторий, требуемая версия узла, сценарии, зависимости и т. д. И файл будет помещен в корневой каталог приложения.

В приведенной выше команде мы использовали npm, так что же это такое?

Что такое диспетчер пакетов Node (npm)?

Многоразовые компоненты NodeJS легко доступны через онлайн-репозиторий. Он содержит встроенную версию и управление зависимостями, а также встроенные механизмы сценариев. Глобальные установки будут доступны во всей системе, тогда как локальные установки будут доступны только для этого конкретного приложения. По умолчанию все зависимости будут установлены в каталог node_modules.

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

● Меньше или равно «‹=», больше или равно «›=».

● Приблизительно эквивалентно «~».

● Совместимо с ‘^’.

● Любой «*».

● Любой «1.2.x».

● Последний «последний»

Следует отметить, что существует два типа зависимостей: «devDependencies» (зависимости времени разработки) и «зависимости» (зависимости времени выполнения приложения).

Простой «Hello World» можно реализовать следующим образом.

Теперь попробуем прочитать простой файл «hello.txt».

Когда мы хотим управлять файлами, например, при чтении или записи файлов в Node JS, есть встроенная библиотека («fs»), которую мы можем использовать. Однако для этого сначала нам нужно импортировать его в код.

Примечание. Импорт модуля означает, что вы используете модуль, а экспорт модуля означает, что вы делаете модуль повторно используемым.

Эти импорт и экспорт мы можем сделать двумя способами.

  1. Общий JS

2. Паттерн ES6

Сначала попробуем прочитать файл hello.txt, используя Common JS Pattern. Здесь мы создали файл Reader.js как отдельный модуль и экспортируем его.

Затем в app.js мы используем этот экспортированный модуль для чтения файла, передавая имя файла функции импортированного модуля, как показано ниже.

Мы можем преобразовать этот точный код в шаблон ES6, просто изменив шаблоны импорта и экспорта.

Важно: Иногда, когда версии npm не поддерживают ES6, это может привести к ошибкам, поэтому в этом случае вам нужно изменить файл package.json с новым атрибутом «тип»: «модуль».

Теперь давайте попробуем код, как использовать writeStream() и readStream(), когда мы хотим прочитать файл и записать этот прочитанный файл в новый файл.

Во фрагменте кода сначала мы создаем поток записи с именем «createWriteStream», а затем мы создаем поток чтения с именем «createReadStream». Затем мы передаем файл, который мы хотим прочитать, в созданный поток чтения (readStream) и имя нового файла в созданный поток записи (writeStream). Позже readStream передаст содержимое, которое он прочитал, в новый файл . Следует отметить, что хотя на первый взгляд он выглядит синхронным, этот код полностью асинхронен, поскольку мы используем узел JS.

Теперь давайте попробуем создать http-веб-сервер с помощью Node JS.

Как вы можете видеть на рисунке 13, наша http-библиотека также доступна с Node JS, поэтому мы можем просто импортировать ее и использовать с createServer((callback)).listen(port);

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

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

Давайте встретимся снова с другим блогом в следующий раз. А пока вы можете следить за мной на github @HKariyawasam, если вам интересно взглянуть на фрагменты кода, которые я использовал в блоге.