适配11ty:寻找支持extends、带参include、slot的HTML模板引擎
符合需求的11ty兼容模板引擎推荐
Liquid(11ty默认支持)
Liquid是11ty内置的核心模板引擎之一,完全匹配你的所有需求:
- 继承模板:通过
{% extends "layout.liquid" %}实现布局继承,用{% block content %}定义占位区块,子模板中填充对应区块内容即可复用布局。 - 带参数引入局部模板:直接在引入时传递参数,写法简洁,比如:
也可以用对象批量传参:{% include "partial.liquid" title="文章标题" list=posts %}{% include "partial.liquid" with { title: "文章标题", list: posts } %}。 - 插槽/区块传内容:除了
block语法,还支持{% render %}标签实现插槽传递,示例:
在{% render "card.liquid" %} {% slot "header" %} <h2>自定义卡片标题</h2> {% endslot %} {% slot "body" %} <p>卡片内容区域</p> {% endslot %} {% endrender %}card.liquid中用{{ slot.header }}和{{ slot.body }}接收并渲染插槽内容。
Handlebars
Handlebars是11ty支持的模板引擎,仅需简单配置即可使用,满足你的全部要求:
- 继承模板:通过frontmatter设置
layout: "layout"绑定布局模板,布局中预留{{{body}}}或自定义区块占位符,子模板内容会自动填充到对应位置;也可手动通过{{> layout }}配合区块传递实现继承。 - 带参数引入局部模板:引入时直接传递参数,比如:
局部模板中通过{{> card title="卡片标题" data=cardData }}{{title}}、{{data}}直接获取参数值。 - 插槽/区块传内容:使用
{{#*inline "slotName"}}定义插槽内容,在局部模板中调用对应插槽,示例:
在{{> card }} {{#*inline "header"}} <h2>自定义标题</h2> {{/inline}} {{#*inline "body"}} <p>自定义内容</p> {{/inline}} {{/card}}card.hbs中通过{{> header}}、{{> body}}渲染插槽内容。
补充:Nunjucks的正确传参与插槽用法
你提到Nunjucks的include无法传递数据,其实它支持直接向include传参,写法简洁:
{% include "partial.njk" title="测试标题" items=listItems %}
也可以用对象批量传递:
{% include "partial.njk" with { title: "测试标题", items: listItems } only %}
至于插槽功能,Nunjucks的macro支持接收内容块,示例:
{% macro card(title) %} <div class="card"> <h3>{{ title }}</h3> {{ caller() }} </div> {% endmacro %}
调用时直接嵌入内容:
{% call card("卡片标题") %} <p>卡片内容</p> {% endcall %}
如果你之前没尝试过这些用法,可以再测试验证。
内容的提问来源于stack exchange,提问作者saksija
相关产品推荐
相关产品推荐

