суббота, 21 июля 2012 г.

Обзор веб-фреймворка Nitrogen

Nitrogen - веб-фреймворк написанный на Erlang. Главное достоинство этого фреймворка - возможность легко и быстро создавать интерактивные приложения взаимодействующие с сервером с помощью Ajax. Создание comet соединения требует буквально нескольких строк кода. Пример простейшего чата на основе Nitrogen занимает менее страницы кода.

Основной язык для Nitorgen это Erlang. Javascript явно не используется, хотя jQuery и используется для клиентской части. Специфика Erlang позволяет обойтись без зависимости от внешней базы данных для поддержки функционала сессий. Впрочем Erlang значительно упрощает предоставление общего доступа для всего кластера к данным находящимся на одном узле. Так же благодаря Erlang есть возможность использовать различные встроенные веб-сервера - встроенный inets, давно известный Yaws, недавно появившийся Cowboy. Руководство, документация.

Маршрутизация в Nitrogen динамическая. Она строится на основании имен модулей. Корень сайта это index.erl. Подчеркивания преобразуются в слеши, например: http://localhost:8000/routes/to/a/module будет обработан модулем routes_to_a_module.erl. Модуль выбирается по наиболее длинному совпадению: http://localhost:8000/routes/to/a/module/foo/bar будет обработан модулем routes_to_a_module.erl. Путь для которого не найден модуль обрабатывается модулем web_404.erl если он существует. Подробности

Страница рендерится из шаблона. Шаблон - это HTML файл с вставками вызовов функций Erlang [[[module:function(Args)]]]. Специальное имя модуля page ссылается на текущую страницу. Хотя вызов функции выглядит похожим на обычный код Erlang - это не так. Вызов функции должен обязательно быть в форме module:function(Args). Так же возможно задавать вызовы для Javascript в виде [[[script]]]. Подробности

Система шаблонов подходит для описания статичной раскладки страницы. Для динамических частей предназначены Элементы (Nitrogen Elements). Элемент это HTML или запись (Erlang record) с данными, которая рендерится в HTML. Пример простейшего элемента это #p{text="Text."} который будет отрендерен в <p class="wfid_temp790097 p">Text.</p>. Элементы могут быть вложенными и Элементы могут быть связаны с Действиями. Подробности

Действия (Nitrogen Actions) это Javascript код или запись (Erlang record) которая рендерится в Javascript. Действия могут быть включены в Элемент с использованием свойства action или связаны с Элементом с помощью функции wf:wire/N. Действие может быть простым визуальным эффектом или сложным взаимодействием с сервером. Действие иницируются объктами заданными в свойстве Триггер и изменяют объекты указанные в свойстве Цель. Действия работают на клиенте. Подробности

Передача контроля от клиента к серверу производится с помощью События (Nitrogen Event) у которого заполнено свойство postback=term. На сервере Событие обрабатывается функцией event/1. Используя wf:update/2, wf:insert_top/2, wf:insert_bottom/2, wf:replace/2, wf:remove/1 в функции event/1 можно изменять Элементы на клиенте. Подробности

События обычно инициируются клиентом. Когда нужно обновлять данные на клиенте постоянно используют технологию Comet. Comet инициируется клиентом как обычный запрос, но соединение не закрывается. Когда сервер имеет данные для клиента - сущестующее соединение используется для передачи данных. Nitrogen значительно упрощает использование Comet. Функции wf:comet/N запускают заданную функцию как независимый процесс. Этот процесс может сам собирать данные для клиента или ожидать данные от других процессов. Функция wf:send/2 позволяет отправить сообщение существующему процессу Comet. Подробности

Пример простейшего чата из Руководства:
body() -> 
    wf:comet_global(fun() -> repeater() end, repeater_pool),
    [
        #textbox { id=msg, text="Your message...", next=submit },
        #button { id=submit, text="Submit", postback=submit },
        #panel { id=placeholder }
    ].

event(submit) ->
    ?PRINT(wf:q(msg)),
    wf:send_global(repeater_pool, {msg, wf:q(msg)}).

repeater() ->
    receive 
        {msg, Msg} -> wf:insert_top(placeholder, [Msg, "<br>"])
    end,
    wf:flush(),
    repeater().

Наилучшей областью применения Nitrogen будут интерактивные приложения взаимодействующие с пользователем и с группами пользователе весь период работы, например игры или панель управления с активным обновлением статистики и интерактивными элементами управления. Для классических сайтов большая часть содержимого которых статично и время уведомления пользователя про обновления не имеет особого значения применять Nitrogen будет бесполезной тратой времени и усилий.