Node.js – стиль и фреймворки
После PHP писать для Node приятно. Конечно, это дело субъективное, но лично мне JavaScript теперь кажется куда более подходящим языком для Web-приложений. Добавьте сюда то что теперь один язык можно использовать и на клиенте, и на сервере. К тому же стиль программ (event-driven) уже знаком большинству веб-программистов из опыта клиентского JavaScript.
Стиль программирования
Если Вам случалось писать PHP-скрипты под FastCGI, стиль Node тоже должен показаться Вам знакомым. И в том и в другом случае на сервере крутится один скрипт, выполняя запросы последовательно. Правда, настоящий FastCGI интерфейс для Node пока в стадии разработки. Он даст ещё несколько возможностей – например, позволит подключать стандартные балансировщики нагрузки.
JavaScript изначально более приспособлен для асинхронных вызовов, чем PHP. Например, вот так может выглядеть URL router/matcher:
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.
Обратные ссылки и уведомления