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

我发现的主要区别是:

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

(如有错误,请指正。)

还有其他我忽略的主要区别吗?

141598 次浏览

你已经完成了很多,但是Mustache模板也可以编译。

Mustache缺少帮助程序和更高级的模块,因为它努力做到无逻辑。句柄的自定义助手可能非常有用,但通常会在模板中引入逻辑。

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

胡子优点:

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

胡子缺点:

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

车把优点:

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

车把缺点:

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

来源:客户端模板:胡子、车把、dust.js等等

注意: 这个答案已经过时了。发布的时候是这样,但现在不是了。

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

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

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

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

然而,正如上面所提到的,有一个标志可以使Handlebars的行为与Mustache相同,但它会影响性能。

这对你使用#变量作为条件的方式有影响。

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

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

它基本上意味着“如果变量存在并且为真,则打印包含变量的span”。但在Handlebars中,你要么必须:

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

更多的细节,如果你想要,在这里

-除了对车把使用"this",对mustache使用变量块内的嵌套变量,你也可以对mustache使用块内的嵌套点:

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

一个更微妙的区别是\{\{#property}}...\{\{/property}}块中错误值的处理。大多数mustache实现在这里将遵循JS的错误,如果property''或'0',则不呈现块。

句柄呈现''0的块,但不呈现其他虚假值。这可能会在迁移模板时带来一些麻烦。

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

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

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

来源:JavaScript模板引擎概述

我觉得其中一个提到的缺点“把手”不是真的有效了。

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

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

enter image description here

在这里你可以看到一些速度测试不同的胡子vs车把。髭须在内存中缓存模板,不需要任何用户的努力,这就是为什么我运行它一次。比胡子慢三倍。文件系统缓存可能会减慢开发速度,最终结果可能与单次运行相当。不要盲目相信这些言论,尤其是速度。(php速度很快,因为启用了opcache+jit)