javascript 模板引擎選擇 doT.js 模板繼承 宏 禪

最近開始遷移之前的jsp項目到nodejs上,因此須要選擇一個js模板引擎,初步有幾點要求:html

  • 要強大,方便快速開發(但願在模板中寫某些渲染邏輯)node

  • 有些語法糖 否則if for的大括號會太多看着很煩git

  • 要直觀,寫模板的時候就能夠想到編譯後的代碼是什麼樣子(能寫原生js)github

  • 學習成本低,能寫原生js(依然是爲了快速開發和控制項目複雜度)jsp

  • browser和nodejs均可以跑學習

  • 能支持模板繼承更好spa

這幾個條件限制下來只剩doT.js.net

如下內容請先試用 http://olado.github.io/doT/ 官網例子code

  • 它比ejs和underscore多出了if for語法糖(算是個小驚喜)htm

  • 生成的代碼很是直觀,簡單

  • 載入其餘模板是使用copy的形式而不是調用後拼接,是使用宏的方式(也就是有編譯編譯期)(很是強大的想法,因此標題中加了「禪」)

何爲編譯編譯期:

我把   <li>{{=it.name}}</li>(模板代碼)變爲:out+='<li>';out+=it.name;out+='</li>' (目標代碼)這個過程叫作 編譯執行期(整個過程:1:處理替換{# }包圍的代碼。2:處理替換{{  }}和普通html)

而在此以前還有個時期,他在作宏的編譯:

何爲宏,他是在生成目標代碼前就已經執行完的代碼(也就是他把目標代碼也當成了文本):

{{##def.macro:value:
    <li>value {{=value}}</li>
#}}
{{#def.macro:it}}

生成:

out+='<li>it ';
out+=it;
out+='</li>;

get it?

更牛逼的來了,他支持遞歸,很是簡單意外的實現了模板的繼承:

base.dot

{{##def.base:
    <html>
        {{#def.body||'<body></body>'}}
    </html>
#}}
{{#def.base}}

page.dot

{{##def.body:
    <body in page>
#}}
{{#def.loadfile('/base.dot')}} {{/*這個方法在doT項目中,只是簡單的return base.dot的內容*/}}

http://git.oschina.net/p2world/dot-js-template

更多的使用方法還在等着挖掘

相關文章
相關標籤/搜索