Mustache 是一个轻逻辑的模板语言(Logic-less templates),mustache 是一个 js 模板,用于展示和 js 分离,它的优势在于可以应用在 Javascript、PHP、Python、Perl 等多种编程语言中。原本是基于 javascript 实现的模板引擎,类似于 freemark 和 valicity,但是比 freemark 和 valicity 更加轻量级更加容易使用,经过拓展目前支持 javascript,java,.NET,PHP,C++ 等多种平台下开发。
Mustache 的模板语法很简单,就那么几个:
{{data}}
{{#data}} {{/data}}
{{^data}} {{/data}}
{{.}}
{{<partials}}
{{{data}}}
{{!comments}}
{{}} 就是 Mustache 的标示符,花括号里的 data 表示键名,这句的作用是直接输出与键名匹配的键值,例如:
<script type="text/javascript" src="libs/mustache/mustache.js"></script> <script type="text/javascript"> var data = { "name": "Bill" }; var html = Mustache.render("<p> {{name}}</p>", data); console.debug(html); // 输出 // <p> Bill</p> </script>
上例,Mustache将使用name的实际值“Bill”去替换 “{{name}}”。
以#开始、以/结束表示区块,它会根据当前上下文中的键值来对区块进行一次或多次渲染,例如:
<script type="text/javascript" src="libs/mustache/mustache.js"></script> <script type="text/javascript"> var data = { name: 'Bill', address: { state: '四川', city: '成都', area: '高新' } } // 直接使用.的方式取值 var template = '<p> {{address.state}}省、{{address.city}}市、{{address.area}}区</p>'; var html = Mustache.render(template, data); console.debug(html); // <p> 四川省、成都市、高新区</p> // 使用 Mustache 进行处理(类似 with(address){...}) template = '{{#address}}<p> {{state}}省、{{city}}市、{{area}}区</p>{{/address}}'; html = Mustache.render(template, data); console.debug(html); // <p> 四川省、成都市、高新区</p> </script>
注意:如果{{#data}} {{/data}}中的 data 值为 null, undefined, false;则不渲染输出任何内容。
该语法与 {{#data}} {{/data}} 类似,不同在于它是当 data值为 null, undefined, false 时才渲染输出该区块内容。例如:
<script type="text/javascript" src="libs/mustache/mustache.js"></script> <script type="text/javascript"> var data = { name: 'Bill' } var template = '{{^address}} <p> {{state}}省、{{city}}市、{{area}}区</p> {{/address}}'; var html = Mustache.render(template, data); console.debug(html); // <p> 四川省、成都市、高新区</p> </script>
{{.}} 表示枚举,可以循环输出整个数组。例如:
<script type="text/javascript" src="libs/mustache/mustache.js"></script> <script type="text/javascript"> var data = { names: ['Bill', 'Tom', 'Alan'] } var template = '<ul>{{#names}}<li>{{.}}</li>{{/names}}</ul>'; var html = Mustache.render(template, data); console.debug(html); // 输出: // <ul><li>Bill</li><li>Tom</li><li>Alan</li></ul> </script>
以>开始表示子模块,如:{{> msg}};当结构比较复杂时,我们可以使用该语法将复杂的结构拆分成几个小的子模块,例如:
<script type="text/javascript" src="libs/mustache/mustache.js"></script> <script type="text/javascript"> var partials = { // 定义一个子模板 msg: '{{#msg}}<li>{{sex}}</li><li>{{age}}</li><li>{{hobit}}</li>{{/msg}}' }; var template = '<h1>{{name}}</h1> <ul>{{>msg}}</ul>'; var html = Mustache.render(template, { name: "Bill", msg: { sex: '男', age: '21', hobit: '抽烟' } }, partials); console.debug(html) </script> 输出: <h1>Bill</h1> <ul> <li>男</li> <li>21</li> <li>抽烟</li> </ul>
其中,ul的内容是从另一个子模板中导入的,即msg子模板。
{{data}} 输出会将等特殊字符转译,如果想保持内容原样输出可以使用{{{}}},例如:
<script type="text/javascript" src="libs/mustache/mustache.js"></script> <script type="text/javascript"> var html = Mustache.render('<h1>|{{{name}}}|</h1>', { name: '<Bill>' }); console.debug(html) // <h1>|<Bill>|</h1> html = Mustache.render('<h1>|{{name}}|</h1>', { name: '<Bill>' }); console.debug(html) // <h1>|<Bill>|</h1> </script>
如果使用{{}}则将会对name的<和>进行转义。
!表示注释,注释后不会渲染输出任何内容。例如:
<script type="text/javascript" src="libs/mustache/mustache.js"></script> <script type="text/javascript"> var html = Mustache.render('<h1>{{name}}</h1>{{!这是一行注释}}', { name: 'Bill' }); console.debug(html) // <h1>Bill</h1> </script>
参考资料: