Mustache.js和Handlebars.js有什么区别?

时间:2012-05-11 17:15:45

标签: handlebars.js mustache client-side-templating templating-engine

我见过的主要差异是:

  • 句柄添加了#if#unless#with#each
  • 把手添加助手
  • 处理句柄模板(Mustache也可以)
  • 车把支持paths
  • 允许在块中使用{{this}}(输出当前项的字符串值)
  • Handlebars.SafeString()(可能还有其他一些方法)
  • 把手是2 to 7 times faster
  • 小胡子支持inverted sections(即if !x ...

(如果我对上述内容有误,请纠正我。)

我还缺少其他重大差异吗?

9 个答案:

答案 0 :(得分:119)

你几乎已经钉了它,但是也可以编译Mustache模板。

Mustache缺少助手和更高级的块,因为它力求无逻辑。把手的自定义帮助程序非常有用,但最终会在模板中引入逻辑。

Mustache有许多不同的编译器(JavaScript,Ruby,Python,C等)。句柄始于JavaScript,现在有django-handlebarshandlebars.javahandlebars-rubylightncandy (PHP)handlebars-objc等项目。

答案 1 :(得分:67)

小胡子专业人士:

  • 非常受欢迎的选择,拥有一个庞大而活跃的社区。
  • 多种语言的服务器端支持,包括Java。
  • 无逻辑模板可以很好地强制您将表示与逻辑分开。
  • 清晰的语法会导致易于构建,阅读和维护的模板。

小胡子:

  • 有点太逻辑了:基本任务(例如标记具有不同CSS类的备用行)很难。
  • 查看逻辑通常被推回到服务器或实现为“lambda”(可调用函数)。
  • 要使lambda在客户端和服务器上运行,必须用JavaScript编写它们。

Handlebars pros:

  • 无逻辑模板可以很好地强制您将表示与逻辑分开。
  • 清晰的语法会导致易于构建,阅读和维护的模板。
  • 编译而非解释模板。
  • 比小胡子更好地支持路径(即深入到上下文对象中)。
  • 比小胡子更好地支持全球助手。

把手缺点:

  • 需要在服务器上呈现服务器端JavaScript。

来源:The client-side templating throwdown: mustache, handlebars, dust.js, and more

答案 2 :(得分:24)

两个图书馆接近范围的方式有一个微妙但重要的区别。如果在当前上下文中找不到变量,则Mustache将回退到父作用域;把手将返回一个空白字符串。

在GitHub自述文件中几乎没有提及,其中有一行代码:

  

Handlebars稍微偏离了Mustache,因为默认情况下它不会执行递归查找。

然而,如前所述,有一个标志可以使Handlebars的行为与Mustache相同 - 但它会影响性能。

这会影响您将#变量用作条件的方式。

例如在Mustache中你可以这样做:

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

它基本上意味着“如果变量存在并且是真实的,则打印带有变量的跨度”。但是在Handlebars中,你要么必须:

  • 使用{{this}}代替
  • 使用父路径,即{{../variable}}返回相关范围
  • 在父variable对象
  • 中定义子variable

如果您需要,请详细了解here

答案 3 :(得分:20)

注意: 此答案已过时。它在发布时确实如此,但不再是。

Mustache有多种语言的口译员,而Handlebars只有Javascript。

答案 4 :(得分:10)

它们之间的另一个区别是文件的大小:

要了解Handlebars.js的性能优势,我们必须使用预编译模板。

来源:An Overview of JavaScript Templating Engines

答案 5 :(得分:7)

另一个细微差别是{{#property}}...{{/property}}块中的假值的处理。大多数小胡子实现只会在这里服从JS虚假,如果property''或者&#39; 0&#39;则不会呈现阻止。

句柄呈现''0的阻止,而不是其他虚假值。迁移模板时,这可能会造成一些麻烦。

答案 6 :(得分:5)

我觉得“Handlebars”中提到的其中一个缺点不再“真正有效。”

Handlebars.java现在允许我们为客户端和服务器共享相同的模板语言,这对于具有1000多个需要服务器端呈现SEO的组件的大型项目来说是一个巨大的胜利

查看https://github.com/jknack/handlebars.java

答案 7 :(得分:3)

- 除了使用&#34;这个&#34;对于把手,以及胡子变量块中的嵌套变量,您还可以使用块中的嵌套点来表示小胡子:

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

答案 8 :(得分:0)

enter image description here

在这里您可以看到不同胡须与车把的速度测试。 mustache 在内存中缓存模板,无需任何用户努力,这就是我运行它一次的原因。它比胡子慢 3 倍。文件系统缓存可能会减慢开发速度,最终结果可能与单次运行相当。不要盲目相信那些说法,尤其是速度..(PHP 之所以很快,是因为启用了 opcache+jit)