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

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

相关文章
相关标签/搜索