Middleman SSR中动态标题标签预渲染失效怎么办?

上官子萱 阅读 28

在用Middleman做SSR时,布局文件里设置了动态标题标签,但生成的静态页标题都是预渲染的默认值,改不动:


<head>
  <title><%= yield(:title) || '默认标题' %></title>
</head>

我在页面里用了content_for :title do设置新标题,但生成的HTML始终显示默认值。本地预览和构建后的结果都不对,是什么地方漏了吗?

我来解答 赞 3 收藏
二维码
手机扫码查看
2 条解答
设计师艳丽
你这个是Middleman构建时预渲染顺序的问题。content_for在SSR生成静态页的时候,如果block执行时机不对,yield就拿不到值,自然一直显示默认标题。

关键点在于模板渲染的生命周期——你得确保content_for在布局文件渲染前就被执行了。你现在的写法理论上没错,但很可能页面里用了template引擎(比如slim或erb)的时候嵌套层级搞反了。

改法很简单:检查你的页面是不是在写content_for的时候包在了别的block或者helper里面。正确写法应该是直接在模板顶层写:

<% content_for :title do %>
新标题
<% end %>

页面内容




不要套在别的<% %>块里,不然Middleman解析模板时会延迟执行,等layout跑yield的时候还没注册上。

另外确认下layout文件是不是用了正确的erb语法,别混了haml之类的。CSS的话,这块不影响,纯是模板变量传递问题。

如果还是不行,临时方案可以用全局变量替代,比如在页面顶部写:

<% @page_title = "新标题" %>

然后layout里改成:

<title><%= @page_title || '默认标题' %></title>

也能绕过content_for的生命周期坑。不过建议优先排查content_for的调用位置,这才是正解。
点赞 4
2026-02-09 12:05
IT人统泽
你用的是Middleman的SSR模式,但content_for在静态生成时不会生效。Middleman的预渲染流程不会执行JavaScript,所以动态标题会被忽略。需要用page.title在数据文件或页面头信息里定义标题,然后在布局里用#{page.title}直接输出。

改成这样:

<head>
<title><%= page.title || '默认标题' %></title>
</head>


页面里:

title: 新标题
点赞 8
2026-02-05 17:10