Apa perbedaan antara Mustache.js dan Handlebars.js?


333

Perbedaan utama yang saya lihat adalah:

  • Setang menambahkan #if, #unless, #with, dan#each
  • Setang menambah pembantu
  • Templat templat dikompilasi (Bisa juga kumis)
  • Setang mendukung jalur
  • Mengizinkan penggunaan {{this}}dalam blok (yang menampilkan nilai string item saat ini)
  • Handlebars.SafeString() (dan mungkin beberapa metode lain)
  • Setang 2 hingga 7 kali lebih cepat
  • Kumis mendukung bagian terbalik (yaitu if !x ...)

(Tolong koreksi saya jika saya salah dengan yang di atas.)

Apakah ada perbedaan besar lainnya yang saya lewatkan?


9
Berikut ini juga tes kinerja yang membandingkan kedua jsperf.com/dom-vs-innerhtml-based-templating/366 ini - ada alternatif yang lebih baik;)
Mikko Ohtamaa

1
... dan saya yakin itu # setiap, bukan # daftar.
Shadow Man

@ShadowCreeper Terima kasih. Pos yang diperbarui.
Chad Johnson

1
Saya telah menulis tentang ini secara mendalam dan juga menunjukkan bagaimana Anda dapat melakukan sesuatu yang serupa untuk template javascript super dasar untuk konten dinamis di sini: http://stephentvedt.com/2013/09/23/html-templating-comparison/
Stephen Tvedt

3
Saya ingin tahu siapa yang menerima suntingan terakhir (2014-10-16). Itu seharusnya menjadi jawaban.
Walter Tross

Jawaban:


125

Anda sudah cukup banyak memakukannya, namun template Moustache juga dapat dikompilasi.

Moustache adalah pembantu yang hilang dan blok yang lebih maju karena berusaha keras untuk menjadi tidak logis. Pembantu khusus setang bisa sangat berguna, tetapi seringkali berakhir dengan memasukkan logika ke dalam templat Anda.

Moustache memiliki banyak kompiler berbeda (JavaScript, Ruby, Python, C, dll.). Setang dimulai pada JavaScript, sekarang ada proyek-proyek seperti Django-setang , handlebars.java , setang-ruby , lightncandy (PHP) , dan setang-ObjC .


7
Jangan lupakan Scandlebars, implementasi Scala-Handlebars!
Code Whisperer

1
Implementasi Ruby memerlukan penerjemah JavaScript, jadi itu benar-benar bukan kompiler Ruby.
eltiare

72

Pro kumis:

  • Pilihan yang sangat populer dengan komunitas yang besar dan aktif.
  • Dukungan sisi server dalam banyak bahasa, termasuk Java.
  • Template tanpa logika melakukan pekerjaan besar yang memaksa Anda untuk memisahkan presentasi dari logika.
  • Bersihkan sintaks ke templat yang mudah dibuat, dibaca, dan dipelihara.

Kontra kumis:

  • Agak terlalu tidak logis: tugas dasar (mis. Label baris alternatif dengan kelas CSS berbeda) sulit.
  • Logika tampilan sering didorong kembali ke server atau diimplementasikan sebagai "lambda" (fungsi yang dapat dipanggil).
  • Agar lambdas berfungsi pada klien dan server, Anda harus menuliskannya dalam JavaScript.

Pro setang:

  • Template tanpa logika melakukan pekerjaan besar yang memaksa Anda untuk memisahkan presentasi dari logika.
  • Bersihkan sintaks ke templat yang mudah dibuat, dibaca, dan dipelihara.
  • Dikompilasi daripada template yang ditafsirkan.
  • Dukungan yang lebih baik untuk jalur daripada kumis (yaitu, menjangkau jauh ke dalam objek konteks).
  • Dukungan yang lebih baik untuk pembantu global daripada kumis.

Kontra setang:

  • Membutuhkan JavaScript sisi server untuk membuat di server.

Sumber: Pelemparan templating sisi-klien: kumis, setang, dust.js, dan banyak lagi


37
Re Moustache con "Sedikit terlalu logika-kurang". Saya berpendapat bahwa bergantian baris CSS harus dilakukan dengan kelas pseudo CSS seperti tr:nth-child(even)dan tr:nth-child(odd)atau tr:nth-child(2n). Meskipun itu hanya sebuah contoh, saya merasa bahwa (sebagian besar waktu) jika ada sesuatu yang sulit atau canggung dengan Kumis, maka Anda salah melakukannya; ada tempat yang lebih baik untuk itu.
IAmNaN

3
Setang memiliki implementasi situs server di java juga github.com/jknack/handlebars.java
UR6LAD

2
@ AMNNaN itu adil tentang n-child .. kecuali Anda menulis html untuk email, di mana Anda hanya dapat menggunakan inline css - sehingga sangat sulit untuk menggunakan pemilih ke-n!
Dylan Watson

24

Satu perbedaan kecil tapi signifikan adalah dalam cara kedua perpustakaan mendekati ruang lingkup. Kumis akan kembali ke lingkup induk jika tidak dapat menemukan variabel dalam konteks saat ini; Setang akan mengembalikan string kosong.

Ini hampir tidak disebutkan dalam GitHub README, di mana ada satu baris untuk itu:

Setang sedikit menyimpang dari Moustache karena tidak melakukan pencarian rekursif secara default.

Namun, seperti disebutkan di sana, ada bendera untuk membuat Setang berperilaku dengan cara yang sama seperti Kumis - tetapi itu mempengaruhi kinerja.

Ini memiliki efek pada cara Anda dapat menggunakan # variabel sebagai kondisional.

Misalnya di Kumis Anda dapat melakukan ini:

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

Ini pada dasarnya berarti "jika variabel ada dan benar, cetak rentang dengan variabel di dalamnya". Namun di Handlebars, Anda harus:

  • menggunakan {{this}} saja
  • gunakan jalur induk, yaitu, {{../variable}} untuk kembali ke lingkup yang relevan
  • mendefinisikan variablenilai anak dalam variableobjek induk

Lebih detail tentang ini, jika Anda menginginkannya, di sini .


23

CATATAN: Jawaban ini sudah usang. Memang benar pada saat itu diposting, tetapi tidak lagi.

Moustache memiliki juru bahasa dalam banyak bahasa, sedangkan Handlebars hanya Javascript.



7

Satu perbedaan yang lebih halus adalah perlakuan nilai-nilai palsu dalam {{#property}}...{{/property}}blok. Sebagian besar implementasi kumis hanya akan mematuhi JS falsiness di sini, tidak merender blok jika propertyada ''atau '0'.

Setang akan membuat blok untuk ''dan 0, tetapi bukan nilai-nilai palsu lainnya. Ini dapat menyebabkan beberapa masalah saat memigrasi template.


5

Saya merasa bahwa salah satu kontra yang disebutkan untuk "Setang" tidak benar-benar berlaku lagi.

Handlebars.java sekarang memungkinkan kami untuk berbagi bahasa templat yang sama untuk klien dan server yang merupakan kemenangan besar untuk proyek besar dengan 1000+ komponen yang memerlukan rendering sisi server untuk SEO

Lihatlah https://github.com/jknack/handlebars.java


3

—Selain menggunakan "ini" untuk setang, dan variabel bersarang di dalam blok variabel untuk kumis, Anda juga dapat menggunakan titik bersarang di blok untuk kumis:

    {{#variable}}<span class="text">{{.}}</span>{{/variable}}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.