Skip to content

Node.js — стиль и фреймворки

22/12/2009

После 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.

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: