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