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

Cha*_*son 321 templating-engine mustache client-side-templating handlebars.js

我见过的主要差异是:

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

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

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

fro*_*uty 123

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

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

Mustache有许多不同的编译器(JavaScript,Ruby,Python,C等).Handlebars开始于JavaScript,现在有django-handlebars,handlebars.java,handlebars-ruby,lightncandy(PHP)handlebars-objc等项目.

  • 不要忘记Scandlebars,Scala-Handlebars实施! (6认同)

Far*_*ini 69

小胡子职业:

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

小胡子缺点:

  • 有点太逻辑 - 基本任务(例如标记具有不同CSS类的备用行)是困难的.
  • 视图逻辑通常被推回到服务器或实现为"lambda"(可调用函数).
  • 要使lambda能够在客户端和服务器上运行,您必须使用JavaScript编写它们.

把手专业人士:

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

把手缺点:

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

来源:客户端模板抛出:小胡子,把手,dust.js等等

  • Re Mustache con"有点太逻辑了".我认为交替行CSS应该用CSS伪类完成,例如`tr:nth-​​child(even)`和`tr:nth-​​child(odd)`或`tr:nth-​​child(2n)` .虽然这只是一个例子,但我觉得(大部分时间)如果胡子有些困难或尴尬,那么你做错了; 这是一个更好的地方. (36认同)
  • Handlebars在java上也有服务器站点实现,https://github.com/jknack/handlebars.java (2认同)
  • @IAmNaN 这对 nth-child 来说是公平的..除非你正在为电子邮件编写 html,否则你只能使用内联 css - 这使得使用 nth 选择器变得非常困难! (2认同)

guy*_*sey 23

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

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

Handlebars略微偏离Mustache,因为默认情况下它不执行递归查找.

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

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

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

{{#variable}}<span class="text">{{variable}}</span>{{/variable}}
Run Code Online (Sandbox Code Playgroud)

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

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

如果您需要,请在此处详细了解此信息.


Kev*_*sJr 22

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

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

  • 没错,这只是一个古老的答案. (11认同)

sim*_*eco 10

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

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

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

来源:JavaScript模板引擎概述


Jak*_*ski 7

另一个细微差别是{{#property}}...{{/property}}块中的虚假值的处理.大多数胡子实现只会服从JS虚假,而不是渲染块,如果property''或'0'.

把手呈现块''0,而不是其他falsy值.迁移模板时,这可能会导致一些问题.


小智 5

\xe2\x80\x94除了对车把使用“this”,对胡子使用变量块中的嵌套变量外,还可以对胡子使用块中的嵌套点:

\n\n
    {{#variable}}<span class="text">{{.}}</span>{{/variable}}\n
Run Code Online (Sandbox Code Playgroud)\n


小智 5

我觉得"Handlebars"提到的缺点之一不再"真的有效".

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

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