Javascript模版引擎mustache.js簡介
背景
最近使用ELK的sentinl進行告警配置,sentinl的郵件通知支援mustache,藉此機會學習了mustache相關知識,記錄在此。
mustache的思想
mustache的核心是標籤和logic-less.
標籤: 定義模板的時候,使用了{{name}}、{{#systems}}{{/systems}}標記. 這就是mustache的標籤,只不過用{{}}替代了<>,以免和html標籤的<>混淆.
Logic-less:輕邏輯,因為在定義模板的時候不會使用if-else,不會有迴圈式編碼,一切都用標籤來解決.
標籤包含:
- {{prop}}: 將資料來源物件上prop屬性對應的值,轉換成字串輸出.
- {{{prop}}} ——不進行特殊字元轉義,保持內容原樣輸出
- {{#prod}}{{/prop}}
- {{^prop}}{{/prop}}
- {{.}} ——表示列舉,可以迴圈輸出整個陣列
- {{>partials}} ——以>開始表示子模組
- {{!comments}} ——註釋
{{prop}}標籤
mustache渲染{{prop}}標籤的邏輯:
1)如果prop引用的值上null或者undefined,則渲染成空串;
2)如果prop引用的是一個函式,則在渲染的時候自動執行這個函式,並把函式返回值作為渲染結果.
3)其他場景,直接把prop引用的值轉換成字串作為渲染結果.
預設情況下,mustache在渲染prop時,都是對prop的原始值進行url編碼或者html編碼之後再輸出,所以會把"\"轉成html實體符.
console.log(Mustache.render(tpl1, {
prop: function () {
return 'it\'s a fun'
}
}));//-it's a fun-
如果要阻止這種編碼行為,只要把標籤改成{{{prop}}}就可以.
{{#prop}}{{/prop}}標籤
這對標籤作用非常大,可以同時完成if-else和for-each以及動態渲染的模版功能. 在這對標籤之間,可以定義其他模板內容,巢狀所有標籤.
1)if-else渲染
只有prop屬性在資料來源物件上存在,並且不為falsy值(javascript6個falsy值:null, undefined, NaN, 0, false, 空字串), 並且不為空陣列的情況下, 標籤之間的內容才會被渲染,否則都不會被渲染.
prop屬性引用的是一個函式的時候,{{#prop}}會自動呼叫這個函式,並把函式的返回值作為if-else渲染邏輯的判斷依據,也就是如果函式返回的是falsy值或者是空陣列的時候,這對標籤之間的內容還是不會顯示.
2)for-each渲染
當prop屬性引用的是一個非空陣列時,這對標籤之間的內容將會根據資料大小進行迭代,並且當陣列元素為物件時,還會把該物件作為每一次迭代的上下文,以便迭代時的標籤可以直接引用陣列元素上的屬性.
3)動態渲染
當prop屬性所引用的是一個函式, 並且這個函式的返回值還是一個函式的話, mustache會再次呼叫這個返回的函式,並給它傳遞2個引數:text表示原來的目標內容,render表示mustache內部的執行渲染的物件, 以便在這個函式內容可以通過render物件結合原來的模版內容,自定義渲染的邏輯,並且把函式的返回值作為渲染結果(這個返回值渲染的邏輯根{{prop}}標籤完全一樣).
{{^prop}}{{/prop}}標籤
這對標籤,與{{#prop}}{{/prop}}的if-else渲染執行相反邏輯,即只有在prop屬性不存在或者引用的是一個falsy值,或者是空陣列才會顯示標籤之間的內容.