Web 模板引擎是為了使用戶界面與業(yè)務(wù)數(shù)據(jù)(內(nèi)容)分離而產(chǎn)生的,它可以生成特定格式的文檔胞此,通常是標(biāo)準(zhǔn)的 HTML 文檔睡蟋。當(dāng)然不同的開發(fā)語言有不同模板引擎,如 Javascript 下的 Hogan 控硼、ASP 下的 aspTemplate泽论、以及 PHP 下的 Smarty,這里主要介紹基于 Javascript 語言的模板引擎象颖,目前流行有 Mustache佩厚、Hogan、doT.js说订、JsRender抄瓦、Kendo UI Templates等潮瓶,jsperf.com 上可以看到它們的性能對比,首先先介紹下 Mustache钙姊。
一毯辅、Mustache 簡介:
Mustache 是一個 logic-less (輕邏輯)模板解析引擎,它的優(yōu)勢在于可以應(yīng)用在 Javascript煞额、PHP思恐、Python、Perl 等多種編程語言中膊毁。
二胀莹、Mustache 語法:
Mustache 的模板語法很簡單,就那么幾個:
{{keyName}}
{{#keyName}} {{/keyName}}
{{^keyName}} {{/keyName}}
{{.}}
{{<partials}}
{{{keyName}}}
{{!comments}}
這里將以 javascript 應(yīng)用為例進行介紹婚温,先來看個 Demo:
......
<script type="text/javascript" src="mustache.js"></script>
<script type="text/javascript">
var data = {
"company": "Apple",
"address": {
"street": "1 Infinite Loop Cupertino</br>",
"city": "California ",
"state": "CA ",
"zip": "95014 "
},
"product": ["Macbook ","iPhone ","iPod ","iPad "]
}
var tpl = '<h1>Hello {{company}}</h1>';
var html = Mustache.render(tpl, data);
console.log( html )
</script>
...
//運行后 Console 輸出:
<h1>Hello Apple</h1>
在 Demo 中可以看到 data 是數(shù)據(jù)描焰,tpl 是定義的模板,Mustache.render(tpl, data)
方法是用于渲染輸出最終的 HTML 代碼栅螟。
借助 Demo 來對語法做簡單的介紹:
{{keyName}}
{{}}
就是 Mustache 的標(biāo)示符荆秦,花括號里的 keyName 表示鍵名,這句的作用是直接輸出與鍵名匹配的鍵值力图,例如:
var tpl = '{{company}}';var html = Mustache.render(tpl, data);
//輸出:Apple
{{#keyName}} {{/keyName}}
以#
開始步绸、以/
結(jié)束表示區(qū)塊,它會根據(jù)當(dāng)前上下文中的鍵值來對區(qū)塊進行一次或多次渲染吃媒,例如改寫下 Demo 中的 tpl:
var tpl = '{{#address}} <p>{{street}},{{city}},{{state}}</p> {{/address}}';var html = Mustache.render(tpl, data);
//輸出:<p>1 Infinite Loop Cupertino</br>,California,CA</p>
注意:如果{{#keyName}} {{/keyName}}
中的 keyName 值為 null, undefined, false瓤介;則不渲染輸出任何內(nèi)容。
{{^keyName}} {{/keyName}}
該語法與{{#keyName}} {{/keyName}}
類似晓折,不同在于它是當(dāng) keyName 值為 null, undefined, false 時才渲染輸出該區(qū)塊內(nèi)容惑朦。
var tpl = {{^nothing}}沒找到 nothing 鍵名就會渲染這段{{/nothing}};var html = Mustache.render(tpl, data);//輸出:沒找到 nothing 鍵名就會渲染這段
{{.}}
{{.}}
表示枚舉,可以循環(huán)輸出整個數(shù)組漓概,例如:
var tpl = '{{#product}} <p>{{.}}</p> {{/product}}';var html = Mustache.render(tpl, data);//輸出:<p>Macbook </p> <p>iPhone </p> <p>iPod </p> <p>iPad </p>
{{>partials}}
以>
開始表示子模塊漾月,如{{> address}};當(dāng)結(jié)構(gòu)比較復(fù)雜時胃珍,我們可以使用該語法將復(fù)雜的結(jié)構(gòu)拆分成幾個小的子模塊梁肿,例如:
var tpl = "<h1>{{company}}</h1> <ul>{{>address}}</ul>"var partials = {address: "{{#address}}<li>{{street}}</li><li>{{city}}</li><li>{{state}}</li><li>{{zip}}</li>{{/address}}"}var html = Mustache.render(tpl, data, partials);//輸出:<h1>Apple</h1><ul><li>1 Infinite Loop Cupertino</br></li><li>California</li><li>CA</li><li>95014</li></ul>
{{{keyName}}}
{{keyName}}
輸出會將等特殊字符轉(zhuǎn)譯,如果想保持內(nèi)容原樣輸出可以使用{{{}}}
觅彰,例如:
var tpl = '{{#address}} <p>{{{street}}}</p> {{/address}}'//輸出:<p>1 Infinite Loop Cupertino</br></p>
{{!comments}}
!
表示注釋吩蔑,注釋后不會渲染輸出任何內(nèi)容。
{{!這里是注釋}}//輸出:
參考文章:
http://coenraets.org/blog/2011/12/tutorial-html-templates-with-mustache-js/http://mustache.github.com/mustache.5.htmlhttp://ued.xinyou.com/2012/07/mustache_5_document.html