erb、haml还是slim:你会推荐哪个?为什么?

110

我正在学习Rails,看到了这些模板引擎。我只有erb的使用经验。

但作为一个初学者,我真的很困惑。你建议使用哪个,为什么?Erb、Haml还是Slim?请告诉我们您偏爱某个的原因。如果您有其他推荐,请告诉我们。

编辑: 我不是在寻求哪个更好的答案。我只是想听听您对它们、它们的语法、执行速度等方面的意见。


7
简短的回答是,作为初学者,使用ERB。 - Scott Schulthess
http://sephinrothcn.wordpress.com/2014/04/14/slim-vs-haml-performance-perspective/ - Virtual
虽然它不是一个模板引擎,但你可能想要了解一下我开发的 dom gem。它允许你无缝地将 HTML 代码编写为 Ruby 代码。 - sawa
19
这个“不具建设性”的问题对我非常有帮助。感谢您提出它,即使管理员因为某种原因觉得它不适合,也要感谢您。它是谷歌搜索结果中排名靠前的一个,并且这里的许多答案帮助我做出了决定。 - Andy Baird
2
它仍然是“rails html erb”的#1谷歌搜索结果。 - Orwellophile
我几乎专门使用HAML工作,但我并不推荐它。HAML网站上的示例可能更漂亮,但在实际生活中,你会发现很多情况下它更丑陋和令人困惑。它肯定有更多需要学习的地方,并且灵活性较小。事实上,它的语法将概要风格与嵌套风格(用于属性)混合在一起,当你有很多属性时,它会破坏概要范式。 - iconoclast
5个回答

88

使用Slim相对于HAML的两个优点:

  1. Slim目前大约比HAML快8倍。

  2. Slim支持HTTP流式传输,而HAML不支持。

  3. Slim具有更自然的语法:a href="foo.html"


