Жизнь без шаблонов
Я хотел бы поделиться впечатлениями после довольно продолжительного времени разработки
без шаблонизаторов на бэкенде. История началась с отказа от Template::Toolkit
на серверной стороне и переноса представления на сторону веб клиента [1]. Вместе с представлением туда переместились и шаблоны, сохранив за собой право быть использованными и на серверной стороне [2], но это отдельная тема. Сейчас, по истечении некоторого времени, очевидны стали следующие моменты.
Упростилась разработка бэкенда
На данный момент, по сути, серверная строна представляет собой API с авторизацией для доступа к данным, а форматы вывода: JSON, JSONP и XML. Ниже я приведу пример кода, который определяет требуемый формат вывода и форматирует результаты. Код написан для «WebDAO» [3], но общий смысл, я постараюсь передать в комментариях:
package MyApp;
use WebDAO;
use base 'WebDAO::Engine';
use JSON;
use XML::Simple;
# пример метода
# он отображается на url /Test
sub Test {
{
1 => 2,
error => 0
}
}
# этот метод обрабатывает http запросы
sub _traverse_ {
my $self = shift;
my ( $src, $res ) = $self->SUPER::_traverse_( @_ );
# $src - объект обработавший запрос
# $res - результат вызова метода
if ( ref($res) eq 'HASH' ) {
my $r = $self->response();
# $r->wantformat возвращает true если
# присутствует параметр format=xml или
# путь заканчивается на .xml
# например: http://example.com/api/get1&format=xml,
# http://example.com/api/get1.xml
if ($r->wantformat('xml') ) { #xml
$r->content_type('appliction/xml;charset=UTF-8');
$r->print(XMLout( $res ))
} else { # default 'json'
$r->content_type('text/javascript;charset=UTF-8');
# параметр pretty => 1 для форматированного JSON
$r->print(to_json($res, {utf8 => 1, pretty => 1}))
}
$r->flush;
$r->_destroy;
$r->set_empty();
return (undef, $r) ; #return empty response
}
return ( $src, $res );
}
1;
Данный код позволяет писать простые методы:
sub Test {
{
1 => 2,
error => 0
}
}
Достаточно вернуть в качестве ответа ссылку на хэш и преобразование к требуемому формату будет выполнено автоматически.
Следующим и, пожалуй, наиболее эффектным последствием отказа от шаблонизаторов на бэкенде стала возможность разрабатывать без веб сервера и браузера. Текстовые форматы JSON и XML хорошо читаются без дополнительных программ и хорошо воспринимаются при отображении в консоли.
Поэтому увидеть результат запроса просто:
wd_shell -M MyApp /Test
Результат:
{
"1" : 2,
"error" : 0
}
Тоже с параметрами:
wd_shell -M MyApp '/Test?format=xml'
Результат:
<opt 1="2" error="0" />
Таким образом значительно упрощается среда разработки и время необходимое для развертывания окружения.
«Кесарю кесарево» [4]
Шаблоны были неким общим «местом встречи» фронтенд и бэкенд разработчиков. Файлы шаблонов редактировали одни и вторые. С одной стороны, серверсайд программисты проникались чувством прекрасного посредством копипасты кусков html и css, а с другой стороны – дизайнеры и javascript разработчики, вынуждены были знать дополнительный серверный язык шаблонов ( и быть в некоторой зависимости от принятых правил деплоя ).
На данный момент единственным связующим фронтенд и бэкенд разарботку является API, который структурирован, может быть формализован и документирован. Это делает разработку динамичнее благодаря отсутствию общих точек, где возможны «блокировки», и определяет четкие границы ответственности.
Итог
Не факт, что избавление от шаблонизаторов на стороне сервера - универсальный рецепт на все случаи жизни. Но для некоторых проектов использование подобного подхода - хороший способ упростить разработку и даже начать экпериментировать с разными технологиями бэкендов.
К тому же, этот API может стать хорошим стартом для создания публичного API сервиса.
[1] Perl 5 модули, которые я использую реже и реже. http://zag.ru/b48j1
[2] Plosurin: Perl реализация Closure Templates. http://zag.ru/a4Fr1
[3] Платформа WebDAO для разработки web приложений на Perl 5. http://webdao.sourceforge.net/
[4] Кесарю кесарево. http://ru.wikipedia.org/wiki/Кесарю кесарево