Node.js – стиль и фреймворки
После PHP писать для Node приятно. Конечно, это дело субъективное, но лично мне JavaScript теперь кажется куда более подходящим языком для Web-приложений. Добавьте сюда то что теперь один язык можно использовать и на клиенте, и на сервере. К тому же стиль программ (event-driven) уже знаком большинству веб-программистов из опыта клиентского JavaScript.
Стиль программирования
Если Вам случалось писать PHP-скрипты под FastCGI, стиль Node тоже должен показаться Вам знакомым. И в том и в другом случае на сервере крутится один скрипт, выполняя запросы последовательно. Правда, настоящий FastCGI интерфейс для Node пока в стадии разработки. Он даст ещё несколько возможностей – например, позволит подключать стандартные балансировщики нагрузки.
JavaScript изначально более приспособлен для асинхронных вызовов, чем PHP. Например, вот так может выглядеть URL router/matcher:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | var app = [ // этот коллбек будет отвечать только на GET-запросы [get(/^\/hello\/(\w+)$/), function(req, res, name) { // сессия доступна в каждый вызов req.session["name"] = name; // respond получает строку и выставляет дефолтные заголовки: // Content-Type: text/html, Content-Length: длина строки res.respond("Hello, " + name + "!"); }], // Этот коллбек будет отвечать на любой метод [/^\/goodbye$/, function(req, res) { var name = req.session["name"]; var message = "Goodbye, " + (name || "I hardly knew thee") + "!"; // respond получает объект, состоящий из контента и заголовков // подставляя дефолтные значения для не указанных res.respond({content: message, headers: {"Content-Type": "text/plain"}}); }] ]; |
Т.е. просто набор регулярных выражений с callback’ами. Этот кусок взят из руководства к фреймворку nerve для Node. Nerve пока тоже в процессе создания, но уже позволяет сделать небольшой сайт без особых усилий. Во фреймворке присутствуют роутер URL, базовая работа с сессиями и cookies, возможности для создания SSL-сайтов и шаблонизатор.
Шаблонизаторы
Шаблонизаторы для Node обычно действуют по одному и тому же принципу: преобразовывают шаблон к функции, принимающей аргументы шаблона, эдакий карринг. Плюсы такого подхода очевидны: V8 скомпилирует функцию в очень быстрый код, который вполне можно положить в общую память и не компилировать для каждого запроса в отдельности. В PHP для этого есть Smarty, но Node+nerve имхо для этого удобнее — изучить как следует один язык гораздо легче чем два. В случае Smarty же приходится изучать ещё и его синтаксис, в дополнение к PHP.
Можно конечно использовать шаблонизаторы с синтаксисом, отличным от JavaScript, основанные исключительно на тексте — например шаблонизатор, предоставляемый библиотекой Underscore.
Хранение данных
Вообще общая память в Node — самое естественное место для хранения небольших данных. Она не копируется для каждого подключения, данные в неё можно положить данные один раз при запуске скрипта и т.д. Конечно, страницы сайта удобнее хранить в каком-либо хранилище типа Redis, для которого уже сделан коннектор к Node.
Кроме того, из Node можно подключаться к MySQL с помощью DBSlayer — уровня абстракции БД, написанного на C специально для конкурентных веб-приложений.
Производительность
Замерять производительность Node в сравнении с Rhino пока не очень получилось — возникли трудности с установкой Java на виртуалку
Предварительные результаты: для Node в виртуальной машине и Rhino на обычной разница примерно в 6-7 раз, но это для единовременного выполнения скрипта. В случае обработки серии запросов Rhino будет ещё больше отставать из-за времени, необходимого на запуск JVM. Посмотрим, возможно получится как то запустить его в таком же режиме как Node.
Источник: Механический мир
Нет обратных ссылок на эту запись.
Сентябрь 2nd, 2010 - 17:47
Я могу ошибаться, но вряд ли старт JVM в Rhino осуществляется каждый запрос.
Сентябрь 25th, 2010 - 08:58
Rhino это просто виртуальная машина. Стартовать его каждый раз или нет – вопрос архитектуры веб-сервера. Narwhal вроде висит в памяти и обрабатывает запросы по мере поступления.