4
你关于 Slim 与 Haml 速度方面陈述的依据可靠吗?我在很多地方都看到过这方面的讨论,但除了在 Slim 的 GitHub 页面上(https://github.com/stonean/slim),我没有找到太多可证实的信息。 - Joshua Muheim
4
Slim提供了基准测试代码,您可以在自己的计算机上修改/测试:https://github.com/stonean/slim#testing - Gerry
6
+1 Slim支持HTTP流传输,我们在支付网关和Heroku上遇到问题,似乎使用流式HTTP是解决此问题的方法,但由于我们的应用程序使用HAML运行,这种解决方案不再可行。 - Flov
1
@DamianNowak 我认为你的说法过于笼统了。你可能是指在考虑其他因素的情况下,速度不一定是决定性因素。此外,如果一个库变得足够慢以至于成为瓶颈,那该怎么办呢?我相信开发人员会注意到这一点的。开发人员确实必须给速度一些权重,否则他们就不会很聪明,对吧? - Kelvin
17
如果进行过多额外的工作,过早地进行优化并不是一个好主意,但是仅仅因为性能显著提升而选择一种类似的库而非另一种并不算过早。 - Jamon Holmgren
显示剩余3条评论

68

如果你有一个只会编写普通 HTML 而不懂 HAML 或 Slim 的网页设计师,那么 ERB 是很好的选择。这样他们就可以编写 HTML,并且你可以使用正确的标签嵌入 Ruby 逻辑。

如果你同时处理 HTML 和 Ruby 逻辑,或者你的设计师愿意学习一些新东西(如 HAML),我会选择 HAML。它更加友好于 Ruby,字符数大大减少,比 ERB 更加易读。

例如(来自官方HAML 网站):

在 ERB 中,你的视图将如下所示:

<div id="profile">
  <div class="left column">
    <div id="date"><%= print_date %></div>
    <div id="address"><%= current_user.address %></div>
  </div>
  <div class="right column">
    <div id="email"><%= current_user.email %></div>
    <div id="bio"><%= current_user.bio %></div>
  </div>
</div>

在HAML中,它看起来会像这样:

#profile
  .left.column
    #date= print_date
    #address= current_user.address
  .right.column
    #email= current_user.email
    #bio= current_user.bio

更加简洁了!

至于HAML和SLIM的区别-我从未真正使用过SLIM,但我认为这是一个口味问题-看一下两种语法,并决定哪个更适合你。我不认为在这两个(HAML/SLIM)之间有绝对的胜者。


请阅读 - 最后一句关于最终获胜者的内容是关于 HAML 和 SLIM 的(已经适当编辑)。 - Erez Rabih
2
没错,我也赞同这个观点。虽然 Haml 和 Slim 可以从 HTML 中剔除所有垃圾代码,而且非常棒,但许多只会写 HTML 的人可能无法理解它(或者根本不是手写代码的人,或者依赖于代码片段和复制粘贴)。 - ocodo
8
@ErezRabih 实际上,HAML和SLIM之间存在重大差异。Slim比HAML快得多。它还具有更清晰的语法,并允许您更清晰地编写HTML属性:a href="foo" - Mohamad
它可能看起来更干净,但真正重要的是学习曲线,而Haml看起来不太直观。 - dev27
3
HAML看起来像一堆杂乱无章的单词,前面带有哈希和点。它很糟糕。第二个问题是,如果你从互联网上复制了一些东西,比如Bootstrap代码片段,你现在必须将其转换为HAML/SLIM,然后才能将其粘贴到你的代码中。这增加了开发时间。有时这些转换工具不干净,它们也会搞砸很多东西,你开始浪费时间哭泣和拔头发,而不是让你的代码工作 - 这都会减慢你的代码!HAML/SLIM也很慢。 - 15 Volts

39

我脑海中的想法是这样的:

ERB

优点

  • 默认开箱即用
  • 不依赖于空格
  • 进入门槛最低(如果从 HTML 转换),因为它是带有 Ruby 代码的 HTML
  • 大多数 IDE 的词法分析器默认读取它
  • DHH 偏爱它
  • 旧应用程序可能仍在使用它

缺点

  • 更冗长
  • helpers 和 views 中的 content_for 标签可能会快速变得混乱
  • content_for 标签使嵌套标签更加困难,因为 erb 只返回块中的最后一行。所以你必须将其附加到字符串中,然后返回字符串。

HAML

优点

  • 更加简洁,没有闭合标签,适用于较小的屏幕
  • 视觉上更加清晰的结构
  • 内置助手(haml_concat、haml_capture)可在助手方法中利用 Haml
  • 类链
  • 许多有用的语法糖,如 # 用于 div,. 用于类链,或 :javascript 用于 JS 标记

缺点

  • 依赖于空格,有时难以找出错误
  • 复杂的标签通常需要使用“哈希”格式。(虽然我认为这是灵活性的一个很好的例子,但对于初学者来说可能会很困难。)
  • 作为宝石添加(再次将其视为缺点可能有些牵强)
  • 设计师可能会遇到一些调整问题
  • 除了一般的空格警告之外...简单的空格错误,例如制表符和缩进的空格,可能会导致页面在生产中出错,而正常的规范/测试无法捕获。结论:期望需要更多的视图测试,并且可能不要在关键任务视图中使用Haml,除非您确定您的测试正在测试视图的实际呈现。
  • 比erb慢
    • 注意:我们谈论的是Ruby代码,如果速度是您的应用程序中的阻碍问题,则有其他替代品可供选择,例如Haskell

我想补充一点,相比erb而言,Haml在性能方面较慢。 - bkunzi01
没问题。我已经添加了那个。 - engineerDave
1
如果你喜欢HAML但又担心性能问题,可以试试Hamlit。我在我的应用程序中看到了渲染速度的大幅提升,几乎和ERB一样快。https://github.com/k0kubun/hamlit - Jorge Najera T

23

对我而言,问题在于你更愿意在每个标签前面加上%还是在每个新的文本块前面加上|

Slim:

 tag(attr= "value")
  | text

Haml:

 %tag{attr: "value"}
   text

还有一件需要注意的事情:haml假设在换行之间存在空格(去除Haml中的空格),而Slim则假设没有空格(在Slim中添加空格,请参见此处此处)。


9
+1. 但是如果标签内第一行文本与标签在同一行,则不需要使用管道符。只有在标签内的第一行文本不与标签在同一行时才需要使用管道符。由于缩进的存在,第一行之后的每一行都不需要使用管道符。 - Kelvin
1
我实际上喜欢 Slim 的这个方面,因为它让我更难编写非国际化字符串。 - KonstantinK
对于每个文本块,使用 |,而不是 % 来标记。标签比字面文本块多得多。在 slim 中,一个小但语义上的胜利是,任何带有 <> 标签的原始文本都要在前面加上显式的 |。我更喜欢“除非你用 | 明确表示它是字面意思,否则一切都是 slim”,而不是“除非你用 % 表示它是 haml,否则一切都是字面意思”。 - ahnbizcad
我认为Slim更像HTML(attr="value"),而Haml更像Ruby(类似于Hash的{key: "value"})。 - Franklin Yu

17

https://github.com/scalp42/hamlerbslim是一个独立的基准测试,显示Slim和Erb在性能方面表现最佳(同时,Slim倾向于降低HTML输出大小)。

我个人的看法是,总体而言,如果您有Haml/Slim的专业人员来管理视图,这将节省您的时间(==金钱)。

如果没有这些人,那么Erb绝对是最好的选择,因为无论怎样,都可以找到许多能够使用HTML/Erb工作但完全不了解Haml/Slim的人。

在最好的情况下,要训练这些人使用Slim或至少让他们接触它,并保留那些“懂它”的人数。


更新了 Rails 6 应用程序的基准测试:https://github.com/KamilDzierbicki/hamlerbslimtest - updater

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