Node.js. Основные понятия и технологии создания веб-приложений

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

Node.js был создан Райаном Далем (Ryan Dahl), развитием проекта сейчас занимается компания Joyent, крупный провайдер облачных вычислений в США. Серверная среда node.js состоит из 80% кода C/C++ (ядро) и 20% JavaScript API. Также применяются основные принципы и спецификации CommonJS.

Принцип работы Node.js

Прежде всего, Node.js отличается от классического JavaScript тем, что исполняемый код выполняется на стороне сервера (backend), а не на стороне браузера. Для интерпретации кода Node.js использует движок V8, который в настоящее время применяется в Google Chrome.

Архитектура Node.js

Кроме того, все механизмы обработки запросов и прочих операций ввода/вывода (I/O) построены на событиях. Это означает, что в Node.js нет никакого способа, чтобы заблокировать работающий в данный момент поток. Каждая операция в Node.js выполняется асинхронно. Это является огромным преимуществом, особенно если ваш код должен быть построен на операциях ввода-вывода: чтение дисков, подключение к базе данных, веб-сервисы и т.д.

В отличие от IIS или Apache, Node.js не используют многопоточную модель. В Node.js есть только один рабочий поток, который обслуживает все запросы пользователей и отвечающие ресурсы (на рисунке обозначено в виде ST звезды). И существует POSIX бассейн асинхронных потоков Node.js, который содержит множество асинхронных потоков (AT звезды) для операций ввода-вывода.

Структура потока Node.js

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

Пользовательский запрос в node.js

Предположим, перед завершением предыдущего AT потока операции ввода-вывода заходит другой пользователь. При этом ST поток будет обслуживать новый запрос пользователя и для него будет подобран уже другой AT поток с POSIX.

Асинхронный поток в Node.js

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

Возвращение потока в Node.js

Возвращение потока в Node.js

Преимущества Node.js

Как вы могли заметить, в Node.js есть только один поток, который обслуживает клиентские запросы и получает POSIX результаты.  Цикл между пользователем и интерфейсом POSIX дает возможность передавать данные туда и обратно, а сами асинхронные операции осуществляются в POSIX. Данная модель получила название event-driven non-blocking IO model.

Производительность в такой системе гораздо выше, чем, если использовалась многопоточная модель (multi-threaded blocking model). Примером многопоточной модели является веб-сервер Apache и Nginx. Ниже представлены их показатели производительности.

Сравнение производительности Apache и Nginx

И ниже приводится сравнение памяти между ними.

Сравнение производительности памяти Apache и Nginx

Node.js на Windows

Чтобы запустить Node.js приложение в Windows необходимо выполнить несколько простых шагов. Во-первых, вам необходимо скачать последнюю версию платформы с официального сайта http://nodejs.org/ После установки программы выберите системную папку, где будет хранится исходные файлы. Для подтверждения установки откройте командную строку (консоль) и введите команду «node».  В случае успешной установки вы увидите такой результат:

Командная строка Node.js

Как вы могли заметить, у нас получилась интерактивная консоль JavaScript. Чтобы запустить JavaScript приложение Node.js, просто укажите название файла с исходным кодом и в качестве аргумента введите команду «node».

Создадим простое приложение Node.js с названием "helloworld.js. Пример кода:

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at <a href="http://127.0.0.1:1337/'">http://127.0.0.1:1337/'</a>);

Этот код создает веб-сервер с портом 1337 и возвращает сообщение “Hello World”.  Вводим команду node helloworls.js в консоле и открываем браузер с адресом http://localhost:1337/.

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

NPM и модули Node.js

Для создания сайта, Node.js необходимо использовать как один из многочисленных модулей платформы CommonJS. Модуль представляет собой набор файлов JavaScript. В Node.js, если у нас есть файл с именем «index.js», то все модули должны размещаться в папке «node_modules». А в индексном файле необходимо импортировать подключенные модули, указав имя на его название. Например, в предыдущем листинге мы импортировали модуль с именем "HTTP", который является уже встроенным в Node.js.

На сегодняшний день существует около 18 000 модулей для node.js, которые можно найти на сайте NPM https://npmjs.org. В день осуществляется более 300 000 загрузок.

Установка модуля довольно проста. Для этого в командной строке введите сообщение «npm install express». Эта команда установит модуль с именем "express", который является MVC Framework для Node.js.

Установка MVC Framework для Node.js

Создадим другой файл JavaScript с названием "helloweb.js" и скопируем в него данный код:

var express = require("express");
var app = express();
app.get("/", function(req, res) {
res.send("Hello Node.js and Express.");
});
 
app.get("/Echo/:value", function(req, res) {
var value = req.params.value;
res.json({
"Value" : value,
"Time" : new Date()
});
});
 
console.log("Web application opened.");
app.listen(12345);

console.log("Web application opened.");
app.listen(12345);

В первой строчке кода мы импортировали модуль "express". Приложение выводит на экран сообщение Hello Node.js and Express. А если пользователь введет произвольный адрес в http://localhost:12345/Echo/Hello laby  , то в браузер будет передаваться данное сообщение и текущее время (результат JSON).

Модуль "express"  помогает разрабатывать полноценные MVC веб-сайт. Только для этого фреймворка  существует большое количество утилит, позволяющее упростить работу над созданием веб-проекта:

- underscore (http://documentcloud.github.com/underscore/): Утилита добавляет много необходимых функций: карта (map), выбор (select), вызов (invoke ) и и др.
- request (https://npmjs.org/package/request). Удобный и простой HTTP клиент.
- async (https://npmjs.org/package/async). Библиотека для создания асинхронных операций.
- wind (https://npmjs.org/package/wind). Библиотеки, которые позволяют управлять потоками с обычным JavaScript без предварительной компиляции кода.

Проекты с использованием Node.js

  • Яндекс.Почта
  • GMail
  • Почта mail.ru
  • XMPP-сервер Вконтакте
  • Transload.it (сервис перекодирования видео)
  • Облачный хостинг Joyent
  • Облачный хостинг Heroku
  • Geometria.ru
  • Проект Academia.edu
  • Корпоративная социальную сеть Yammer

В данной статье мы рассмотрели основные принципы архитектуры Node.js, способы построения веб-приложений, этапы установки платформы на ОС Windows и импорт необходимых модулей для создания веб-сайтов.