В чем отличия между Mustache.js и Handlebars.js?

Основные различия, которые я видел, следующие:

  • Handlebars добавляет #if, #unless, #with и #each
  • Handlebars добавляет помощников
  • Шаблоны Handlebars скомпилированы (Mustache может быть слишком)
  • Handlebars поддерживает paths
  • Позволяет использовать {{this}} в блоках (который выводит текущее значение строки элемента)
  • Handlebars.SafeString() (и, возможно, некоторые другие методы)
  • Handlebars от 2 до 7 раз быстрее
  • Усы поддерживает перевернутые разделы (т.е. if !x ...)

(Пожалуйста, поправьте меня, если я ошибаюсь в вышеупомянутом.)

Есть ли другие существенные отличия, которые мне не хватает?

Ответ 1

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

Усы отсутствуют помощники и более продвинутые блоки, потому что он стремится быть безболезненным. Пользовательские помощники Handlebars могут быть очень полезными, но часто в конечном итоге вводят логику в ваши шаблоны.

Усы есть много разных компиляторов (JavaScript, Ruby, Python, C и т.д.). Ручки начали работать в JavaScript, теперь есть проекты типа django-handlebars, handlebars.java, handlebars-ruby, lightncandy (PHP) и handlebars-objc.

Ответ 2

Усы усов:

  • Очень популярный выбор с большим, активным сообществом.
  • Поддержка на стороне сервера на многих языках, включая Java.
  • Шаблоны без логики делают большую работу заставляя вас отделять представление от логики.
  • Чистый синтаксис приводит к шаблонам, которые легко создавать, читать и поддерживать.

Усатые минусы:

  • Не слишком логично: основные задачи (например, чередующиеся строки с разными классами CSS) сложны.
  • Просмотр логики часто отбрасывается на сервер или реализуется как "лямбда" (вызываемая функция).
  • Чтобы lambdas работал на клиенте и сервере, вы должны записать их в JavaScript.

Профили Handlebars:

  • Шаблоны без логики делают большую работу заставляя вас отделять представление от логики.
  • Чистый синтаксис приводит к шаблонам, которые легко создавать, читать и поддерживать.
  • Скомпилированные, а не интерпретированные шаблоны.
  • Лучшая поддержка путей, чем усы (т.е. углубление в объект контекста).
  • Лучшая поддержка глобальных помощников, чем усы.

Руки минус:

  • Требуется серверный JavaScript для рендеринга на сервере.

Источник: Клиентская настройка шаблонов: усы, рули, dust.js и т.д.

Ответ 3

Одно тонкое, но существенное различие заключается в том, как две библиотеки приближаются к сфере охвата. Усы возвращаются в родительскую область, если не могут найти переменную в текущем контексте; Ручки возвратят пустую строку.

Это почти не упоминается в GitHub README, где есть одна строка для него:

Ручные панели немного отклоняются от Усы, поскольку они не выполняют рекурсивный поиск по умолчанию.

Однако, как отмечено в этом документе, существует флаг, позволяющий манипулировать ручками так же, как и Усы, но это влияет на производительность.

Это влияет на то, как вы можете использовать переменные # в качестве условных обозначений.

Например, в Mustache вы можете сделать это:

{{#variable}}<span class="text">{{variable}}</span>{{/variable}}

В основном это означает "если переменная существует и правдива, напечатайте span с переменной в ней". Но в Handlebars вам нужно либо:

  • используйте {{this}} вместо
  • используйте родительский путь, т.е. {{../variable}}, чтобы вернуться в соответствующую область.
  • определить дочернее значение variable в родительском объекте variable

Подробнее об этом, если вы хотите, здесь.

Ответ 4

ПРИМЕЧАНИЕ. Этот ответ устарел. Это было верно в то время, когда оно было опубликовано, но больше не существует.

Усы имеют интерпретаторы на многих языках, а Handlebars - только для Javascript.

Ответ 5

Другим различием между ними является размер файла:

Чтобы увидеть преимущества производительности Handlebars.js, мы должны использовать предварительно скомпилированные шаблоны.

Источник: Обзор движков JavaScript по шаблонам

Ответ 6

Еще одна тонкая разница заключается в обработке значений фальши в блоках {{#property}}...{{/property}}. Большинство реализаций усов будут просто подчиняться JS-ложности здесь, а не отображать блок, если property - '' или '0'.

Ручки будут отображать блок для '' и 0, но не другие значения фальши. Это может вызвать некоторые проблемы при переносе шаблонов.

Ответ 7

Я чувствую, что один из упомянутых минусов для "Handlebars" больше не действует.

Handlebars.java теперь позволяет нам использовать одни и те же языки шаблонов для клиента и сервера, что является большой победой для крупных проектов с 1000 + компонентами, для которых требуется рендеринг серверов для SEO

Взгляните на https://github.com/jknack/handlebars.java

Ответ 8

- Помимо использования "this" для дескрипторов и вложенной переменной в переменном блоке для усов, вы также можете использовать вложенную точку в блоке для усов:

    {{#variable}}<span class="text">{{.}}</span>{{/variable}}