Quali sono le differenze tra Moustache.js e Handlebars.js?


333

Le principali differenze che ho visto sono:

  • Manubrio aggiunge #if, #unless, #with, e#each
  • Manubrio aggiunge aiutanti
  • I modelli di manubri sono compilati (anche i baffi possono essere)
  • I manubri supportano i percorsi
  • Consente l'uso di {{this}}blocchi in (che genera il valore di stringa dell'articolo corrente)
  • Handlebars.SafeString() (e forse alcuni altri metodi)
  • Il manubrio è da 2 a 7 volte più veloce
  • Moustache supporta sezioni invertite (es. if !x ...)

(Per favore, correggimi se sbaglio con quanto sopra.)

Ci sono altre differenze importanti che mi mancano?


9
Ecco anche un test delle prestazioni che confronta questi due jsperf.com/dom-vs-innerhtml-based-templating/366 - ci sono alternative migliori;)
Mikko Ohtamaa

1
... e credo che sia #each, non #list.
Shadow Man,

@ShadowCreeper Grazie. Post aggiornato.
Chad Johnson,

1
Ne ho scritto a fondo e mostro anche come si può fare qualcosa di simile per modelli javascript super basici per contenuti dinamici qui: http://stephentvedt.com/2013/09/23/html-templating-comparison/
Stephen Tvedt

3
Mi chiedo chi abbia accettato l'ultima modifica (16-10-2014). Avrebbe dovuto essere una risposta.
Walter Tross,

Risposte:


125

L'hai praticamente inchiodato, tuttavia è anche possibile compilare modelli di baffi.

Ai baffi mancano gli helper e i blocchi più avanzati perché si sforza di essere senza logica. Gli helper personalizzati del manubrio possono essere molto utili, ma spesso finiscono per introdurre la logica nei modelli.

Moustache ha molti compilatori diversi (JavaScript, Ruby, Python, C, ecc.). Il manubrio è iniziato in JavaScript, ora ci sono progetti come django-handlebars , handlebars.java , handlebars-ruby , lightncandy (PHP) e handlebars-objc .


7
Non dimenticare Scandlebars, l'implementazione di Scala-Manubrio!
Codice Whisperer,

1
L'implementazione di Ruby richiede un interprete JavaScript, quindi in realtà non è un compilatore Ruby.
eltiare,

72

Pro baffi:

  • Scelta molto popolare con una grande comunità attiva.
  • Supporto lato server in molte lingue, incluso Java.
  • I modelli senza logica fanno un ottimo lavoro costringendoti a separare la presentazione dalla logica.
  • La sintassi pulita porta a modelli facili da costruire, leggere e gestire.

Contro dei baffi:

  • Un po 'meno logico: le attività di base (ad es. Etichetta di righe alternate con classi CSS diverse) sono difficili.
  • La logica di visualizzazione viene spesso rimandata al server o implementata come "lambda" (funzione richiamabile).
  • Perché lambdas funzioni su client e server, è necessario scriverli in JavaScript.

Professionisti del manubrio:

  • I modelli senza logica fanno un ottimo lavoro costringendoti a separare la presentazione dalla logica.
  • La sintassi pulita porta a modelli facili da costruire, leggere e gestire.
  • Modelli compilati anziché interpretati.
  • Migliore supporto per i percorsi rispetto ai baffi (ovvero, raggiungere in profondità un oggetto di contesto).
  • Migliore supporto per gli aiutanti globali rispetto ai baffi.

Contro del manubrio:

  • Richiede JavaScript sul lato server per il rendering sul server.

Fonte: analisi del modello sul lato client: baffi, manubri, dust.js e altro ancora


37
Re Moustache con "Un po 'meno logico". Direi che alternare le righe CSS dovrebbe essere fatto con una pseudo classe CSS come tr:nth-child(even)e tr:nth-child(odd)o tr:nth-child(2n). Anche se questo è solo un esempio, lo sento (la maggior parte delle volte) se qualcosa è difficile o imbarazzante con Moustache, allora stai sbagliando; c'è un posto migliore per questo.
IAmNaN,

3
Manubrio ha anche l'implementazione del sito server su java github.com/jknack/handlebars.java
UR6LAD

2
@IAmNaN è giusto riguardo all'ennesimo figlio ... a meno che tu non stia scrivendo html per una e-mail, dove puoi usare solo i CSS in linea - rendendo molto difficile usare l'ennesimo selettore!
Dylan Watson,

24

Una differenza sottile ma significativa sta nel modo in cui le due biblioteche si avvicinano all'ambito. Moustache tornerà all'ambito padre se non riesce a trovare una variabile nel contesto corrente; Il manubrio restituirà una stringa vuota.

Questo è appena menzionato nel README di GitHub, dove c'è una riga per questo:

Il manubrio si discosta leggermente dai baffi in quanto non esegue la ricerca ricorsiva per impostazione predefinita.

Tuttavia, come notato qui, c'è un flag per far comportare i manubri allo stesso modo dei baffi, ma influisce sulle prestazioni.

Questo ha un effetto sul modo in cui puoi usare le #variabili come condizionali.

Ad esempio in Moustache puoi farlo:

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

In pratica significa "se la variabile esiste ed è vera, stampa un intervallo con la variabile in essa". Ma nel manubrio dovresti o:

  • usa {{this}}invece
  • utilizzare un percorso principale, ad esempio, {{../variable}}per tornare all'ambito pertinente
  • definire un variablevalore figlio all'interno variabledell'oggetto genitore

Maggiori dettagli su questo, se li vuoi, qui .


23

NOTA: questa risposta è obsoleta. Era vero al momento della pubblicazione, ma non lo è più.

Moustache ha interpreti in molte lingue, mentre il manubrio è solo Javascript.



7

Un'altra differenza sottile è il trattamento dei valori falsi in {{#property}}...{{/property}}blocchi. La maggior parte delle implementazioni dei baffi obbedirà semplicemente alla falsità di JS qui, senza rendere il blocco se propertyè ''o "0".

Manubri si rende il blocco di ''e 0, ma non altri valori falsy. Ciò può causare alcuni problemi durante la migrazione dei modelli.


5

Sento che uno dei contro citati per "Manubrio" non è più valido.

Handlebars.java ora ci consente di condividere gli stessi linguaggi modello sia per client che per server, il che è una grande vittoria per grandi progetti con oltre 1000 componenti che richiedono il rendering sul lato server per SEO

Dai un'occhiata a https://github.com/jknack/handlebars.java


3

—Oltre a utilizzare "this" per i manubri e la variabile nidificata all'interno del blocco variabile per i baffi, è anche possibile utilizzare il punto nidificato in un blocco per i baffi:

    {{#variable}}<span class="text">{{.}}</span>{{/variable}}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.