doT是一个性能很是高的JavaScript模板,能够用于nodeJs和web端。 该项目在github上开源:github.com/olado/doT,官网内容相对简单,国内也没有太过详细的使用说明(多是由于上手确实太简单了)。javascript
因为官网文档对于如何在node端和web端使用doT说明的比较详细,这里就再也不赘述。重点说明一下doT的编译和语法。html
doT渲染模板分为2个阶段,这一点从它的使用方法中也能看出来:java
var tempFn = doT.template(“<div>{{= it.foo}}</div>”); var resultText = tempFn({foo: ‘hello world'});
这一点是与其余主流的模板引擎不一样的。
在compile阶段,能够依赖其余模板文件,缓存模板等操做。还能够传入参数,经过条件判断生成模板内容。
在页面载入或是服务器启动时,根据一些环境变量或其余条件预先编译模板,能够进一步提升模板渲染是的效率。node
doT.template
方法的第2个参数为配置项,第3个参数为编译时可接收的参数,参数在模板中被默认存储在def
对象下,具体用法在{{#}}
语法中介绍。git
doT.template
方法返回值为function
类型:tempFn
,tempFn
接收的参数是模板渲染时可传入的数据(与前面编译时的数据不是同一份数据)。该数据在模板中被默认存储在it
对象下具体用法在{{}}
和{{=}}
等语法中都会介绍。github
下面的例子以web客户端为运行环境,例子中调用的全局变量的例子都是Bom下的window对象内容。若是是nodejs,则对应的全局变量有差别,但道理是同样的。web
提供一个比较简单的doT模板在线编辑网站:kakanjau.github.io/dot数组
{{ }} interpolation 代码片断
{{ }} 的用法很是灵活,里面能够直接写js语句。定义的变量能够直接在{{= }}
中调用。也能够调用经过tempFn
传入的数据(数据默认放在it对象内)。缓存
// 模板字符串: {{ var a = 1; it.a = a + 1; }} {{= a}} // a 输出 1 {{= it.a}} // it.a 输出 2
也能够定义函数。并在其余的{{}}
区块内调用:服务器
// 模板字符串: {{ function fn() { return 123 } }} {{= fn()}} // fn 输出 123 也能够直接运行匿名函数 {{ (function() { it.b = 123 })(); }} {{= it.b}} // it.b经过直接执行的匿名函数赋值为123
{{}}
中的代码块随时能够被打断,插入dom片断等html内容:
// 模板字符串: {{ var a = 3; if(a > 2) { }} a的值大于2 {{ } else { }} a的值小于2 {{ } }}
此外,{{}}
中也能够直接调用全局对象下的函数或变量。能够以此特色实现比较复杂的功能(经过专用的命名空间给doT模板提供一些过滤器等特点的支持等)。
! 若是在
tempFn
函数的调用中不传参数或者传入的是undefined
等空对象,则doT不会实例化it
对象。此时在{{}}
中赋值的it对象的值,{{=}}
中没法拿到(js的值引用问题)。
{{= }} evaluation 输出表达式 {{= }}
将其中的内容直接输出到html中。其中能够是在{{ }}
中定义的变量、经过函数传入在it
中的变量、也能够是全局变量、甚至能够是一个当即执行的function的返回结果。
能够简单的理解为能够获取特定做用于下变量的单行js语句:
// 模板字符串: {{ it.a = 1; a = 2; }} {{= it.a}} it.a = 1 {{= a}} a = 2 {{= window}} window = [object Window] {{= (function(){return 123})()}} function(){return 123})() = 123
{{! }} encode 转义
{{! }} 会将其中的内容中特定字符进行转义,如:{{! location.href}}
{{? }} conditionals 条件
{{?}}标签必须成对出现,起始标签中写入判断条件,并以另一个{{?}}
标签为结束。该标签和下面的{{~}}
是{{if for}}
的语法糖。
如上面的:
// 模板字符串: {{ var a = 3; if(a > 2) { }} a的值大于2 {{ } else { }} a的值小于2 {{ } }}
能够用本标签简写为:
// 模板字符串: {{ var a = 3; }} {{? a>2}} a的值大于2 {{?? true}} a的值小于2 {{?}}
// 模板字符串: {{ var array = [1,2,3,4]; }} {{~ array:value:index}} value:{{=value}}, index:{{=index}} {{~}}
{{~}} array iteration 循环
{{~}}标签必须成对出现,起始标签中写入对数组遍历的变量赋值:{{~it.array :value:index}}
,并以另一个{{~}}
标签为结束。
{{#}} compile-time evalution/includes and partials 编译时载入代码片断、文件
相似于宏编译,在compile阶段,将对应的变量或文件内容插入指定的位置
传入的参数默认在对象def
中。此外,经过{{## #}}
定义的变量,也都是在def
对象中的
用法与{{}}
基本一致,只是生效的阶段不一样。
ps: 虽然官方文档中提到了
{{#def.loadfile(‘/snippet.text')}}
这样载入模板的例子。但其实这一功能并非默认集成的。loadfile函数须要本身去实现,并经过参数传入。
因此在使用doT时,能够考虑经过插件等形式封装的时候,给def、it提供一些默认的行为方法
{{## #}} compile-time defines 编译时变量定义
{{## #}}有两种赋值方式:使用=
赋值和使用:
赋值。两者的区别是,=
赋值时,右侧是一个js的表达式。能够是函数定义、真值判断、字符串等等,:
赋值时,紧跟:
以后的全部内容,都被当作静态模板直接赋值给变量:
// 模板字符串: {{## def.array = [1,2,3,4] #}} {{#def.array[0]}} 的值是 1 {{## def.array2:[1,2,3,4] #}} {{#def.array2[0]}} 的值是 [ // array2是字符串的:”[1,2,3,4]”,因此第0位是 [