Каковы различия между Mustache.js и Handlebars.js?


333

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

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

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

Есть ли другие важные различия, которые я пропускаю?


9
Вот также тест производительности, сравнивающий эти два jsperf.com/dom-vs-innerhtml-based-templating/366 - есть лучшие альтернативы;)
Микко Охтамаа

1
... и я верю, что это #each, а не #list.
Shadow Man

@ShadowCreeper Спасибо. Обновленный пост.
Чед Джонсон

1
Я подробно писал об этом, а также показываю, как вы можете сделать нечто подобное для супер базовых шаблонов javascript для динамического контента здесь: http://stephentvedt.com/2013/09/23/html-templating-comparison/
Стивен Тведт,

3
Интересно, кто принял последнее редактирование (2014-10-16). Это должен был быть ответ.
Уолтер Тросс

Ответы:


125

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

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

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


7
Не забудьте Scandlebars, реализацию Scala-Handlebars!
Код Whisperer

1
Реализация Ruby требует интерпретатора JavaScript, поэтому на самом деле это не компилятор Ruby.
Eltiare

72

Усы плюсы:

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

Усы минусы:

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

Рули плюсы:

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

Минусы руля:

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

Источник: шаблонное выбрасывание на стороне клиента: усы, руль, dust.js и многое другое


37
Re Mustache con "Немного слишком логично". Я бы сказал, что CSS чередующихся строк должен выполняться с помощью псевдокласса CSS, такого как tr:nth-child(even)и tr:nth-child(odd)или tr:nth-child(2n). Хотя это всего лишь пример, я чувствую, что (в большинстве случаев) если с усами что-то сложно или неловко, то вы делаете это неправильно; есть лучшее место для этого.
ИАМНАН

3
У Handlebars также есть реализация сайта сервера на java github.com/jknack/handlebars.java
UR6LAD

2
@IAmNaN, это справедливо в отношении nth-child ... если вы не пишете html для электронной почты, где вы можете использовать только встроенный css - что делает очень трудным использование n-ых селекторов!
Дилан Уотсон

24

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

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

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

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

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

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

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

Это в основном означает «если переменная существует и является правдивой, выведите диапазон с переменной в ней». Но в Handlebars вы должны либо:

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

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


23

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

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


11

Еще одно различие между ними - размер файла:

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

Источник: обзор шаблонизаторов JavaScript


7

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

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


5

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

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

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


3

—В дополнение к использованию «this» для руля и вложенной переменной в блоке переменных для усов, вы также можете использовать вложенную точку в блоке для усов:

    {{#variable}}<span class="text">{{.}}</span>{{/variable}}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.