1. 程式人生 > >Mustache

Mustache

Mustache

參考資料:

一、簡介

Web 模板引擎是為了使使用者介面與業務資料(內容)分離而產生的,它可以生成特定格式的文件,通常是標準的 HTML 文件。當然不同的開發語言有不同模板引擎,如 Javascript 下的 Hogan 、ASP 下的 aspTemplate、以及 PHP 下的 Smarty,這裡主要介紹基於 Javascript 語言的模板引擎,目前流行有 Mustache、Hogan、doT.js、JsRender、Kendo UI Templates等,jsperf.com

上可以看到它們的效能對比。

Mustache 是一個輕邏輯的模板語言( Logic-less templates),mustache 是一個js模板,用於展示和js分離,它的優勢在於可以應用在 Javascript、PHP、Python、Perl 等多種程式語言中。原本是基於javascript 實現的模板引擎,類似於 freemark和valicity ,但是比freemark和valicity更加輕量級更加容易使用,經過拓展目前支援javascript,java,.NET,PHP,C++等多種 平臺下開發!

二、使用步驟

1、通過script標籤引入mustache的js檔案

<script type="text/javascript" src="mustache.js"></script>

2、定義模板字串

定義模板字串有三種方式:

  1. js模板可以是一個html檔案

    <h1>Hello {{name}}, it is {{timeNow}}.</h1>

  2. js模板可以是一個值是html程式碼的js變數

    var template = "<p>Hello {{name}}, it is {{timeNow}}.</p>";

  3. js模板可以是一個script片段

    <script id="tpl-greeting" type="text/html">
        <dl>
            <dt>Name</dt>
                <dd>{{name}}</dd>
            <dt>Time</dt>
                <dd>{{timeNow}}</dd>
        </dl>
    

    然後在編譯模板之前,通過獲取 tpl-greeting 的 innerHTML 定義原始模板串:

    var template = document.getElementById('tpl-greeting').innerHTML.trim();

3、預編譯模板

使用 parse 函式進行預編譯模板,即

Mustache.parse(template);

要注意,經過預編譯後的 template 已經不是原來的模板字串了,連線資料型別都變成了陣列型別。

4、 渲染模板

使用 render 函式進行渲染,即

var rendered = Mustache.render(template, obj)

  • template——為模板物件
  • obj——為json資料,是資料來源物件,作為模板上下文。mustache 會把模板中屬性標籤替換成與 obj 物件屬性名相同的屬性值。

5、替換 DOM 內容

將渲染後的資料掛載到DOM樹上。

//模板
var template = "<p>Hello {{name}}, it is {{{ignore name}}}.it is {{&name}}</p>";
//資料
var date = new Date();
var view = {name: "<b>Jonny</b>",timeNow: date.getHours() + ':' + date.getMinutes() };

使用模板檔案要用該方法填充資料生成展示程式碼

$.get('模板檔案', function(templates) {
    var template = $(templates).html();
    $Mustache.render(template, view);
});

三、Mustache 語法

Mustache 的模板語法很簡單,就那麼幾個,用於HTML,配置檔案,原始碼等。它的工作方式是通過通過以雜湊值或者物件的方式擴充套件模板標籤。

  • {{keyName}}
  • {{#keyName}} {{/keyName}}
  • {{^keyName}} {{/keyName}}
  • {{.}}
  • {{<partials}}
  • {{{keyName}}}
  • {{!comments}}
...
<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>
  1. {{keyName}}

    {{}}就是 Mustache 的標示符,花括號裡的 keyName 表示鍵名,這句的作用是直接輸出與鍵名匹配的鍵值,例如:

    var tpl = '{{company}}';
    var html = Mustache.render(tpl, data);
    //輸出:
    Apple
    
  2. {{#keyName}} {{/keyName}}

    #開始、以/結束表示區塊,它會根據當前上下文中的鍵值來對區塊進行一次或多次渲染,例如改寫下 Demo 中的 tpl:

    var tpl = '{{#address}} <p>{{street}},{{city}},{{state}}</p> {{/address}}';
    var html = Mustache.render(tpl, data);
    
    //輸出:
    <p>1 Infinite Loop Cupertino&lt;/br&gt;,California,CA</p>
    

    注意:如果{{#keyName}} {{/keyName}}中的 keyName 值為 null, undefined, false;則不渲染輸出任何內容。

    函式作為模板的變數,該函式會在當前列表的每一個元素的上下文迭代執行。

    var template = "{{#beatles}}* {{name}}<br/>{{/beatles}}";
    var view = {
    "beatles": [
        { "firstName": "John", "lastName": "Lennon" },
        { "firstName": "Paul", "lastName": "McCartney" },
        { "firstName": "George", "lastName": "Harrison" },
        { "firstName": "Ringo", "lastName": "Starr" }],
    "name": function () {
        return this.firstName + " " + this.lastName;}
    };
    

    如果keyName的值為函式,注意該函式在執行時的兩個引數,第一個為該節點變數的直接值,第二個為函式,其執行的上下文對應檢視物件

    var template = "{{#bold}}Hi {{name}} {{lastName}}.{{/bold}}";
    var view = {"name": "John","lastName": "Lennon","bold": function () {
        return function (text, render) {return "<b>" + render(text) + "</b>";}
    }}
    
  3. {{^keyName}} {{/keyName}}

    該語法與{{#keyName}} {{/keyName}}類似,不同在於它是當 keyName 值為 null, undefined, false 時才渲染輸出該區塊內容。

    var tpl = {{^nothing}}沒找到 nothing 鍵名就會渲染這段{{/nothing}};
    var html = Mustache.render(tpl, data);
    
    //輸出:
    沒找到 nothing 鍵名就會渲染這段
    
  4. {{.}}

    {{.}}表示列舉,可以迴圈輸出整個陣列,例如:
    ```
    var tpl = ‘{{#product}}

    {{.}}

    {{/product}}’;
    var html = Mustache.render(tpl, data);
     //輸出:
     <p>Macbook iPhone iPod iPad</p>
     ```
    
  5. {{>partials}}

    >開始表示子模組,如{{> address}};當結構比較複雜時,我們可以使用該語法將複雜的結構拆分成幾個小的子模組,例如:

    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&lt;/br&gt;</li><li>California</li><li>CA</li><li>95014</li></ul>  
    
  6. {{{keyName}}}

    {{keyName}}輸出會將特殊字元轉譯,如果想保持內容原樣輸出可以使用{{{}}},或者在模板標記的初始加入 & 符號。例如:

    var tpl = '{{#address}} <p>{{{street}}}</p> {{/address}}'
    
    //輸出:
    <p>1 Infinite Loop Cupertino</br></p>
    
  7. {{!comments}}

    !表示註釋,註釋後不會渲染輸出任何內容。

    {{!這裡是註釋}}
    //輸出:
    

四、Mustache.java和Mustache.js開發

  1. java開發參見https://github.com/spullara/mustache.java

  2. js開發參見https://github.com/janl/mustache.js