Can Mustache Templates do template extension?

I recently found myself in the same boat, except I came from a mako background.

Mustache does not allow for template extension/inheritance but there are a few options available to you that I know of.

  1. You could use partials:

    {{>header}}
        Hello {{name}}
    {{>footer}}
    
  2. You could inject template pre-processing functions into the context for each template that needs to inherit from some other page:

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

    Hash:

    {
       "name": "Walden",
       "extendBase": function() {
           return function(text) {
               return "<html><head></head>" + render(text) + "</body></html>"
           }
       }
    }
    
  3. Prepend and append the desired HTML to the relevant pages in your controller.

  4. Have a layout template ala:

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

    And render the body in your controller, passing that to the layout template as a variable named body.

  5. Implement template inheritance, pre-mustache, in your code that loads templates.

I wouldn’t, however, use the triple mustache because I don’t want unescaped HTML to be appearing anywhere, it’s just too risky in my opinion.

If someone else has a better solution to this problem I’d love to hear it as well, since I haven’t yet taken the plunge in any one of these directions.

Leave a Comment