doT是一个非常高性能的JavaScript模板,可以在nodeJs和web中使用。项目在github上开源:github.com/olado/doT,官网内容比较简单,国内也没有详细的使用说明(可能是入门太简单了)。由于官网文档详细说明了如何在node端和web端使用doT,这里不再赘述。重点讲解doT的编译和语法。doT编译的doT渲染模板分为两个阶段,从它的用法也可以看出:vartempFn=doT.template(“
{{=it.foo}}
”);varresultText=tempFn({foo:'你好世界'});这与其他主流模板引擎不同。在编译阶段,可以依赖其他模板文件,缓存模板等操作。也可以传入参数,通过条件判断生成模板内容。在页面加载或服务器启动时,根据一些环境变量或其他条件预编译模板,可以进一步提高模板渲染的效率。doT.template方法的第二个参数是配置项,第三个参数是编译时可以接收的参数。默认情况下,参数存储在模板中的def对象中。具体用法在{{#}}的语法中介绍。doT.template方法的返回值是函数类型:tempFn。tempFn接收的参数是模板渲染时可以传入的数据(和之前的编译数据不是同一个数据)。默认情况下,数据存储在模板中的it对象下。具体用法将在{{}}和{{=}}等语法中介绍。以下默认语法示例使用web客户端作为运行环境,示例中调用的全局变量示例均为Bom下window对象的内容。如果是nodejs,对应的全局变量不一样,但是道理是一样的。提供一个比较简单的doT模板在线编辑网站:kakanjau.github.io/dot{{}}{{}}插值代码片段{{}}使用起来非常灵活,js语句可以直接写在里面。在{{=}}中可以直接调用定义的变量。也可以调用通过tempFn传入的数据(数据默认放在it对象中)。//模板字符串:{{vara=1;it.a=a+1;}}{{=a}}//aoutputs1{{=it.a}}//it.aoutputs2也可以定义函数。并在其他{{}}块中调用://templatestring:{{functionfn(){return123}}}{{=fn()}}//fnoutput123也可以直接运行匿名函数{{(function(){it.b=123})();}}{{=it.b}}//it.b随时通过直接执行的匿名函数赋值给123{{}}中的代码块可以中断插入html内容如dom片段://templatestring:{{vara=3;if(a>2){}}a的值大于2{{}else{}}a的值小于2{{}}}另外,{{}}也可以直接调用函数或者全局对象下的变量。通过这个特性,可以实现更复杂的功能(通过专用命名空间提供支持一些过滤器和其他特性的doT模板等)。!如果在tempFn函数的调用中没有传递参数或者传入了一个空对象比如undefined,那么doT就不会实例化it对象。此时在{{}}中赋值的it对象的值在{{=}}中是获取不到的(js值引用问题)。{{=}}{{=}}求值输出表达式{{=}}直接输出html中的内容。它可以是定义在{{}}中的变量,通过函数传入其中的变量,全局变量,甚至是立即执行的函数的返回结果。可以简单理解为单行js语句具体到下一个变量://templatestring:{{it.a=1;a=2;}}{{=it.a}}it.a=1{{=a}}a=2{{=window}}window=[objectWindow]{{=(function(){return123})()}}function(){return123})()=123{{!}}{{!}}编码转义{{!}}将转义内容中的特定字符,例如:{{!location.href}}{{?}}{{?}}conditionals有条件的{{?}}标签必须成对出现,判断条件写在开始标签中,以另一个{{?}}标签结束。这个标签和后面的{{~}}是{{iffor}}的语法糖。如上://模板字符串:{{vara=3;if(a>2){}}a的值大于2{{}else{}}a的值小于2{{}}}可以用这个标签简写为://模板字符串:{{vara=3;}}{{?a>2}}a的值大于2{{??true}}a的值小于2{{?}}{{~}}//模板字符串:{{vararray=[1,2,3,4];}}{{~array:value:index}}value:{{=value}},index:{{=index}}{{~}}{{~}}数组迭代循环{{~}}标签必须成对出现,数组的变量赋值遍历写在开始标签中:{{~it.array:value:index}}并以另一个{{~}}标签结束。{{#}}{{#}}compile-timeevaluation/includesandpartials在编译期间加载代码片段和文件,类似于宏编译。在编译阶段,将相应的变量或文件内容插入到传入的参数中指定位置Defaultsinobjectdef。另外,def对象中{{###}}定义的变量的用法与{{}}基本相同,只是生效的阶段不同。ps:虽然官方文档提到了类似{{#def.loadfile('/snippet.text')}}这样的加载模板的例子。但实际上,这个功能默认是没有集成的。loadfile函数需要自己实现,通过参数传入。所以在使用doT的时候,可以考虑为def提供一些默认的行为方法,它在通过插件等形式进行封装时{{###}}{{###}}compile-time定义编译时变量定义{{###}}有两种赋值方式:using=赋值和using:赋值。两者的区别在于=赋值时,右边是js表达式。可以是函数定义,真值判断,字符串等。赋值时,紧跟在:后面的所有内容都直接赋给变量作为静态模板://templatestring:{{##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位是[