Haml 和 Slim 选哪个?两大极简模板引擎对比
Haml 用 % 标记元素、语法严格,Slim 去掉 % 更自由更轻。本文从元素标记、属性写法、文本处理、转义、性能与工具链对比 Haml 与 Slim,帮你在两大 Rails 极简模板引擎之间做选择。
Slim 在 Haml 的理念上更进一步——去掉 % 前缀、属性写法更灵活、性能略优,新项目二选一推荐 Slim;Haml 胜在历史悠久、语法规则严格统一,老项目和偏好"一眼认出元素"的团队可以继续用。两者可相互转换,迁移成本低。
核心差异:一个百分号的距离
-# Haml
%div.user-card
%h2= @user.name
%p.bio= @user.bio
/ Slim
div.user-card
h2 = @user.name
p.bio = @user.bio
Haml 用 % 显式标记每个元素——扫一眼就知道哪些是标签哪些是文本;Slim 认为标签名本身已足够识别,干脆去掉 %,屏幕上符号更少。这是"显式标记派"与"极简派"的审美分歧,没有对错。
元素可见性与属性写法
Haml 的属性是 Ruby Hash 风格,包在花括号里:
%input{ type: 'text', disabled: @locked, data: { controller: 'mask' } }
Slim 给三种选择:Hash 风格、HTML 风格、引号风格:
input type="text" disabled=@locked data-controller="mask"
a(href=user_path(@user) class="btn") 查看
Slim 的 HTML 风格属性和真实 HTML 几乎一致,从原型改模板时改动最小,这是它对 Haml 的实质改进。
文本与内联元素
两者都用 | 标记多行文本行。处理"链接后紧跟标点"这类内联场景时,Haml 用 > 去除标签外空白、succeed/precede 辅助方法;Slim 用 < > 控制空白外加 ' 保留尾随空格,写法更直白:
p
| 详情请
a< href="/docs" 查看文档
| 。
控制结构与内联 Ruby
条件、循环的写法两者一致:- if 执行不输出、= 输出。差异在细节:Slim 允许多种输出修饰(== 不转义、, 行尾逗号场景),Haml 的规则更刚性。多行 Ruby 表达式 Haml 用 | 续行,Slim 同样支持;但两者里写超过两行的 Ruby 都该警惕——那是逻辑放错层的信号。
转义、过滤器与注释
- 转义:默认都转义。Haml 用
!=原样输出,Slim 用==。同样规则:用户输入绝不放行。 - 过滤器:Haml 的
:javascript、:css、:markdown生态成熟;Slim 也支持同名过滤器,外加:ruby、:coffee等,覆盖相当。 - 注释:Haml 是
/(输出 HTML 注释)和-#(引擎注释);Slim 是/和/!。模板内敏感备注都用后者,不进最终 HTML。
性能与工具链
两者都编译成 Ruby 执行,Slim 在基准测试中一贯略快(解析器设计更现代),但实际项目中差距远小于一次 N+1 查询。工具链:Haml 有 haml-lint、所有老牌编辑器插件;Slim 有 slim-lint,主流编辑器支持齐全。相互转换可用 haml2slim,迁移主要工作量在回归测试而非语法。
常见问题(FAQ)
Q:从 Haml 迁到 Slim 值得吗?
如果团队没有强烈不满,单纯为语法迁移收益有限;如果是想顺便统一属性风格、提升可读性,值得一做。用 haml2slim 转换后重点回归带复杂属性和空白控制的模板。
Q:Slim 里怎么写布尔属性?
直接赋值 Ruby 布尔值即可:input type="checkbox" disabled=true。属性值为 false/nil 时 Slim 会整个省略该属性,与 HTML 语义一致。
Q:两者和 ERB 混用冲突吗?
不冲突。Rails 按文件扩展名分发模板引擎,布局用 ERB、局部模板用 Slim/Haml 完全可行,新旧页面可以渐进迁移。
参考文档
本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。