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

Время чтения
1 минут
Прочитано

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

ноября 19, 2012 - 14:35
3 комментариев

Эволюция 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 http://127.0.0.1:1337/');

Этот код создает веб-сервер с портом 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 и импорт необходимых модулей для создания веб-сайтов.

Добавлено 3 комментариев

Аватар пользователя Anton Furs

Помогите разобраться. Решил попробовать NODE.JS, пока на Виндовс, скачал и установил *.msi.
Так вот если я напишу код (даже простое console.log('123')) в файле test.js, и затем запущу
в консоли node test.js, то мне упорно выдаёт ошибку: cannot find module test.js (все пути у меня
прописались в PATH,с этим проблем нет). почему она не запускает мой скрипт, а думает что
это модуль, и что-то пытается подключить?
п.с. если запускать так: node -e "console.log('123')" то скрипт в строке выполняется нормально,
даже сервер на порту пробовал создавать, работает, но писать всё в одну строку разумеется
не удобно.

Аватар пользователя Александр Лялюк

Вам необходимо вводить полный пусть к файлу начиная с буквы диска. node C:/... .../test.js

Аватар пользователя qq1

node.js это не серверная реализация js, это просто отдельная от браузера реализация, для работы javascript как отдельного приложения;
серверные приложения легко создавать(класс http.Server), но не обязательно при написании программы