ERB 和 Slim 哪个好?Rails 模板语言深度对比
ERB 就是带 Ruby 标签的 HTML,Slim 则砍掉尖括号与闭合标签追求极简。本文从语法、动态属性、表单、转义、性能与工具链对比两大 Rails 模板语言,给出明确选型建议。
想直接粘贴 HTML 原型、团队技能参差、求稳选 ERB;追求极致简洁、能接受缩进语法、团队口味统一选 Slim。两者渲染性能无实质差距,决策核心是"HTML 亲和力 vs 极简主义"的工作流偏好。
第一眼差异
同一段代码,ERB:
<div class="alert alert-<%= @level %>">
<p><%= @message %></p>
</div>
Slim:
div class="alert alert-#{@level}"
p = @message
Slim 去掉了 <% %> 包裹、尖括号和闭合标签:标签直接写名字,= 输出表达式,缩进表达嵌套。代码通常更紧凑,但和设计师交付的 HTML 不能互贴,转换成本要算进团队工作流。
HTML 亲和力与动态属性
ERB 的最大优势是"会 HTML 就会 ERB",浏览器调试时看到的结构和模板一一对应。Slim 的回报在写动态属性时体现——属性就是 Ruby 插值或 Hash:
input type="text" disabled=@locked data-controller="mask"
a href=user_path(@user) class=("active" if @user.active?) 查看
长属性列表(Stimulus 控制器、ARIA 属性)在 Slim 里明显清爽。
文本内容、表单与条件渲染
- 文本:Slim 用
|表示多行文本、'保留尾部空格;ERB 直接书写即可。 - 表单:
form_with辅助方法两者通用,Slim 里写法是= form_with model: @user do |f|后缩进字段,逻辑不变。 - 条件与迭代:Slim 用
- if/- @users.each do |user|(减号执行不输出),结构上比 ERB 的<% %>少一层视觉噪音。
JavaScript、CSS 与转义
Slim 内嵌其他语言靠过滤器::javascript、:css、:coffee 块直接写在模板里;ERB 用 <script> 标签加 javascript_tag。转义规则两者一致:默认 HTML 转义,ERB 用 raw/<%==、Slim 用 == 放行可信 HTML。同样的红线:用户输入绝不原样输出。
空白控制与注释
内联元素拼接标点是模板引擎的试金石。Slim 用 < > 控制标签内外空白;ERB 用 <%- -%> 修剪。Slim 的注释分两种:/ 输出 HTML 注释,/# 是模板内注释(不进最终页面,适合留内部备注);ERB 只有 <%# %>。
性能与工具链
两者都编译成 Ruby 执行,Slim 模板编译稍复杂但运行时差距可忽略;视图性能的决定因素永远是 partial 数量和 N+1 查询。工具链上 ERB 明显占优:编辑器开箱高亮、erb-lint、所有教程默认用它;Slim 有 slim-lint 和主流编辑器插件,够用但生态密度低一档。相互转换有 html2slim / html2erb 工具,批量迁移可行但要仔细回归。
常见问题(FAQ)
Q:Slim 和 Haml 有什么区别?
理念相同(缩进+极简),Slim 语法更自由(属性写法多样、不强制的 % 前缀),性能略优;Haml 历史更久、语法更严格。新项目二选一时 Slim 更现代。
Q:团队一半是后端一半是前端,选哪个?
选 ERB。前端同事改视图时不用学新语法,与 HTML 原型互转零成本,协作摩擦最小。
Q:Slim 里写业务逻辑的界限在哪?
和 ERB 一样:视图只做展示决策。超过两行的逻辑提炼到 helper 或 ViewComponent——Slim 的极简语法让逻辑混入时更刺眼,某种程度上是好事。
参考文档
本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。