最近開始遷移之前的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
更多的使用方法還在等着挖掘