Вы находитесь на странице: 1из 5

NodeLerning

Node.js — асинхронная среда выполнения JavaScript, управляемая событиями,


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

Node.js — это однопоточная кроссплатформенная среда выполнения с открытым исходным


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

При разработке Node.js за основу был взят движок выполнения JavaScript под названием V8,
который был создан компанией Google и использовался в браузере Google Chrome. Так как
после создания Node.js Javascript код можно запустить фактически в любой среде, с помощью
этой библиотеки можно написать не только фронтенд, но и серверную часть веб-приложения.

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

Оба эти свойства делают Node.js крайне быстрым и обеспечивают лучший пользовательский
интерфейс.

- Архитектура, управляемая событиями Термин «управляемый событиями» означает, что код


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

- Однопоточная работа В Node.js все запросы однопоточные и собираются в цикле обработки


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

- Совместимость с несколькими платформами Как мы уже обсуждали ранее, Node.js можно


использовать на разных системах, от Windows до Mac OS, Linux, и даже на мобильных
платформах. Это позволяет создать самодостаточную среду в любой области разработки.

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

Веб-приложения, написанные следуя клиент/серверной архитектуре, работают по следующей


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

Значит ли это, что сервер может обрабатывать только один запрос за раз? Не совсем! Когда
сервер получает новый запрос он создаёт отдельный поток для его обработки.

Поток, если простыми словами, это время и ресурсы, что CPU выделяет на выполнение
небольшого блока инструкций. С учётом сказанного, сервер может обрабатывать несколько
запросов одновременно, но только по одному на поток. Такая модель так же
называться thread-per-request model.

- Собственный пакет модулей, который обеспечивает предсказуемую сборку при создании


сложных проектов. В Node.js есть возможность использовать npm — самый большой
пакетный менеджер.

- Микросервисная архитектура. Node.js подходит для построения микросервисных


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

В чём преимущество Node?

C Node проще масштабироваться. При одновременном подключении к серверу тысяч


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

Пользователь стучится на http://yourstore.com/products и сервер рендерит HTML файл со


всеми продуктами с базы данных в ответ. Совсем не сложно, да?

Но, что же происходит за кулисами?

 Когда пользователь стучится на /products особый метод или функция должна выполниться,
что бы обработать запрос. Маленький кусочек кода (Ваш или фреймворка) анализирует URL-
адрес запроса и ищет подходящий метод или функцию. Поток работает.
 Теперь нужный метод или функция выполняться, так как и в первом пункте — поток
работает.
 Так как Вы хороший разработчик, Вы сохраняете все системные логи в файл, ну и конечно
же, что бы быть уверенными, что роутер выполняет нужный метод/функцию — Вы так же
логируете строку "Method X executing!!». Но всё это блокирующие операции
ввода/вывода. Поток ждёт.

 Все логи сохранены и следующие строки функции выполняются. Поток работает снова.
 Время обращаться к базе данных и получать все продукты – простой запрос, вроде SELECT *
FROM products, выполняет свою работу, но угадайте что? Да-да, это блокирующая операция
ввода/вывода. Поток ждёт.
 Вы получили массив или список всех продуктов, но убедитесь, что Вы всё это
залогировали. Поток ждёт.
 Теперь у Вас есть все продукты и пришло время рендерить шаблон для будущей страницы, но
перед этим Вам нужно их прочитать. Поток ждёт.

 Движок рендеринга делает свою работу и шлёт ответ клиенту. Поток работает снова.

 Поток свободен, словно птица в небесах.

Серверный JavaScript не был чем-то новым и необычным в начале 2000-х, на тот момент уже
существовали реализации поверх JVM (java virtual machine) – RingoJS и AppEngineJS, что
работали на модели thread-per-request.
Но если они не смогли решить проблему, тогда как Node.js смог?! Всё из-за того, что
JavaScript однопоточный.

Node.js и цикл событий


Давайте напишем маленький пример:

// Importing native http module


const http = require('http');

// Creating a server instance where every call


// the message 'Hello World' is responded to the client
const server = http.createServer(function(request, response) {
response.write('Hello World');
response.end();
});

// Listening port 8080


