Mustache.js ve Handlebars.js arasındaki farklar nelerdir?


333

Gördüğüm önemli farklılıklar:

  • Gidon ekler #if, #unless, #withve#each
  • Gidon yardımcıları ekler
  • Gidon şablonları derlenir (Bıyık da olabilir)
  • Gidonlar yolları destekler
  • {{this}}Bloklar halinde kullanılmasına izin verir (geçerli öğenin dize değerini çıktılayan)
  • Handlebars.SafeString() (ve belki diğer bazı yöntemler)
  • Gidon 2 ila 7 kat daha hızlı
  • Bıyık ters bölümleri destekler (yani if !x ...)

(Lütfen yukarıda yanlış yaptığım takdirde beni düzeltin.)

Kaçırdığım başka büyük farklılıklar var mı?


9
İşte bu iki jsperf.com/dom-vs-innerhtml-based-templating/366 - karşılaştırmak için bir performans testi - daha iyi alternatifler var;)
Mikko Ohtamaa

1
... ve sanırım # liste değil, her biri.
Gölge Adam

@ShadowCreeper Teşekkürler. Güncelleme yayınlandı.
Chad Johnson

1
Bu konuda derinlemesine yazdım ve ayrıca dinamik içerik için süper temel javascript şablonları için nasıl benzer bir şey yapabileceğinizi gösterdim: http://stephentvedt.com/2013/09/23/html-templating-comparison/
Stephen Tvedt

3
Son düzenlemeyi kimin kabul ettiğini merak ediyorum (2014-10-16). Bir cevap olmalıydı.
Walter Tross

Yanıtlar:


125

Hemen hemen çivilenmişsiniz, ancak Bıyık şablonları da derlenebilir.

Bıyık yardımcıları ve daha gelişmiş blokları eksik çünkü mantıksız olmaya çalışıyor. Gidonların özel yardımcıları çok yararlı olabilir, ancak genellikle şablonlarınıza mantık ekler.

Bıyığın birçok farklı derleyicisi vardır (JavaScript, Ruby, Python, C, vb.). Gidonlar JavaScript'te başladı, şimdi django-gidonlar , gidonlar.java , gidonlar-ruby , lightncandy (PHP) ve gidonlar-objc gibi projeler var .


7
Scala-Gidon uygulaması olan Scandlebars'ı unutmayın!
Code Whisperer

1
Ruby uygulaması bir JavaScript yorumlayıcısı gerektirir, bu yüzden gerçekten bir Ruby derleyicisi değildir.
eltiare

72

Bıyık artıları:

  • Büyük, aktif bir toplulukla çok popüler bir seçim.
  • Java dahil birçok dilde sunucu tarafı desteği.
  • Mantıksız şablonlar, sunumu mantıktan ayırmaya zorlamak için harika bir iş çıkarır.
  • Temiz sözdizimi, oluşturulması, okunması ve bakımı kolay şablonlara yol açar.

Bıyık eksileri:

  • Biraz mantıksız: temel görevler (örneğin, farklı CSS sınıflarına sahip alternatif satırları etiketlemek) zordur.
  • Görünüm mantığı genellikle sunucuya geri gönderilir veya "lambda" (çağrılabilir işlev) olarak uygulanır.
  • Lamdasların istemci ve sunucuda çalışması için bunları JavaScript'te yazmanız gerekir.

Gidon artıları:

  • Mantıksız şablonlar, sunumu mantıktan ayırmaya zorlamak için harika bir iş çıkarır.
  • Temiz sözdizimi, oluşturulması, okunması ve bakımı kolay şablonlara yol açar.
  • Yorumlanmış şablonlar yerine derlendi.
  • Yollar için bıyıktan daha iyi destek (yani, bir bağlam nesnesinin derinliklerine ulaşmak).
  • Küresel yardımcılara bıyıktan daha iyi destek.

Gidon eksileri:

  • Sunucuda görüntülenmesi için sunucu tarafı JavaScript gerekir.

Kaynak: İstemci tarafında şablon atma: bıyık, gidon, dust.js ve daha fazlası


37
Re Bıyık con "Biraz fazla mantıksız". Alternatif satırlar CSS tr:nth-child(even)ve tr:nth-child(odd)veya gibi bir CSS sözde sınıf ile yapılması gerektiğini iddia ediyorum tr:nth-child(2n). Bu sadece bir örnek olmasına rağmen, (çoğu zaman) bıyıklı bir şey zorsa veya garipse, o zaman yanlış yapıyorsunuz; bunun için daha iyi bir yer var.
IAmNaN


2
@IAmNaN bu nth-child hakkında adil .. bir e-posta için html yazmıyorsanız, sadece satır içi css kullanabilirsiniz - n. Seçici kullanmak çok zor!
Dylan Watson

24

İnce ama önemli bir fark, iki kütüphanenin kapsama yaklaşım biçimidir. Mevcut bağlamda bir değişken bulamazsa, bıyık ebeveyn kapsamına geri döner; Gidon boş bir dize döndürür.

Bunun için bir satırın olduğu GitHub README'de zar zor bahsediliyor:

Gidonlar, varsayılan olarak özyinelemeli arama gerçekleştirmemesi nedeniyle Bıyıktan biraz sapar.

Ancak, burada belirtildiği gibi, Gidonların Bıyıkla aynı şekilde davranmasını sağlamak için bir bayrak vardır - ancak performansı etkiler.

Bunun, #değişkenleri koşullu olarak kullanma şekliniz üzerinde bir etkisi vardır .

Örneğin, Bıyık'ta bunu yapabilirsiniz:

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

Temel olarak "değişken varsa ve doğruysa, içinde değişken olan bir açıklık yazdırın" anlamına gelir. Ancak Gidonlarda aşağıdakileri yapmanız gerekir:

  • kullanmak {{this}}yerine
  • bir ana yol kullanın, yani {{../variable}}ilgili kapsama geri dönmek için
  • variableÜst variablenesne içinde bir alt değer tanımlama

Bununla ilgili daha fazla ayrıntı, eğer isterseniz, burada .


23

NOT: Bu cevap eski. Gönderildiği tarihte doğruydu, ama artık değil.

Bıyık birçok dilde tercüman içerirken, Gidon yalnızca Javascripttir.



7

Bir başka ince fark, {{#property}}...{{/property}}bloklardaki yanlış değerlerin tedavisidir . Çoğu bıyık uygulamaları sadece itaat JS eğer blok oluşturulmuyorsa, burada falsiness olacak propertyolan ''ya da '0'.

Gidon olacak için blok işlemek ''ve 0diğer falsy değerleri değil. Bu, şablonlar taşınırken bazı sorunlara neden olabilir.


5

"Gidon" için bahsedilen eksilerinden birinin artık gerçekten geçerli olmadığını hissediyorum.

Handlebars.java artık, aynı şablon dillerini hem istemci hem de sunucu için paylaşmamıza izin veriyor; bu, büyük projeler için büyük bir kazanç.

Https://github.com/jknack/handlebars.java adresine bir göz atın


3

- Gidonlar için "this" i ve bıyık için değişken blok içindeki iç içe değişkeni kullanmaya ek olarak, bıyık için bir bloktaki iç içe noktayı da kullanabilirsiniz:

    {{#variable}}<span class="text">{{.}}</span>{{/variable}}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.