Mustache — шаблонизатор для JavaScript

Mustache — шаблонизатор для JavaScript

Mustache — шаблонизатор, который содержит минимум управляющей логики и доступен для разных языков программирования. Его можно использовать и на сервере (PHP, Ruby и т.д.), и на клиенте (Javascript).

Если вы динамически подгружали с сервера блоки HTML-кода, а не структурированные данные только потому, что не хотели дублировать рендеринг на сервере и на клиенте, то Mustache поможет этого избежать.

 

Отличное решения для удаленного офиса —
сервера в Европе. Защити свой бизнес!

Шаблон пишется на простом языке, состоящем из нескольких типов тегов. Теги обрамляются двумя или тремя фигурными скобками с каждой стороны. Можно использовать вложенные шаблоны.

Рассмотрим простой пример  шаблона:

<h1>{{header}}</h1>
<p>{{content}}</p>
<ul>
{{#authors}}
    <li>{{#accent}} {{.}} {{/accent}}</li>
{{/authors}}
{{^authors}}
    <li>anonymous</li>
{{/authors}}
</ul>

Данные, с которыми работает шаблон, называются контекстом. Имя тега указывает, к какому полю контекста необходимо обратиться. Пример данных, которые могут послужить контекстом для нашего шаблона:

var data = {
    header : "Новый пост",
    content: "Первая строка<br />Вторая",
    authors: ["alex", "daemon", "john"],
    accent : function () {
        return function (text, render) {
            text = render(text);
            return '<strong>' + text + '</strong>';
        }
    }
};

Чтобы «запустить» шаблонизатор и отрисовать с помощью шаблона данные, необходимо подключить библиотеку:

<script type="text/javascript" src="http://github.com/janl/mustache.js/raw/master/mustache.js"></script> 

И вызывать рендеринг методом to_html:

Mustache.to_html(template, data);

Здесь первым параметром передается шаблон, а вторым — данные. Так же можно использовать третий параметр —список дополнительных шаблонов, и четвертый — функцию callback, которая вызывается после обработки шаблона.

Более подробно о тегах

Всего в Mustache четыре основных типа тегов: переменная, секция, комментарий и подключение дополнительного шаблона.

Переменная выводит данные с экранированием HTML-сущностей {{header}} и без экранирования {{{content}}}. Отличаются они количеством скобок. В нашем случае, вместо {{header}} подставится строчка «Новый пост».

Секция представляет собой парный тег. Принцип ее действия зависит от типа данных, с которыми она работает. Если в контексте имени секции соответствует поле со списком, то шаблонизатор проходит по его элементам и текст внутри парного тега обрабатывается по одному разу для каждого элемента списка. Элемент списка подставляется заместо тега-точки. Так, например, секция {{#authors}}<li>{{.}}</li>{{/authors}} превратится в <li>alex</li><li>daemon</li><li>john</li>. Если список пуст, то обрабатывается содержимое «тега с крышечкой», в нашем случае — это {{^authors}} … {{/authors}}.

Если имени секции соответствует функция, то для подстановки будет использован результат ее выполнения.

Если поле, соответствующее имени секции, не является ни списком, ни функцией, то оно будет использоваться в качестве контекста для обработки содержимого тега.

Комментарий оформляется в виде тега с восклицательным знаком, например,  {{! comment content}}.

Подключение дополнительного шаблона вызывается с помощью тега с угловой скобкой. Например, {{>copyright}}. Если в текущем контексте присутствует поле с таким названием, то оно будет передано в качестве контекста для подключаемого шаблона.

Производительность

Вопросы производительности Javascript шаблонизаторов рассматриваются в этой статье. Автор провел тестирование восьми шаблонизаторов и выяснил, что на простых шаблонах Mustache показывается лучшую производительность.

Пример работы

Демо

Сайт проекта: http://mustache.github.com/. Если у читателей возникли какие-то вопросы, я с удовольствием на них отвечу.

Расскажите друзьям

Оцените статью:
  • 1
  • 2
  • 3
  • 4
  • 5

Комментарии — 12

BULcH
{{#authors}}{{.}}{{/authors}} превратится в alexdaemonjohn

перед
john нет открывающегося тега ) а вообще статья понравилась )
Александр Яшин
>>перед john нет открывающегося тега )

Спасибо, поправил
Baxa
Я так и не понял, зачем такое надо... :(
#
Baxa
Александр Яшин
>>Здорово, вы с JSON работайте? Как вам?
Не так часто, как хотелось бы. Очень удобно, пока он используется там, где надо, а не везде, где можно.

>>Я так и не понял, зачем такое надо... :(
В основном для разделения логики и отображения.
Bано
Baxa, это надо, например, для того, чтобы можно было ajax-ом изменить данные в объекте "data" и динамически заменить контент. Можно это сделать и привычным способом, но так (имхо) удобнее.

Спасибо, Александр, интересная статья. На сайте не знаю где прикрутить - поисковики будут ругаться, а вот в админке - в самый раз!
#
Bано
Bано
Кстати шаблонизатор, в несжатом виде, весит всего 8.9кб
#
Bано
Andron
В ExtJs есть также темплейты - http://dev.sencha.com/deploy/dev/docs/?class=Ext.Template

Конечно если он используется в проекте...
#
Andron
Александр
а что если делать так:
$(function(){
// Массив данных
var data = {
header : "Заголовок",
content: "Вау! тут можно прям так пихать текст!!",
authors: ["alex", "daemon", "john"],
accent : function () {
return function (text, render) {
text = render(text);
return '' + text + '';
}
}
};

var tmp = $("body").html();
var partials = {copyright: "© 2011 Company"};

var html = Mustache.to_html(tmp, data, partials);
$("body").html(html);
})
а в body делать сразу шаблон:
{{header}} {{{content}}} {{#authors}} {{#accent}} {{.}} {{/accent}} {{/authors}} {{^authors}} anonymous {{/authors}} {{>copyright}}
#
Александр
Stepan Suvorov
статья оказалось очень кстати, спасибо!
Stepan Suvorov
метод to_html(), как оказалось, уже deprecated, вместо него - render()
Виталий
Статья оказалась очень как никак кстати. Спасибо.

Новый комментарий

как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть

metin2 pvp metin2 pvp serverler pvp serverler