361

我看到的主要区别是:

  • 车把增加#if, #unless, #with, 和#each
  • Handlebars 添加助手
  • 车把模板已编译(Mustache 也可以)
  • 车把支持路径
  • 允许使用{{this}}in 块(输出当前项目的字符串值)
  • Handlebars.SafeString()(也许还有其他一些方法)
  • 车把快 2 到 7 倍
  • 小胡子支持倒置部分(即if !x ...

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

我还缺少其他主要区别吗?

4

9 回答 9

134

您几乎已经掌握了它,但是也可以编译 Mustache 模板。

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

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

于 2012-08-01T19:56:56.493 回答
77

胡子优点:

  • 非常受欢迎的选择,拥有庞大、活跃的社区。
  • 服务器端支持多种语言,包括 Java。
  • 无逻辑模板在强迫您将表示与逻辑分开方面做得很好。
  • 简洁的语法使模板易于构建、阅读和维护。

胡子缺点:

  • 有点太没有逻辑了:基本任务(例如用不同的 CSS 类标记交替行)很困难。
  • 视图逻辑通常被推回服务器或实现为“lambda”(可调用函数)。
  • 要让 lambda 在客户端和服务器上工作,您必须用 JavaScript 编写它们。

车把优点:

  • 无逻辑模板在强迫您将表示与逻辑分开方面做得很好。
  • 简洁的语法使模板易于构建、阅读和维护。
  • 编译而不是解释的模板。
  • 比 mustache 更好地支持路径(即深入到上下文对象中)。
  • 对全局助手的支持比 mustache 更好。

车把缺点:

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

资料来源:客户端模板丢弃:mustache、handlebars、dust.js 等

于 2013-12-28T10:21:31.313 回答
26

一个微妙但重要的区别是这两个库处理范围的方式。如果在当前上下文中找不到变量,Mustache 将回退到父作用域;Handlebars 将返回一个空白字符串。

这在 GitHub README 中几乎没有提到,其中只有一行:

Handlebars 与 Mustache 略有不同,默认情况下它不执行递归查找。

然而,正如那里所指出的,有一个标志可以使 Handlebars 的行为方式与 Mustache 相同——但它会影响性能。

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

例如,在 Mustache 中,您可以这样做:

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

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

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

有关此的更多详细信息,如果您想要它们,请点击此处

于 2014-11-02T16:43:12.793 回答
25

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

Mustache 有多种语言的解释器,而 Handlebars 只有 Javascript。

于 2014-01-18T17:09:28.253 回答
11

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

  • Mustache.js 有 9kb,
  • Handlebars.js 有 86kb,如果使用预编译模板,则为 18kb 。

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

来源:JavaScript 模板引擎概述

于 2016-08-03T11:50:19.357 回答
9

另一个细微的区别是对块中虚假值的处理{{#property}}...{{/property}}。大多数 mustache 实现在这里只会服从 JS 的虚假性,如果property''或“0”,则不会渲染块。

Handlebars将为''和渲染块0,但不会渲染其他虚假值。这可能会在迁移模板时引起一些麻烦。

于 2015-11-19T10:35:10.190 回答
5

我觉得“Handlebars”的上述缺点之一不再有效。

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

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

于 2016-11-17T21:59:29.613 回答
4

— 除了将“this”用于车把,将变量块中的嵌套变量用于 mustache,您还可以将块中的嵌套点用于 mustache:

    {{#variable}}<span class="text">{{.}}</span>{{/variable}}
于 2015-06-01T18:31:38.610 回答
0

在此处输入图像描述

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

于 2021-06-30T22:04:03.943 回答