355 votes

Quelles sont les différences entre Mustache.js et Handlebars.js ?

Les principales différences que j'ai vues sont :

  • Le guidon ajoute #if , #unless , #with y #each
  • Le guidon ajoute des aides
  • Les modèles de guidon sont compilés (Moustache peut l'être aussi)
  • Supports de guidon chemins
  • Permet l'utilisation de {{this}} en blocs (qui produit la valeur de la chaîne de caractères de l'élément courant)
  • Handlebars.SafeString() (et peut-être d'autres méthodes)
  • Le guidon est 2 à 7 fois plus rapide
  • Supports de moustache sections inversées (c'est-à-dire if !x ... )

(Veuillez me corriger si je me trompe dans ce qui précède).

Y a-t-il d'autres différences majeures que j'ignore ?

9 votes

Voici aussi un test de performance comparant ces deux-là jsperf.com/dom-vs-innerhtml-based-templating/366 - il existe de meilleures alternatives ;)

1 votes

...et je crois que c'est #chaque, pas #liste.

0 votes

@ShadowCreeper Merci. Poste mis à jour.

132voto

frontendbeauty Points 1131

Vous avez tout à fait raison, mais les modèles de Mustache peuvent également être compilés.

Mustache ne dispose pas des aides et des blocs les plus avancés car il s'efforce d'être sans logique. Les aides personnalisées de Handlebars peuvent être très utiles, mais finissent souvent par introduire de la logique dans vos modèles.

Mustache dispose de nombreux compilateurs différents (JavaScript, Ruby, Python, C, etc.). Handlebars a commencé en JavaScript, maintenant il y a des projets comme django-handlebars , guidon.java , guidon-ruby , lightncandy (PHP) y guidon-objc .

7 votes

N'oubliez pas Scandlebars, l'implémentation de Scala-Handlebars !

1 votes

L'implémentation de Ruby nécessite un interpréteur JavaScript, il ne s'agit donc pas vraiment d'un compilateur Ruby.

76voto

Faraz Points 1480

Les pros de la moustache :

  • Choix très populaire avec une communauté importante et active.
  • Support côté serveur dans de nombreux langages, y compris Java.
  • Les modèles sans logique font un excellent travail en vous obligeant à séparer la présentation de la logique.
  • Une syntaxe propre permet de créer des modèles faciles à construire, à lire et à maintenir.

Moustache contre :

  • Un peu trop peu logique : les tâches de base (par exemple, étiqueter des lignes alternées avec des classes CSS différentes) sont difficiles.
  • La logique d'affichage est souvent renvoyée vers le serveur ou mise en œuvre en tant que "lambda" (fonction appelable).
  • Pour que les lambdas fonctionnent sur le client et le serveur, vous devez les écrire en JavaScript.

Les pros du guidon :

  • Les modèles sans logique font un excellent travail en vous obligeant à séparer la présentation de la logique.
  • Une syntaxe propre permet de créer des modèles faciles à construire, à lire et à maintenir.
  • Modèles compilés plutôt qu'interprétés.
  • Meilleure prise en charge des chemins que celle de mustache (c'est-à-dire, atteindre profondément un objet contextuel).
  • Meilleur support pour les aides globales que la moustache.

Guidon contre :

  • Requiert du JavaScript côté serveur pour effectuer le rendu sur le serveur.

Source : L'épreuve de force des modèles côté client : mustache, handlebars, dust.js, etc.

40 votes

A propos de l'article de Moustache "Un peu trop dénué de logique". Je dirais que l'alternance des rangées en CSS devrait être faite avec une pseudo classe CSS telle que tr:nth-child(even) y tr:nth-child(odd) o tr:nth-child(2n) . Bien que ce ne soit qu'un exemple, je pense que (la plupart du temps) si quelque chose est difficile ou gênant avec Moustache, c'est que vous ne le faites pas bien ; il y a un meilleur endroit pour cela.

3 votes

Handlebars a aussi l'implémentation du site du serveur en Java. github.com/jknack/handlebars.java

2 votes

@IAmNaN c'est juste à propos de nth-child sauf si vous écrivez du html pour un email, où vous ne pouvez utiliser que du css en ligne - ce qui rend très difficile l'utilisation de nth selectors !

26voto

guypursey Points 1052

Une différence subtile mais significative réside dans la manière dont les deux bibliothèques abordent la portée. Mustache se rabattra sur la portée parentale s'il ne trouve pas de variable dans le contexte actuel ; Handlebars retournera une chaîne vide.

Cela est à peine mentionné dans le README de GitHub, où il y a une ligne pour cela :

Handlebars s'écarte légèrement de Mustache en ce qu'il n'effectue pas de recherche récursive par défaut.

Cependant, comme indiqué ici, il existe un drapeau qui permet à Handlebars de se comporter de la même manière que Mustache - mais cela affecte les performances.

Cela a un effet sur la façon dont vous pouvez utiliser # les variables comme conditionnelles.

Par exemple, dans Mustache, vous pouvez faire ceci :

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

Cela signifie essentiellement "si la variable existe et qu'elle est vraie, imprimer un span avec la variable dedans". Mais dans Handlebars, vous devriez soit :

  • utiliser {{this}} au lieu de
  • utiliser un chemin d'accès parent, c'est-à-dire, {{../variable}} pour revenir à une portée pertinente
  • définir un enfant variable au sein du parent variable objet

Plus de détails à ce sujet, si vous le souhaitez, aquí .

25voto

KevBurnsJr Points 2917

NOTE : Cette réponse est dépassée. Elle était vraie au moment où elle a été publiée, mais ne l'est plus.

Mustache a des interprètes dans de nombreux langages, tandis que Handlebars est uniquement Javascript.

8voto

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X