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 это заголовок страницы или титул человека?

Артемий Трегубенко,
, ,

comments powered by Disqus