Академический Документы
Профессиональный Документы
Культура Документы
При разработке Node.js за основу был взят движок выполнения JavaScript под названием V8,
который был создан компанией Google и использовался в браузере Google Chrome. Так как
после создания Node.js Javascript код можно запустить фактически в любой среде, с помощью
этой библиотеки можно написать не только фронтенд, но и серверную часть веб-приложения.
Основные характеристики:
- Важная особенность Node.js — асинхронный характер. Термин асинхронный означает, что
сервер, созданный с использованием Node.js, не должен ждать, пока вернутся данные, при
выполнении различных внутренних запросов. При этом он также имеет неблокирующий ввод-
вывод. Это значит, что несколько различных процессов могут выполняться параллельно, не
блокируя друг друга.
Оба эти свойства делают Node.js крайне быстрым и обеспечивают лучший пользовательский
интерфейс.
- Быстрая потоковая передача данных Node.js использует движок выполнения JavaScript V8.
Этот движок также используется в браузере Google Chrome. Благодаря этому работа Node.js
значительно ускоряется, а следовательно, обеспечивается очень быстрая потоковая передача
данных для веб-приложения.
Значит ли это, что сервер может обрабатывать только один запрос за раз? Не совсем! Когда
сервер получает новый запрос он создаёт отдельный поток для его обработки.
Поток, если простыми словами, это время и ресурсы, что CPU выделяет на выполнение
небольшого блока инструкций. С учётом сказанного, сервер может обрабатывать несколько
запросов одновременно, но только по одному на поток. Такая модель так же
называться thread-per-request model.
Когда пользователь стучится на /products особый метод или функция должна выполниться,
что бы обработать запрос. Маленький кусочек кода (Ваш или фреймворка) анализирует URL-
адрес запроса и ищет подходящий метод или функцию. Поток работает.
Теперь нужный метод или функция выполняться, так как и в первом пункте — поток
работает.
Так как Вы хороший разработчик, Вы сохраняете все системные логи в файл, ну и конечно
же, что бы быть уверенными, что роутер выполняет нужный метод/функцию — Вы так же
логируете строку "Method X executing!!». Но всё это блокирующие операции
ввода/вывода. Поток ждёт.
Все логи сохранены и следующие строки функции выполняются. Поток работает снова.
Время обращаться к базе данных и получать все продукты – простой запрос, вроде SELECT *
FROM products, выполняет свою работу, но угадайте что? Да-да, это блокирующая операция
ввода/вывода. Поток ждёт.
Вы получили массив или список всех продуктов, но убедитесь, что Вы всё это
залогировали. Поток ждёт.
Теперь у Вас есть все продукты и пришло время рендерить шаблон для будущей страницы, но
перед этим Вам нужно их прочитать. Поток ждёт.
Движок рендеринга делает свою работу и шлёт ответ клиенту. Поток работает снова.
Серверный JavaScript не был чем-то новым и необычным в начале 2000-х, на тот момент уже
существовали реализации поверх JVM (java virtual machine) – RingoJS и AppEngineJS, что
работали на модели thread-per-request.
Но если они не смогли решить проблему, тогда как Node.js смог?! Всё из-за того, что
JavaScript однопоточный.
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');
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
app.listen(3000, () => {
// запускаем сервер на порту 3000
console.log('Server started on port 3000');
});
В этом примере мы подключаем модуль express, создаем экземпляр приложения, создаем
маршрут для главной страницы, отправляем ответ на запрос и запускаем сервер на порту
3000. Когда мы запускаем этот код и переходим на http://localhost:3000, мы увидим текст
"Hello World!".
Среда разработки Express включает в себя установку Nodejs, менеджера пакетов NPM и
(необязательно) Express Application Generator на локальном компьютере.
NPM также можно использовать для (глобальной) установки Express Application Generator,
удобного инструмента для создания каркасных веб-приложений Express, которые следуют
шаблону MVC. Генератор приложений является необязательным, поскольку вам не нужно
использовать этот инструмент для создания приложений, использующих Express, или для
приложений для создан Express, имеющих одинаковую архитектурную разметку или
зависимости. Мы будем использовать его, потому что это значительно облегчает начало
работы и продвигает модульную структуру приложения.