我看到的主要区别是:
- 车把增加
#if
,#unless
,#with
, 和#each
- Handlebars 添加助手
- 车把模板已编译(Mustache 也可以)
- 车把支持路径
- 允许使用
{{this}}
in 块(输出当前项目的字符串值) Handlebars.SafeString()
(也许还有其他一些方法)- 车把快 2 到 7 倍
- 小胡子支持倒置部分(即
if !x ...
)
(如果我对上述内容有误,请纠正我。)
我还缺少其他主要区别吗?
您几乎已经掌握了它,但是也可以编译 Mustache 模板。
Mustache 缺少助手和更高级的块,因为它力求无逻辑。Handlebars 的自定义助手可能非常有用,但通常最终会在您的模板中引入逻辑。
Mustache 有许多不同的编译器(JavaScript、Ruby、Python、C 等)。Handlebars 始于 JavaScript,现在有django-handlebars、handlebars.java、handlebars-ruby、lightncandy (PHP)和handlebars-objc 等项目。
胡子优点:
胡子缺点:
车把优点:
车把缺点:
一个微妙但重要的区别是这两个库处理范围的方式。如果在当前上下文中找不到变量,Mustache 将回退到父作用域;Handlebars 将返回一个空白字符串。
这在 GitHub README 中几乎没有提到,其中只有一行:
Handlebars 与 Mustache 略有不同,默认情况下它不执行递归查找。
然而,正如那里所指出的,有一个标志可以使 Handlebars 的行为方式与 Mustache 相同——但它会影响性能。
这会影响您将#
变量用作条件的方式。
例如,在 Mustache 中,您可以这样做:
{{#variable}}<span class="text">{{variable}}</span>{{/variable}}
它基本上意味着“如果变量存在并且是真实的,则打印一个包含变量的跨度”。但在 Handlebars 中,您要么必须:
{{this}}
改为使用{{../variable}}
返回相关范围variable
在父variable
对象中定义子值有关此的更多详细信息,如果您想要它们,请点击此处。
注意: 此答案已过时。发布时确实如此,但现在不再如此。
Mustache 有多种语言的解释器,而 Handlebars 只有 Javascript。
它们之间的另一个区别是文件的大小:
要查看 Handlebars.js 的性能优势,我们必须使用预编译模板。
另一个细微的区别是对块中虚假值的处理{{#property}}...{{/property}}
。大多数 mustache 实现在这里只会服从 JS 的虚假性,如果property
是''
或“0”,则不会渲染块。
Handlebars将为''
和渲染块0
,但不会渲染其他虚假值。这可能会在迁移模板时引起一些麻烦。
我觉得“Handlebars”的上述缺点之一不再有效。
Handlebars.java 现在允许我们为客户端和服务器共享相同的模板语言,这对于具有 1000 多个需要服务器端渲染以进行 SEO 的组件的大型项目来说是一个巨大的胜利
— 除了将“this”用于车把,将变量块中的嵌套变量用于 mustache,您还可以将块中的嵌套点用于 mustache:
{{#variable}}<span class="text">{{.}}</span>{{/variable}}