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

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

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

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

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

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

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

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

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

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

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

ты хоть сам понял что за бред ты написал?)))

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

Привет! Мы запилили поддержку Node.js на всех тарифных планах виртуального хостинга (не на VDS/VPS и не на облаке, а на shared!) и сейчас очень нуждаемся в обратной связи, а для этого нужно больше живых проектов на Node.js.

У всех тарифов есть бесплатный тестовый период: sprinthost. Регистрируйтесь, создавайте приложение, присылайте замечания, пожелания и вопросы на support@sprinthost.ru или в группу https://vk.com/sprinthost, мы будем бесконечно благодарны.

Что нужно знать:
В каталоге с приложением ( ~/domains/example.org/public_html ) создаем файл app.js со следующим содержимым:
require('/home/login/domains/example.org/public_html/index.js');
process.chdir('/home/login/domains/example.org/public_html');

Создаем файл .htaccess в этом же каталоге и добавляем в него правило:
PassengerStartupFile app.js
PassengerResolveSymlinksInDocumentRoot on
Require all granted
PassengerAppType node
PassengerAppRoot /home/login/domains/example.org/public_html
Options -MultiViews

Для работы приложений у нас используется Phusion Passenger https://www.phusionpassenger.com/#about

Добавить комментарий

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.