Когда я только начинал делать что-то в web, в принципе не было понятия “верстальщик”. Каждый, кто делал сайты, делал весь спектр задач: от настройки базы данных до написания javascript кода.
Сейчас индустрия web настолько обширна, что узкая специализация - это норма. Например, у нас в компании есть служба эксплуатации, у них даже есть отдельный DBA. Server side программисты и Frontend программисты, однако, выделенных верстальщиков у нас нет.
Вообще я, общаясь с разработчиками из разных компаний, встречаю две основных схемы работы с людьми, которых называют верстальщиками.
В первой схеме есть основной workflow выполнения задачи. За техническую часть отвечает программист, server side программист. Когда для задачи нужна верстка - верстальщику отдают макет, а он программисту отдает HTML.
У этой схемы есть плюсы:
— можно сильно снизить требование к квалификации верстальщика;
— с первого взгляда задачи легко отдаются на outsource.
Но минусы этой схемы куда серьезнее плюсов:
— создает код один человек (CSS, JS, картинки), а организовывает его другой человек.
— на production баг, в макете от верстальщика все хорошо, а на сайте нет - что делать?
Есть другой вариант — повысить требование к верстальщику и отдать в его ответственность инструмент, который генерирует конечный код для браузера. Я не правильно выразился, верстальщику надо самому повысить свою квалификацию и сделать это.
При такой схеме вы уже не верстальщик, а Frontend разработчик. Работа server side программиста заканчивается генерацией некоторого документа (XML, JSON ...), который вы превращаете во что-то, что понимает браузер. Никто лучше вас не знает client side, вам и надо полностью контролировать, что туда уходит. Вопроса “К кому идти, если в браузере что-то не так?” больше нет, виноваты всегда вы, если виноват сервер сайд - придут к вам, а вы уже разберетесь что к чему.
Frontik
Итак, с целью определились, ее надо как-то достичь..
Что нам надо:
— возможность забирать данные от программистов;
— мощный шаблонизатор;
— удобный инструмент для написания логики представления.
Вообще весь мой опыт говорит о том, что server side и frontend плюс client side - это два очень разных мира. С разными задачами, и их лучше не смешивать, а самое лучшее - технически разнести как можно дальше друг от друга. Плюс время, когда один проект живет на одном сервере, давно прошло. Сейчас сайт - это несколько программных продуктов, которые взаимодействуют между собой. Раз мы уже имеем сетевое взаимодействие, то и frontend c server side мы решили отделить друг от друга посредством http протокола.
Естественно мы не первые кто пытался решить эту задачу. Более того в 2007 году было два решения от ведущих российских компаний:
— XScript, Янндекс
— FEST, Mail.ru
Оба решения поддерживали работу по HTTP, что нас полностью устраивало.
Мы выбрали решение от Яндекса:
— оно уже тогда было c открытом коде;
— успешно работало несколько лет;
— давало вестальщикам не скудный самописный шаблонизатор, а всю мощь и силу XSLT.
Мы успешно прожили на нем около года, но к сожалению он удовлетворял только двум требованиям из трех. Писать на нем более менее сложную логику очень не удобно. А для решения некоторых задач требовалось модифицировать сам XScript.
Раз встала необходимость его модификации, нам захотелось решить задачу совсем по другому — взять язык программирования и добавить в него все то что нам нравилось в XScript.
Существует множество инструментов для удобной работы по http, за базу мы взяли tornado. Tornado позволяет сходить по HTTP за документом и выполнить функцию, когда этот документ будет получен, отдав ей на вход этот самый документ.
Теперь шаблонизатор. Тут вариантов не было, однозначно XSLT.
Бонусом ко всему мы получаем полноценный язык, на котором мы можем как-то работать с данными от сервера — Python.
В остатке, frontik обеспечивает:
— диспетчеризацию урлов;
— HTTP опрос backend;
— парсинг, обработку и интеграцию ответов в xml;
— XSLT трансформацию.
Пример страницы “Hello world”.
class Page(frontik.page.PageHandler):
@set_xsl('helloworld.xsl')
def get_page(self, request):
res = etree.Element('hello')
res.text = 'world'
self.doc.put(res)
Или пример с походом за данными
def cb(xml, response):
nodes = xpath.Evaluate(..., xml)
if not nodes:
finish('Nothing found!')
else:
...
self.get_url(request, cb)
Легкая вставка данных в результирующий xml документ
placeholder = self.get_url(...)
self.doc.put(placeholder)
self.get_url возвращает plaseholder, который будет заполнен данными, когда ответит сервер
Гибкость разработки
Обычно frontend очень сильно ограничен узким набором инструментов. В случае с frontik у нас в распоряжении python и мы можем себе многое позволить.
Например, у нас сайт мультиязычный - это означает, что в верстке у нас есть ключи, а варианты текстов хранятся в базе. Но браузеру мы должны отдавать страницу с текстами, а не с ключами.
Сначала мы на frontik вместе с данными запрашивали и тексты переводов, передавая все ключи, которые могли встретиться на странице. Это очень неудобно, замедляло разработку, а самое неприятное что логика выбора ключа сосредоточена именно в xsl. Однако после xsl мы уже знаем, какие из переводов понадобились и других точно не будет.
XSL трансформация - это всего-лишь одна из стадий работы frontik, и мы просто добавили еще одну стадию.
Было: XML → XSL → HTML
Стало: XML → XSL → Пост-обработка → HTML
Логика выбора переводов осталась на XSL, где ей самое и место, но оперирует она только с ключами. Пост-обработка берет HTML и заменяет в нем ключи на конечные тексты.
Заключение
Еще один из больших плюсов frontik - это сквозной python. Вы кадый день что-то пишете и дебажите на python. Если что-то не так в самом frontik или даже tornado, то вы как обычно берете и дебажите python, что вы и так делаете каждый день по много часов.
Frontik на github
http://github.com/hhru/frontik
Проект на frontik (hh api + yaru api).
http://github.com/AndrewSumin/hephaestu
December 17 2010, 08:47:52 UTC 1 year ago
December 17 2010, 08:52:08 UTC 1 year ago
December 17 2010, 09:34:17 UTC 1 year ago
явный выигрыш не понятен
December 17 2010, 10:16:18 UTC 1 year ago
December 17 2010, 11:25:32 UTC 1 year ago
December 17 2010, 10:26:34 UTC 1 year ago
1. Frontik is a simple xml aggregator. Смысл наличия именно отдельного xml-агрегатора мне не совсем ясен. Чем не устраивает просто xslt-функция document()? Запросил у стороннего сервера xml и готово. Есть какие-то специфические требования асинхронности? Или необходимо воспроизводимое чтение в длинной транзакции?
2. Просмотрел и презентацию, но понял ничего про пост-обработку. Какая проблема ей решается, что не в состоянии решить xslt? У питонового xslt-процессора, что, нет возможности подключить сторонние функции? Или у используемого xslt-процессора нет возможности контролировать xsl:import/xsl:include?
3. В планах развития заявлен стриминг. А зачем? И как делать собираетесь? Скрестить с xslt будет явно тяжеловато.
December 17 2010, 11:27:49 UTC 1 year ago
2. есть часть логики на xslt: без постпроцессинга пришлось бы заранее, перед xslt сходить за всеми данными, которые могут понадобится.
3. фронтику иногда нужно проксировать большие документы, сейчас он их целиком загружает в память.
December 17 2010, 11:46:29 UTC 1 year ago
December 17 2010, 11:52:35 UTC 1 year ago
December 17 2010, 11:56:02 UTC 1 year ago
December 17 2010, 12:03:59 UTC 1 year ago
их в сумме на страницу надо много.
а в каждом конкретном месте в верстке он нужен один.
допустим, статический текст на многоязычном сайте.
December 17 2010, 12:09:46 UTC 1 year ago
December 17 2010, 12:16:52 UTC 1 year ago
Вообще не понятно, почему часто упускают основную мысль доклада и интересуются сугубо внутренней реализацией одной неинтересной задачи, которая была приведена не как эталон решения, а как пример иллюстрирующий основной тезис?
December 17 2010, 12:32:24 UTC 1 year ago
А почему мне интересна реализация этих неинтересных моментов, я пояснил первым же абзацем: я экспериментирую над аналогом, плюсю мне и так ясны, мне не ясны мои грядущие проблемы.
December 17 2010, 12:34:04 UTC 1 year ago
December 17 2010, 12:00:19 UTC 1 year ago
December 17 2010, 12:13:51 UTC 1 year ago
процессор там libxslt.
помимо приведенного примера с key-value хранилищем, есть еще момент, что для построения некоторых ссылок нам нужно очень много данных (в xml это получается ~200kb, 7k нод). Опыт показал, что держать это в xml, а потом в xslt к этому всему обращаться и формировать результат - на порядок медленнее, чем обработать эти данные на питоне.
December 17 2010, 12:33:32 UTC 1 year ago
February 7 2011, 13:11:10 UTC 1 year ago
А можно здесь пояснить? Я сам .net-разработчик, в основном работал в разных бекендах. Но я имел как-то опыт верстки на XSLT. Мне показалось это адом по сравнению, например, с тем же aspx-ом.
Почему вариантов нет? Какие еще варианты рассматривались? Шаблонизаторов ведь различных масса. Почему нельзя просто работать с бекендами из кода фронтенда без всяких архитектурных излишеств?
February 7 2011, 13:14:46 UTC 1 year ago
Совсем недавно мы сделали прекомпиляцию, обработав XSL с помощью XSL.
February 7 2011, 13:29:05 UTC 1 year ago
February 7 2011, 13:43:26 UTC 1 year ago
libxsl поддерживает из коробки.
February 7 2011, 14:05:39 UTC 1 year ago
Я может сам не так круто разбираюсь в XSLT. Но я, например, вижу вот такие ужасы: http://www.artlebedev.ru/tools/technogr
На C# + aspx эту задачу можно решить в несколько строк кода. На XSLT же - это целая эпопея, достойная отдельной статьи и четырех страниц кода. Оно вот так вот обычно с XSLT?
February 7 2011, 14:29:34 UTC 1 year ago
Я утверждаю что XSL на данный момент лучше всего исходя из своей практики, а не из фанатизма, тоже много чего перепробовал, не все но много.
У XSL и правда сложный вход, но у меня были хорошие учителя.