Quais são as diferenças entre Mustache.js e Handlebars.js?


333

As principais diferenças que eu vi são:

  • Guidão acrescenta #if, #unless, #with, e#each
  • Guidão adiciona ajudantes
  • Modelos de guidão são compilados (o bigode também pode ser)
  • O guidão suporta caminhos
  • Permite o uso de {{this}}em blocos (que gera o valor da string do item atual)
  • Handlebars.SafeString() (e talvez alguns outros métodos)
  • O guidão é 2 a 7 vezes mais rápido
  • O bigode suporta seções invertidas (ie if !x ...)

(Corrija-me se estiver errado com o que foi dito acima.)

Faltam outras diferenças importantes?


9
Aqui também é um teste de desempenho comparando estes dois jsperf.com/dom-vs-innerhtml-based-templating/366 - existem melhores alternativas;)
Mikko Ohtamaa

1
... e eu acredito que é #each, não #list.
Shadow Man

@ShadowCreeper Thanks. Postagem atualizada.
Chad Johnson

1
Eu escrevi sobre isso em profundidade e também mostro como você pode fazer algo semelhante para modelos javascript super básicos para conteúdo dinâmico aqui: http://stephentvedt.com/2013/09/23/html-templating-comparison/
Stephen Tvedt

3
Gostaria de saber quem aceitou a última edição (16/10/2014). Deveria ter sido uma resposta.
Walter Tross

Respostas:


125

Você acertou em cheio, no entanto, os modelos do Bigode também podem ser compilados.

O bigode está faltando ajudantes e os blocos mais avançados porque se esforça para não ter lógica. Os auxiliares personalizados do guidão podem ser muito úteis, mas muitas vezes acabam introduzindo lógica nos seus modelos.

O bigode tem muitos compiladores diferentes (JavaScript, Ruby, Python, C, etc.). O guiador começou em JavaScript, agora existem projetos como django-handlebars , handlebars.java , handlebars-ruby , lightncandy (PHP) e handlebars-objc .


7
Não se esqueça do Scandlebars, a implementação do Scala-Handlebars!
Code Whisperer

1
A implementação Ruby requer um intérprete JavaScript, portanto, na verdade, não é um compilador Ruby.
Eltiare 15/07/16

72

Profissionais do bigode:

  • Escolha muito popular entre uma comunidade grande e ativa.
  • Suporte do servidor em vários idiomas, incluindo Java.
  • Modelos sem lógica fazem um ótimo trabalho ao forçar você a separar a apresentação da lógica.
  • A sintaxe limpa leva a modelos fáceis de construir, ler e manter.

Contras do bigode:

  • Um pouco sem lógica: tarefas básicas (por exemplo, rotular linhas alternativas com diferentes classes CSS) são difíceis.
  • A lógica de exibição geralmente é enviada de volta ao servidor ou implementada como uma "lambda" (função que pode ser chamada).
  • Para que lambdas funcionem no cliente e no servidor, você deve escrevê-los em JavaScript.

Profissionais do guidão:

  • Modelos sem lógica fazem um ótimo trabalho ao forçar você a separar a apresentação da lógica.
  • A sintaxe limpa leva a modelos fáceis de construir, ler e manter.
  • Modelos compilados em vez de interpretados.
  • Melhor suporte para caminhos do que bigode (ou seja, atingindo profundamente um objeto de contexto).
  • Melhor suporte para ajudantes globais do que bigode.

Guiador contras:

  • Requer JavaScript do lado do servidor para renderizar no servidor.

Fonte: o lançamento do modelo do lado do cliente: bigode, guidão, dust.js e mais


37
Re Bigode com "Um pouco demais de lógica". Eu diria que as linhas alternadas CSS devem ser feitas com uma pseudo classe CSS como tr:nth-child(even)e tr:nth-child(odd)ou tr:nth-child(2n). Embora seja apenas um exemplo, sinto que (na maioria das vezes) se algo é difícil ou estranho no Bigode, você está fazendo errado; há um lugar melhor para isso.
IAmNaN

3
Guidão tem a implementação local de servidor em java também github.com/jknack/handlebars.java
UR6LAD

2
@IAmNaN é justo em relação ao enésimo filho.
Dylan Watson

24

Uma diferença sutil, mas significativa, está na maneira como as duas bibliotecas abordam o escopo. O bigode retornará ao escopo dos pais se não conseguir encontrar uma variável no contexto atual; O guidão retornará uma string em branco.

Isso é pouco mencionado no README do GitHub, onde há uma linha para isso:

O guidão se desvia levemente do bigode, por não executar pesquisa recursiva por padrão.

No entanto, como observado lá, há uma bandeira para fazer o guidão se comportar da mesma maneira que o Bigode - mas isso afeta o desempenho.

Isso afeta a maneira como você pode usar #variáveis ​​como condicionais.

Por exemplo, no Bigode, você pode fazer isso:

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

Basicamente, significa "se a variável existir e for verdadeira, imprima uma extensão com a variável nela". Mas no guidão, você teria que:

  • use em {{this}}vez disso
  • use um caminho pai, ou seja, {{../variable}}para voltar ao escopo relevante
  • definir um variablevalor filho dentro do variableobjeto pai

Mais detalhes sobre isso, se você quiser, aqui .


23

NOTA: Esta resposta está desatualizada. Era verdade no momento em que foi postado, mas não é mais.

O bigode possui intérpretes em vários idiomas, enquanto o guidão é apenas Javascript.



7

Mais uma diferença sutil é o tratamento de valores falsos em {{#property}}...{{/property}}blocos. A maioria das implementações de bigodes apenas obedecem à falsidade de JS aqui, não renderizando o bloco se propertyfor ''ou '0'.

Guidão irá tornar o bloco para ''e 0, mas não outros valores Falsas. Isso pode causar alguns problemas ao migrar modelos.


5

Eu sinto que um dos contras mencionados para "Guiador" não é mais válido.

O Handlebars.java agora nos permite compartilhar as mesmas linguagens de modelo para o cliente e o servidor, o que é uma grande vitória para projetos grandes com mais de 1000 componentes que exigem renderização no servidor para SEO

Dê uma olhada em https://github.com/jknack/handlebars.java


3

- Além de usar "this" para guidão e a variável aninhada no bloco variável para bigode, você também pode usar o ponto aninhado em um bloco para bigode:

    {{#variable}}<span class="text">{{.}}</span>{{/variable}}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.