Middleman 4中动态页面结合Frontmatter的实现求助
我太懂你这种卡壳的感觉了——花了大把时间试各种方法,结果动态页面还是共用一套Frontmatter,确实闹心。其实核心问题是静态Frontmatter没法在动态模板里根据页面参数动态变化,得换个思路用YAML数据文件+动态page方法来实现,我给你捋一套可行的步骤:
1. 准备个性化数据的YAML文件
先在项目根目录的data文件夹里新建一个dynamic_pages.yml(名字随便取,只要符合Middleman数据文件规则),把每个动态页面的专属数据存进去,比如:
product_landing: title: "专属产品落地页" description: "这是为XX产品定制的落地页描述" layout: "product_layout" og_image: "/images/product_og.jpg" blog_post_101: title: "新手入门指南" description: "从零开始的Middleman使用教程" layout: "blog_post" og_image: "/images/blog_og.jpg"
每个键(比如product_landing)对应你动态页面的URL标识,后面的属性就是你要的个性化Frontmatter字段。
2. 配置动态页面路由
打开config.rb,添加代码遍历数据文件里的条目,生成对应的动态页面:
# 遍历data/dynamic_pages.yml里的所有页面数据 data.dynamic_pages.each do |page_slug, page_info| # 生成页面路由,第一个参数是最终URL,第二个是模板路径,locals传参数给模板 proxy "/#{page_slug}.html", "/templates/dynamic_page.html.erb", locals: { page_slug: page_slug }, ignore: true end
这里假设你的动态模板放在source/templates/dynamic_page.html.erb,你可以根据自己的目录结构调整。
3. 在动态模板里动态设置Frontmatter
重点来了!不要在模板顶部写静态的--- Frontmatter块,而是用Middleman提供的page方法,在模板里动态注入Frontmatter属性:
<% # 从数据文件里取出当前页面的专属数据 current_page_data = data.dynamic_pages[page_slug] # 动态设置Frontmatter的各个字段 page( title: current_page_data.title, description: current_page_data.description, layout: current_page_data.layout, og_image: current_page_data.og_image ) %> <!-- 下面是你的页面内容 --> <h1><%= current_page_data.title %></h1> <p><%= current_page_data.description %></p>
这样每个生成的页面都会有自己专属的Frontmatter属性,不管是在模板里调用,还是在布局文件里用current_page.data.title这类变量,都能拿到对应的值。
为什么之前的尝试可能失败?
大概率是你试图在模板里写静态的Frontmatter块,然后用ERB插值——但Middleman在编译时会先解析静态Frontmatter,这时候动态参数还没传入,所以插值根本不生效。而用page方法是在模板渲染阶段动态设置属性,完全适配动态页面的场景。
内容的提问来源于stack exchange,提问作者markwyner