server.listen(8080);

Non-blocking I/O
Node.js использует неблокирующие ввод/вывод операции, что же это значит:

 Главный поток не будет блокироваться операциями ввода/вывода.


 Сервер будет продолжать обслуживать запросы.
 Нам придётся работать с асинхронным кодом.

Давайте напишем пример, в котором на запрос к /home сервер в ответ шлёт HTML страницу, а
для всех других запросов — 'Hello World'. Что бы отослать HTML страницу сначала ее нужно
прочитать из файла.

home.html

<html>
<body>
<h1>This is home page</h1>
</body>
</html>

index.js
const http = require('http');
const fs = require('fs');

const server = http.createServer(function(request, response) {


if (request.url === '/home') {
fs.readFile(`${ __dirname }/home.html`, function (err, content) {
if (!err) {
response.setHeader('Content-Type', 'text/html');
response.write(content);
} else {
response.statusCode = 500;
response.write('An error has ocurred');
}

response.end();
});
} else {
response.write('Hello World');
response.end();
}
});

server.listen(8080);

Если запрашиваемый url-адрес /home, тогда используется нативный модуль fs для чтения
файла home.html. Функции что попадают в http.createServer и fs.readFile как аргументы
— колбэки. Эти функции будут выполнены в какой-то из моментов в будущем (Первая, как
только сервер получит запрос, а вторая — когда файл будет прочитан с диска и помещён в
буфер). Пока файл считывается с диска, Node.js может обрабатывать другие запросы и даже
считывать файл снова и всё это в одном потоке.

Express.js

Express.js - это минималистичный и гибкий фреймворк для разработки веб-приложений на


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

Допустим, мы хотим создать простое веб-приложение, которое будет отображать "Hello


World" на главной странице. Для этого мы можем использовать Express.js. Ниже пример кода:

const express = require('express'); // подключаем модуль express

const app = express(); // создаем экземпляр приложения

app.get('/', (req, res) => {


// создаем маршрут для главной страницы
res.send('Hello World!'); // отправляем ответ на запрос
});

app.listen(3000, () => {
// запускаем сервер на порту 3000
console.log('Server started on port 3000');
});
В этом примере мы подключаем модуль express, создаем экземпляр приложения, создаем
маршрут для главной страницы, отправляем ответ на запрос и запускаем сервер на порту
3000. Когда мы запускаем этот код и переходим на http://localhost:3000, мы увидим текст
"Hello World!".

Что такое среда разработки Express?

Среда разработки Express включает в себя установку Nodejs, менеджера пакетов NPM и
(необязательно) Express Application Generator на локальном компьютере.

Узел и менеджер пакетов NPM устанавливаются вместе из подготовленных двоичных


пакетов, установщиков, менеджеров пакетов операционной системы или из исходного кода
(как показано в следующих разделах). Затем Express устанавливается NPM как зависимость от
ваших отдельных веб-приложений Express (наряду с другими библиотеками, такими как
механизмы шаблонов, драйверы баз данных, промежуточное программное обеспечение для
аутентификации, промежуточное программное обеспечение для обслуживания статических
файлов и т. Д.)

NPM также можно использовать для (глобальной) установки Express Application Generator,
удобного инструмента для создания каркасных веб-приложений Express, которые следуют
шаблону MVC. Генератор приложений является необязательным, поскольку вам не нужно
использовать этот инструмент для создания приложений, использующих Express, или для
приложений для создан Express, имеющих одинаковую архитектурную разметку или
зависимости. Мы будем использовать его, потому что это значительно облегчает начало
работы и продвигает модульную структуру приложения.

Примечание: Примечание: в отличие от некоторых других веб-сред, среда разработки не


включает отдельный веб-сервер разработки. В Node / Express веб-приложение создаёт и
запускает собственный веб-сервер!

Существуют и другие периферийные инструменты, которые являются частью типичной


среды разработки, в том числе текстовые редакторы или IDE для редактирования кода и
инструменты управления исходным кодом, такие как Git, для безопасного управления
различными версиями вашего кода. Мы предполагаем, что вы уже установили подобные
инструменты (в частности, текстовый редактор).

Вам также может понравиться