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.
Кроме того, все механизмы обработки запросов и прочих операций ввода/вывода (I/O) построены на событиях. Это означает, что в Node.js нет никакого способа, чтобы заблокировать работающий в данный момент поток. Каждая операция в Node.js выполняется асинхронно. Это является огромным преимуществом, особенно если ваш код должен быть построен на операциях ввода-вывода: чтение дисков, подключение к базе данных, веб-сервисы и т.д.
В отличие от IIS или Apache, Node.js не используют многопоточную модель. В Node.js есть только один рабочий поток, который обслуживает все запросы пользователей и отвечающие ресурсы (на рисунке обозначено в виде ST звезды). И существует POSIX бассейн асинхронных потоков Node.js, который содержит множество асинхронных потоков (AT звезды) для операций ввода-вывода.
Когда пользователь отправляет запрос ввода-вывода, отдельный ST поток обслуживает его, однако он не будет выполнять операции ввода-вывода. Вместо этого, ST поток будет идти в бассейн POSIX асинхронных потоков, чтобы забрать AT поток, произвести операцию до конца, а затем обратно вернуться в исходное состояние для проведения любых других запросов. Таким образом, AT поток будет выполнять операции ввода-вывода асинхронно.
Предположим, перед завершением предыдущего AT потока операции ввода-вывода заходит другой пользователь. При этом ST поток будет обслуживать новый запрос пользователя и для него будет подобран уже другой AT поток с POSIX.
Возвращение потока у двух пользователей будет работать по той же схеме, что и отправление запроса.
Преимущества Node.js
Как вы могли заметить, в Node.js есть только один поток, который обслуживает клиентские запросы и получает POSIX результаты. Цикл между пользователем и интерфейсом POSIX дает возможность передавать данные туда и обратно, а сами асинхронные операции осуществляются в POSIX. Данная модель получила название event-driven non-blocking IO model.
Производительность в такой системе гораздо выше, чем, если использовалась многопоточная модель (multi-threaded blocking model). Примером многопоточной модели является веб-сервер Apache и Nginx. Ниже представлены их показатели производительности.
И ниже приводится сравнение памяти между ними.
Node.js на Windows
Чтобы запустить Node.js приложение в Windows необходимо выполнить несколько простых шагов. Во-первых, вам необходимо скачать последнюю версию платформы с официального сайта http://nodejs.org/ После установки программы выберите системную папку, где будет хранится исходные файлы. Для подтверждения установки откройте командную строку (консоль) и введите команду «node». В случае успешной установки вы увидите такой результат:
Как вы могли заметить, у нас получилась интерактивная консоль 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.
Создадим другой файл 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 комментариев
Помогите разобраться. Решил
Помогите разобраться. Решил попробовать 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
node.js это не серверная
node.js это не серверная реализация js, это просто отдельная от браузера реализация, для работы javascript как отдельного приложения;
серверные приложения легко создавать(класс http.Server), но не обязательно при написании программы