Які відмінності між Mustache.js та Handlebars.js?


333

Основні відмінності, які я бачив:

  • Рулі додає #if, #unless, #with, і#each
  • Руль додає помічників
  • Шаблони рулів компілюються (вуса теж можуть бути)
  • Руль підтримує шляхи
  • Дозволяє використовувати {{this}}в блоках (що виводить значення рядка поточного елемента)
  • Handlebars.SafeString() (і, можливо, деякі інші методи)
  • Ручки в 2 - 7 разів швидші
  • Вуса підтримують перевернуті ділянки (тобто if !x ...)

(Будь ласка, виправте мене, якщо я помиляюся з вищесказаним.)

Чи є якісь інші основні відмінності, які мені не вистачає?


9
Ось також тест на працездатність, порівнюючи ці два jsperf.com/dom-vs-innerhtml-based-templating/366 - є кращі альтернативи;)
Mikko Ohtamaa

1
... і я вважаю, що це #each, а не #list.
Shadow Man

@ShadowCreeper Дякую Оновлена ​​публікація.
Чад Джонсон

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

3
Цікаво, хто прийняв останню редакцію (2014-10-16). Це повинна була відповісти.
Вальтер Трос

Відповіді:


125

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

Вуса не вистачає помічників і більш розвинених блоків, тому що вони прагнуть бути беззубними. Спеціальні помічники рулів можуть бути дуже корисними, але часто вводять логіку у ваші шаблони.

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


7
Не забувайте Scandlebars, реалізацію Scala-Handlebars!
Шепітер коду

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). Хоча це лише приклад, я вважаю, що (більшу частину часу) якщо з Вусами щось важко чи незручно, то ти робиш це неправильно; там краще місце для цього.
IAmNaN

3
У руль є реалізація сайту сервера на java too github.com/jknack/handlebars.java
UR6LAD

2
@IAmNaN це справедливо щодо nth-дитини .. якщо тільки ви не пишете HTML для електронного листа, де ви можете використовувати лише вбудований css - це ускладнює використання n-селекторів!
Ділан Уотсон

24

Одна тонка, але значна різниця полягає у тому, як обидві бібліотеки наближаються до сфери застосування. Вуса повернуться до батьківської області, якщо він не зможе знайти змінну в поточному контексті; Руль поверне порожній рядок.

Це ледве згадується в GitHub README, де є один рядок для нього:

Руль трохи відхиляється від вуса тим, що не виконує рекурсивний пошук за замовчуванням.

Однак, як зазначалося там, є прапор, який змушує ручки вести себе так само, як вуса - але це впливає на продуктивність.

Це впливає на спосіб використання #змінних як умовних умов.

Наприклад, у вусах ви можете це зробити:

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

Це в основному означає "якщо змінна існує і є правдоподібною, надрукуйте проміжок зі змінною в ньому". Але в руль, вам доведеться:

  • використовувати {{this}}замість цього
  • використовувати батьківський шлях, тобто {{../variable}}повернутися до відповідного обсягу
  • визначити дочірнє variableзначення в батьківському variableоб'єкті

Детальніше про це, якщо ви хочете їх, тут .


23

ПРИМІТКА. Ця відповідь застаріла. Це було правдою в той час, коли вона була розміщена, але більше не є.

У вуса є перекладачі багатьма мовами, тоді як руль - лише Javascript.


11

Ще одна різниця між ними - це розмір файлу:

Щоб побачити переваги продуктивності Handlebars.js, ми повинні використовувати попередньо складені шаблони.

Джерело: Огляд двигунів шаблонів JavaScript


7

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

Рулі будуть надавати колодку ''і 0, але не інший falsy значення. Це може спричинити певні проблеми при переміщенні шаблонів.


5

Я відчуваю, що один із згаданих мінусів для "Ручки" не справді вже дійсний.

Handlebars.java тепер дозволяє нам ділитися однаковими мовами шаблонів як для клієнта, так і для сервера, що є великою виграшею для великих проектів з 1000+ компонентами, для яких потрібна серверна візуалізація для SEO

Погляньте на https://github.com/jknack/handlebars.java


3

—На додаток до використання "цього" для рулі та вкладеної змінної в межах змінного блоку для вусів, ви також можете використовувати вкладену крапку в блоці для вусів:

    {{#variable}}<span class="text">{{.}}</span>{{/variable}}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.