mustache是一个新兴的模板引擎,官网在github上 http://mustache.github.io/,支持数十种编程语言,换句话说mustache其实就是一个模板语法规范,开发者可以根据自己的需要选择不同的编程语言来实现

mustache的特点就是很语法很简单,主要语法如下

  • {{ name }} 打印变量,默认是escape过的,如果不要escape,用3个分隔符 {{{ name }}},或者用 {{ &name }},这个和分隔符无关
  • {{#person}}…{{/person}} 区块,4种方式
    • person是真假值,决定是否输出
    • person 是list of array,会循环展开 for x in person:section.render('xxx)
    • person 是匿名函数/object, 区块包裹的html 会作为参数传递进去
    • person 是dict,直接打印 dict[key]
  • {{^person}}…{{/person},反向区块
  • {{!name }} 注释
  • {{> box }} 载入子模块

相关文档

mustache对模板语法的简化,就在于{{#person}}…{{/person}} 这个设定,它实际上集合了5种规则(if,ifnull,array of dict,dict,function),看起来很爽,其实给实现挖了个大坑

mustache php 版本的两个大坑

mustache php代码在 https://github.com/bobthecow/mustache.php

  • 在php模板当中,html/php混合的方式效率最高,所以一般的php模板引擎,比如说smarty最终就是把模板展开为嵌入php代码的html,mustache则是反过来做,render的结果是 在php代码里面包含html。每个模板文件最终都变成一个 php class,里面充斥了大量的 函数调用和 用"." 拼接的字符串,随便一个模板,渲染之后会调用 Mustache_Context::findVariableInStack 5000 - 6000次,不慢才怪。当然这种渲染方式是很容易被重写的,解决起来并不难,但下面一个问题那是无解了

  • mustache的5合一语法,只能在渲染过程当中 根据数据类型选择不同的逻辑,依赖于实时运算和RTTI(Run-Time Type Identification),这一点会导致2万-3万次类型检查(isarray,isfunction,is_object...),进一步讲,也要求编程语言有足够的RTTI支持,所以mustache的C语言版本就是半成品 。这个坑是添不掉的,要解决只能放弃5合1语法,但那就没有任何亮点了

mustache的C语言版本在 https://github.com/mrtazz/plustache,因为缺乏RTTI,它只支持 map<string,string>vector<map<string,string>>,两种数据类型,这还不如用sprintf呢

mustache所有实现都存在这个问题,它的javascript实现因为是在客户端执行,消耗用户cpu的地方多着呢,不差这一点,可以考虑用用

本文地址: http://lutaf.com/186.htm 鲁塔弗原创文章,欢迎转载,请附带原文链接