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 →