mustache и with
недавно наша команда выбирала для себя новый шаблонизатор. К сожалению, ретрограды не дали нам использовать Jade. Остальные подходящие шаблонизаторы разделились на две группы по используемому синтаксису: mustache и jinja2
mustache оказался удивительным. Не только благодаря претензиям на отсутствие логики в шаблонах (они заменили if
и for
на #
и думают, что логики нет). Сильнее меня удивило, что в таком молодом синтаксисе почти всё построено на приёме, который давно считается вредным. Я имею в виду оператор with
из яваскрипта
напомню, чем плох этот оператор. Допустим, у нас есть функция, суммирующая некоторое число с одним из значений объекта, переданного в качестве параметра:
function sum(foo) {
var baz = 10;
return baz + foo.bar;
}
это можно переписать в следующем виде:
function sum(foo) {
var baz = 10;
with (foo) {
return baz + bar;
}
}
всё будет неплохо работать до тех пор, пока где-то в совершенно другом месте приложения мы не решим, что объекту foo
нужно содержать и значение baz
. В результате sum
будет прибавлять к bar
не 10, а foo.baz
и это — врождённая проблема mustache. Пара из поддерживающих этот синтакс шаблонизаторов добавляют в него возможность обойти эту проблему, но ведь базовый синтакс подталкивает к этой ловушке:
{{#people}}
Hello, {{title}} {{name}}
{{/people}}
как думаете, здесь title
это заголовок страницы или титул человека?