Открыть сервис

Mustache

Mustache — это веб-фреймворк для создания шаблонов (templating engine), предназначенный для генерации текстового контента (HTML, XML, JSON, YAML, конфигурационные файлы и т.д.) на основе подстановки данных в шаблоны. Относится к классу беcлогических (logic-less) шаблонизаторов, то есть не содержит встроенных конструкций управления потоком выполнения (условные операторы, циклы в привычном виде), полагаясь исключительно на синтаксис, основанный на фигурных скобках.

История

Mustache был создан Крисом Уонастратом (Chris Wanstrath) в 2009 году. Первоначально реализация была написана на языке Ruby. Идея создания шаблонизатора возникла из желания предложить простой, переносимый между языками программирования способ отделения логики представления от бизнес-логики. Название «Mustache» (англ. «усы») происходит от визуального сходства символов {{ }} с усами, которые используются для обозначения переменных в шаблонах.

Вскоре после выхода первой версии спецификация Mustache была формализована, что позволило создать реализации на десятках других языков программирования, включая JavaScript, Python, Java, PHP, C#, Go, Rust и многие другие. Это сделало Mustache одним из самых портируемых шаблонизаторов.

Синтаксис

Синтаксис Mustache основан на использовании фигурных скобок {{ }} для обозначения мест подстановки данных. Шаблон представляет собой обычный текст, в который вставлены теги Mustache. При обработке шаблона теги заменяются значениями из переданного контекста (обычно хэша или объекта).

Основные теги

  • Переменные (Variables): {{variable}} — заменяется на значение переменной variable из контекста. По умолчанию HTML-специальные символы (например, <, >, &) экранируются. Для вывода неэкранированного HTML используется тройная фигурная скобка: {{{unescaped_variable}}} или {{&unescaped_variable}}.
  • Секции (Sections): {{#section}}...{{/section}} — блоки, которые отображаются или повторяются в зависимости от значения переменной section в контексте.
  • Если значение ложно (false, null, пустой массив, пустая строка), блок не отображается.
  • Если значение истинно (true, непустая строка, число), блок отображается один раз.
  • Если значение является массивом, блок отображается для каждого элемента массива, при этом контекст внутри блока переключается на текущий элемент.
  • Если значение является хэшем (объектом), блок отображается один раз, и внутри него доступны поля этого хэша.
  • Инвертированные секции (Inverted Sections): {{^section}}...{{/section}} — отображаются только в том случае, если значение переменной section ложно (false, null, пустой массив, пустая строка).
  • Комментарии (Comments): {{! comment }} — не выводятся в результирующем тексте.
  • Партиалы (Partials): {{> partial_name }} — включают содержимое другого шаблона (партиала) в текущий шаблон. Партиалы позволяют переиспользовать фрагменты шаблонов.
  • Разделители (Delimiters): {{=<< >>=}} — изменяют синтаксические разделители с {{ }} на другие, например, << >>. Это может быть полезно, если в шаблоне уже используются фигурные скобки (например, в шаблонах JavaScript).

Пример шаблона

```mustache <h1>{{title}}</h1>

<ul> {{#items}} <li>{{name}}: {{price}} руб.</li> {{/items}} {{^items}} <li>Нет товаров</li> {{/items}} </ul>

{{! Это комментарий }} {{> footer }} ```

При контексте { "title": "Каталог", "items": [{"name": "Товар 1", "price": 100}, {"name": "Товар 2", "price": 200}] } этот шаблон сгенерирует HTML-код с заголовком и списком товаров.

Реализации

Благодаря формальной спецификации, Mustache имеет реализации (библиотеки) для большинства распространённых языков программирования. Среди наиболее известных:

  • Ruby: mustache (оригинальная реализация)
  • JavaScript: mustache.js
  • Python: pystache, chevron
  • Java: jmustache, mustache.java
  • PHP: mustache.php
  • Go: mustache (в стандартном пакете text/template есть встроенная поддержка, но не полная)
  • C#: mustache-sharp, Nustache
  • Rust: mustache, rustache

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

Применение

Mustache широко используется в веб-разработке для генерации HTML-кода на стороне сервера (например, в Ruby on Rails, Django, Node.js) и на стороне клиента (в браузере с помощью JavaScript). Благодаря своей простоте и отсутствию логики, он часто применяется в проектах, где требуется строгое разделение обязанностей между разработчиками бэкенда и фронтенда.

Кроме веб-разработки, Mustache применяется для генерации любых текстовых файлов: конфигурационных файлов, писем, отчётов, документации, кода на других языках программирования (например, для генерации исходного кода).

Критика

Основные недостатки Mustache связаны с его ограниченностью, вытекающей из принципа «без логики».

  • Отсутствие условных операторов: Секции и инвертированные секции позволяют реализовать только простые условия (проверка на истинность/ложность). Для более сложной логики (например, сравнение двух переменных) требуется либо предварительная обработка данных на стороне приложения, либо использование дополнительных библиотек (например, Handlebars, который расширяет синтаксис Mustache).
  • Отсутствие циклов с итерацией: Секции могут повторяться только по массиву. Для циклов с условиями или счётчиками необходимо подготавливать данные на стороне приложения.
  • Сложность отладки: Из-за отсутствия логики в шаблоне, ошибки часто возникают на стороне данных, что может затруднить отладку.
  • Производительность: Для больших объёмов данных или сложных вложенных структур производительность может быть ниже, чем у более оптимизированных шаблонизаторов.

Несмотря на эти ограничения, простота и переносимость делают Mustache популярным выбором для многих проектов, особенно тех, где требуется жёсткое разделение логики и представления.

Сравнение с другими шаблонизаторами

Mustache является основой для многих других шаблонизаторов, которые расширяют его функциональность. Наиболее известный пример — Handlebars, который добавляет встроенные хелперы (helpers) для выполнения сложных операций (условия, циклы, манипуляции со строками и числами). Handlebars полностью совместим с синтаксисом Mustache, но добавляет свои собственные конструкции.

Другие популярные шаблонизаторы, такие как Jinja2 (Python), Twig (PHP), Liquid (Ruby), также имеют более богатый синтаксис, включающий циклы, условия, фильтры и наследование шаблонов. Mustache занимает нишу самого простого и минималистичного решения.

Источники

  • Официальная спецификация Mustache (mustache.github.io)
  • Репозиторий оригинальной реализации на Ruby (github.com/mustache/mustache)
  • Документация Mustache.js (github.com/janl/mustache.js)
  • Статья «Mustache (template system)» в английской Википедии

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →