Mustache.js กับ Handlebars.js แตกต่างกันอย่างไร


333

ความแตกต่างที่สำคัญที่ฉันเห็นคือ:

  • แฮนด์เพิ่ม#if, #unless, #withและ#each
  • แฮนด์บาร์เพิ่มผู้ช่วย
  • แม่แบบแฮนด์บาร์รวบรวม (หนวดอาจเกินไป)
  • แฮนด์สนับสนุนเส้นทาง
  • อนุญาตให้ใช้{{this}}ในบล็อก (ซึ่งส่งออกค่าสตริงของรายการปัจจุบัน)
  • Handlebars.SafeString() (และอาจมีวิธีอื่น ๆ )
  • แฮนด์บาร์เร็วขึ้น 2 ถึง 7 เท่า
  • หนวดสนับสนุนส่วนกลับหัว (เช่นif !x ...)

(โปรดแก้ไขให้ฉันด้วยถ้าผิดกับข้างต้น)

มีความแตกต่างที่สำคัญอื่น ๆ ที่ฉันหายไปหรือไม่?


9
นี่คือการทดสอบประสิทธิภาพเปรียบเทียบสองjsperf.com/dom-vs-innerhtml-based-templating/366 - มีทางเลือกที่ดีกว่า;)
Mikko Ohtamaa

1
... และฉันเชื่อว่า #each ไม่ใช่รายการ #
Shadow Man

@ShadowCreeper ขอบคุณ อัปเดตโพสต์แล้ว
แช้ดจอห์นสัน

1
ฉันได้เขียนเกี่ยวกับเรื่องนี้ในเชิงลึกและยังแสดงวิธีที่คุณสามารถทำสิ่งที่คล้ายกันสำหรับแม่แบบจาวาสคริปต์ขั้นพื้นฐานสำหรับเนื้อหาแบบไดนามิกที่นี่: http://stephentvedt.com/2013/09/23/html-templating-comparison/
Stephen Tvedt

3
ฉันสงสัยว่าใครตอบรับการแก้ไขล่าสุด (2014-10-16) มันควรจะได้รับคำตอบ
Walter Tross

คำตอบ:


125

คุณตอกหมุดสวยมากแล้วอย่างไรก็ตามยังสามารถรวบรวมแม่แบบหนวดได้

หนวดหายไปไม่มีผู้ช่วยเหลือและบล็อกขั้นสูงกว่าเพราะพยายามอย่างไร้เหตุผล ผู้ช่วยที่กำหนดเองของแฮนด์บาร์มีประโยชน์มาก แต่มักจะจบลงด้วยการแนะนำตรรกะในแม่แบบของคุณ

หนวดมีคอมไพเลอร์ต่าง ๆ (JavaScript, Ruby, Python, C, ฯลฯ ) แฮนด์เริ่มใน JavaScript ตอนนี้มีโครงการเช่นDjango-แฮนด์ , handlebars.java , แฮนด์ทับทิม , lightncandy (PHP)และแฮนด์-ObjC


7
อย่าลืม Scandlebars การติดตั้ง Scala-Handlebars!
รหัส Whisperer

1
การติดตั้ง Ruby ต้องใช้ล่าม JavaScript ดังนั้นจึงไม่ใช่คอมไพเลอร์ Ruby
eltiare

72

ข้อดีหนวด:

  • ทางเลือกที่นิยมมากกับชุมชนขนาดใหญ่ที่ใช้งานอยู่
  • การสนับสนุนฝั่งเซิร์ฟเวอร์ในหลายภาษารวมถึง Java
  • เทมเพลตที่ไม่ใช้ลอจิกช่วยให้คุณแยกงานนำเสนอออกจากตรรกะได้อย่างยอดเยี่ยม
  • ล้างไวยากรณ์นำไปสู่แม่แบบที่ง่ายต่อการสร้างอ่านและบำรุงรักษา

ข้อเสียหนวด:

  • ตรรกะน้อยเกินไป: งานพื้นฐาน (เช่นป้ายกำกับแถวสลับกับคลาส CSS ที่แตกต่างกัน) เป็นเรื่องยาก
  • มุมมองแบบลอจิกมักถูกส่งกลับไปที่เซิร์ฟเวอร์หรือถูกใช้เป็น "แลมบ์ดา" (ฟังก์ชั่นที่เรียกได้)
  • เพื่อให้แลมบ์ดาทำงานบนไคลเอนต์และเซิร์ฟเวอร์คุณต้องเขียนมันในจาวาสคริปต์

ข้อดีของมือจับ:

  • เทมเพลตที่ไม่ใช้ลอจิกช่วยให้คุณแยกงานนำเสนอออกจากตรรกะได้อย่างยอดเยี่ยม
  • ล้างไวยากรณ์นำไปสู่แม่แบบที่ง่ายต่อการสร้างอ่านและบำรุงรักษา
  • รวบรวมมากกว่าแม่แบบที่ถูกตีความ
  • การรองรับเส้นทางที่ดีกว่าหนวด (เช่นการเข้าถึงส่วนลึกของวัตถุบริบท)
  • สนับสนุนผู้ช่วยเหลือทั่วโลกได้ดีกว่าหนวด

ข้อเสียแฮนด์:

  • ต้องการ JavaScript ฝั่งเซิร์ฟเวอร์เพื่อแสดงผลบนเซิร์ฟเวอร์

ที่มา: การขว้างปาเทมเพลตฝั่งไคลเอ็นต์: หนวด, แฮนด์บาร์, dust.js และอีกมากมาย


