Mustache Scalate与Mustache Java比较

17

我需要为我的Scala项目选择一个胡子(Mustache)渲染引擎。看起来只有Mustache-Java和Scalate这两个选择?有没有比较资料?哪一个更稳定/性能更好?

5个回答

6

我刚刚经历了与您同样的过程(Mustache Scalate或Mustache Java)。最终,我选择了Mustache Java,并且它工作得很好。

为什么选择Mustache Java?因为我只需要Mustache模板。Scalate提供的支持更多,而我不想在我的代码库中添加更多的“东西”,只想使用其部分功能。


3
我在使用scalatra-scalate时也使用了mustache。由于我已经投入了Scalatra,因此这是唯一明智的选择。如果可以选择,我会彻底尝试mustache-java。 Scalate引擎有点古怪和不成熟(仍然如此吗?)。
以下是我遇到的一些例子:
- 如果您修改默认分隔符{{=<% %>=}},则从那时起,您将不得不在分隔符周围添加空格,否则解析器会失败。 - 如果您想为缺少的键插入自定义处理,则无法实现。 - 有时呈现会出现明显没有原因的卡顿几分钟(这是使用Jade而不是Mustache,但仍然很可怕)。
如果您不进行复杂操作,则Mustache运作良好,而Scalate添加了一些巧妙的功能,例如默认模板等,这可能会对您有所帮助。

2
我刚刚经历了这场煎熬,尽管我想使用Scala,但最终我使用了Mustache-Java,原因有两个:
  1. 没有简单的方法从类路径的/resources目录加载模板(甚至只是普通的Java流对象)。这似乎非常基本,我很困惑为什么没有开箱即用。
  2. 与#1类似,没有简单的方法从简单的String中加载模板。如果您要这样做,您还需要编写自定义加载器。为什么?

这基于他们的文档。如果您将其用于生成服务器端网页,则Scalate看起来非常强大和灵活,但对于简单的用例,它会产生太多负担。

在Mustache-Java中,我发现一件事情,那就是您需要将数据转换为Java映射,否则它不起作用(至少在Scala 2.12中):

"Mustache test" should "succeed" in {
  import scala.collection.JavaConverters._

  val template = "Hello, {{name}}"
  val mf = new DefaultMustacheFactory()
  val mustache = mf.compile(new StringReader(template), "sample")
  val map = Map("name" -> "Joe")

  val sw = new StringWriter()
  mustache.execute(sw, map.asJava) // if you don't use .asJava here it's not going to work

  assert(sw.toString.contains("Joe"))
}

反转部分 起作用:

"Mustache test exclusion" should "succeed" in {
  import scala.collection.JavaConverters._

  val template = "Hello, {{^exclude}}am I excluded?{{/exclude}}"
  val mf = new DefaultMustacheFactory()
  val mustache = mf.compile(new StringReader(template), "sample")
  val map = Map("exclude" -> true)

  val sw = new StringWriter()
  mustache.execute(sw, map.asJava)

  assert(!sw.toString.contains("excluded"))
}

最后,关于列表:支持案例类,但对于任何列表字段,它们必须是Java类型。以下变体应该可行:

case class Plan(name: String, 
                currency: String, 
                price: String)

"Mustache test with object context with list" should "succeed" in {
  import scala.collection.JavaConverters._
  import java.util.{List => JavaList}

  val template =
    """{{#plans}}
      |Name: {{name}}
      |Price: {{currency}}{{price}}
      |{{/plans}}""".stripMargin
  val mf = new DefaultMustacheFactory()
  val mustache = mf.compile(new StringReader(template), "sample")
   
  // note the Java list type here
  case class Plans(plans: JavaList[Plan]) 
  val plans = Plans(Seq(Plan("essential", "$", "30")).asJava)
  val sw = new StringWriter()
  mustache.execute(sw, plans)

  val list = Seq(Plan("essential", "$", "30")).asJava
  mustache.execute(sw, Map("plans" -> list).asJava)

  assert(sw.toString.contains("Name"))
}

"Mustache test with list" should "succeed" in {
  import scala.collection.JavaConverters._

  val template =
    """{{#plans}}
      |Name: {{name}}
      |Price: {{currency}}{{price}}
      |{{/plans}}""".stripMargin
  val mf = new DefaultMustacheFactory()
  val mustache = mf.compile(new StringReader(template), "sample")
   
  val sw = new StringWriter()

  // do not forget .asJava here
  val list = Seq(Plan("essential", "$", "30")).asJava 

  // do not forget .asJava here
  mustache.execute(sw, Map("plans" -> list).asJava) 

  assert(sw.toString.contains("Name"))
}

0
Mustache-Java 的一个好处是相对于 Scala,Java 编译非常快。

如果你已经在使用Scala,那么这里的编译速度并不重要,因为Mustache没有被编译,对吧? - iwein
我相信Mustache在大多数情况下都应该被编译。例如,可以查看Mustache处理器中的--compile标志:http://mustache.github.com/mustache.1.html。 - Ben McCann
我不确定我理解那个链接与问题的相关性,因为它是一个 Ruby 实现的 man 页面。 - pohl
重点是mustache被编译了。这在Java实现中也是如此。 - Ben McCann

0
Scalate使得渲染Mustache模板变得容易,我宁愿使用一个相对直观的Scala库而不是Java库。
假设您有以下`simple_example.mustache`模板:
I like {{programming_language}}
The code is {{code_description}}

您可以使用以下代码渲染模板:

import org.fusesource.scalate.TemplateEngine
val sourceDataPath = os.pwd/"simple_example.mustache".toString
val engine = new TemplateEngine
val someAttributes = Map(
  "programming_language" -> "Scala",
  "code_description" -> "pretty"
)
engine.layout(sourceDataPath, someAttributes)

这是结果:

I like Scala
The code is pretty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接