Mustache模板可以进行模板扩展吗?

62 投票
9 回答
32904 浏览
提问于 2025-04-17 05:10

我刚接触Mustache。

很多模板语言(比如DjangoJinja)允许你像这样扩展一个“父”模板……

base.html

<html><head></head>
    <body>
    {% block content %}{% endblock %}
    </body>
</html>

frontpage.html

{% extends "base.html" %}
{% block content %}<h1>Foobar!</h1>{% endblock %}

渲染后的frontpage.html

<html><head></head>
    <body>
    <h1>Foobar!</h1>
    </body>
</html>

我知道Mustache有个叫partials的功能(比如{{>content}}),但那看起来只是包含的意思。

Mustache有没有模板扩展的功能?如果没有,至少有没有什么设计模式可以把包含变成类似模板扩展的效果。

9 个回答

3

Mustache 这个模板引擎不支持模板扩展。

如果你真的想要模板扩展的功能,那你可能需要找一个专门为你选择的语言或框架设计的库来实现这个功能。


顺便说一下,我在使用 Node.js 和 Express,所以我可能会用到 https://github.com/fat/stache 这个库。

12

我在这里向Mustache的规范提出了这个建议:

https://github.com/mustache/spec/issues/38

现在,mustache.java、hogan.js和phly_mustache都支持模板继承功能。

66

我最近也遇到了类似的问题,不过我之前是用mako的。

Mustache不支持模板的扩展或继承,但我知道有几个解决方案可以尝试。

  1. 你可以使用部分模板(partials):

    {{>header}}
        Hello {{name}}
    {{>footer}}
    
  2. 你可以在每个需要从其他页面继承的模板上下文中注入一些预处理函数:

    {{#extendBase}}      
        Hello {{name}}
    {{/extendBase}} 
    

    哈希:

    {
       "name": "Walden",
       "extendBase": function() {
           return function(text) {
               return "<html><head></head>" + render(text) + "</body></html>"
           }
       }
    }
    
  3. 在你的控制器中,将想要的HTML添加到相关页面的前面和后面。

  4. 可以有一个布局模板,比如:

    {{>header}}
        {{{body}}}
    {{>footer}}
    

    然后在你的控制器中渲染主体部分,并将其作为名为body的变量传递给布局模板。

  5. 在加载模板的代码中实现模板继承,使用的是Mustache之前的方式。

不过,我不建议使用三重大括号,因为我不想让未转义的HTML出现在任何地方,这样太危险了。

如果有人有更好的解决方案,我也很想听听,因为我还没有在这些方向上深入尝试。

撰写回答