37
เรื่องหนวดกับ "ตรรกะน้อยเกินไปน้อย" ผมขอยืนยันว่าการสลับแถว CSS ควรจะทำกับชั้นหลอก CSS เช่นtr:nth-child(even)และหรือtr:nth-child(odd) tr:nth-child(2n)แม้ว่าจะเป็นเพียงตัวอย่าง แต่ฉันรู้สึกว่า (ส่วนใหญ่) หากมีบางอย่างที่ยากหรืออึดอัดใจกับหนวดคุณก็ทำผิดไป มีสถานที่ที่ดีกว่าสำหรับมัน
IAmNaN

3
Handlebars มีการติดตั้งไซต์เซิร์ฟเวอร์บน java ด้วยเช่นกันgithub.com/jknack/handlebars.java
UR6LAD

2
@IAmNaN มันยุติธรรมสำหรับ nth-child .. เว้นแต่คุณกำลังเขียน html สำหรับอีเมลซึ่งคุณสามารถใช้ inline css ได้เท่านั้นทำให้ยากมากที่จะใช้ตัวเลือก nth!
Dylan Watson

24

ความแตกต่างที่ลึกซึ้ง แต่สำคัญอย่างหนึ่งคือวิธีที่ขอบเขตไลบรารีสองแนวทางเข้าใกล้ หนวดจะกลับไปสู่ขอบเขตพาเรนต์หากไม่พบตัวแปรภายในบริบทปัจจุบัน แฮนด์บาร์จะส่งคืนสตริงว่าง

นี่เพิ่งจะพูดถึงใน GitHub README ซึ่งมีหนึ่งบรรทัดสำหรับมัน:

แฮนด์บาร์เบี่ยงเบนจากหนวดเล็กน้อยซึ่งจะไม่ทำการค้นหาแบบเรียกซ้ำโดยค่าเริ่มต้น

อย่างไรก็ตามตามที่ระบุไว้ที่นั่นมีการตั้งค่าสถานะเพื่อให้ Handlebars ทำงานในลักษณะเดียวกับหนวด - แต่มันมีผลต่อประสิทธิภาพการทำงาน

สิ่งนี้มีผลกับวิธีที่คุณสามารถใช้#ตัวแปรเป็นเงื่อนไข

ตัวอย่างเช่นในหนวดคุณสามารถทำสิ่งนี้:

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

โดยทั่วไปหมายถึง "ถ้ามีตัวแปรอยู่และเป็นความจริงให้พิมพ์ span ด้วยตัวแปรที่อยู่ในนั้น" แต่ใน Handlebars คุณจะต้อง:

  • ใช้{{this}}แทน
  • ใช้พา ธ พาเรนต์{{../variable}}เพื่อกลับไปยังขอบเขตที่เกี่ยวข้อง
  • กำหนดvariableค่าลูกภายในvariableวัตถุแม่

รายละเอียดเพิ่มเติมเกี่ยวกับเรื่องนี้ถ้าคุณต้องการให้พวกเขาที่นี่


23

หมายเหตุ: คำตอบนี้ล้าสมัยแล้ว มันเป็นความจริงในขณะที่โพสต์ แต่ไม่มีอีกต่อไป

หนวดมีล่ามหลายภาษาในขณะที่แฮนด์บาร์เป็น Javascript เท่านั้น


11

ความแตกต่างระหว่างพวกเขาก็คือขนาดของไฟล์:

  • Mustache.js มีขนาด 9kb
  • Handlebars.js มี 86kb หรือ 18kb หากใช้เทมเพลตที่คอมไพล์แล้ว

หากต้องการดูประโยชน์ด้านประสิทธิภาพของ Handlebars.js เราต้องใช้เทมเพลตที่คอมไพล์แล้ว

ที่มา: ภาพรวมของเครื่องมือสร้างเทมเพลต JavaScript


7

ความแตกต่างที่ลึกซึ้งอีกอย่างหนึ่งคือการรักษาค่าที่ผิดพลาดใน{{#property}}...{{/property}}บล็อก การใช้งานหนวดส่วนใหญ่จะทำตามความผิดพลาดของ JS ที่นี่เท่านั้นไม่แสดงผลบล็อกถ้าpropertyเป็น''หรือ '0'

แฮนด์บาร์จะแสดงผลบล็อก''และ0แต่ไม่ใช่ค่าที่ผิดพลาดอื่น ๆ ซึ่งอาจทำให้เกิดปัญหาเมื่อย้ายเทมเพลต


5

ฉันรู้สึกว่าหนึ่งในข้อเสียดังกล่าวสำหรับ "แฮนด์บาร์" ไม่ถูกต้องอีกต่อไป

Handlebars.java ช่วยให้เราสามารถแบ่งปันเทมเพลตภาษาเดียวกันสำหรับทั้งไคลเอนต์และเซิร์ฟเวอร์ซึ่งเป็นชัยชนะครั้งใหญ่สำหรับโครงการขนาดใหญ่ที่มีส่วนประกอบมากกว่า 1,000 รายการที่ต้องใช้การแสดงผลเซิร์ฟเวอร์สำหรับ SEO

ดูที่https://github.com/jknack/handlebars.java


3

- นอกเหนือจากการใช้ "this" สำหรับแฮนด์บาร์และตัวแปรที่ซ้อนกันภายในบล็อกตัวแปรสำหรับหนวดคุณยังสามารถใช้จุดซ้อนในบล็อกสำหรับหนวด:

    {{#variable}}<span class="text">{{.}}</span>{{/variable}}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.