您的位置:

深入了解dot.js模板引擎

一、介绍

dot.js是一个简约而强大的JavaScript模板引擎。它采用了逻辑分离和动态输出的方法,拥有体积小,速度快,兼容性好等优点,可以胜任大部分前端模板渲染需求。在该模板引擎的创作者,美国人 West Suitor强调,他的初衷是让编程变得更简单。这一点在dot.js的语法看上去十分清爽的同时也体现了出来。

二、安装和基础使用

安装和基础使用都非常简单,我们可以通过npm快速安装:


npm install doT --save

然后就可以在JavaScript中使用了:


// 引入dot模块
const doT = require('dot');

// 创建模板
const template = doT.template("Hello {{=it.name}}!");

// 渲染模板
console.log(template({ name: 'world' })); // 输出 Hello world!

我们可以看到doT.template()方法传入的是一个字符串模板,在渲染时,{{=it.name}}代表模板变量,后面的代码则是需要渲染的数据。 另外,极其重要的一点是,模板引擎默认是不支持转义HTML的,所以需要使用{{! }}代替{{ }}。

三、语法

在doT的语法上,不同于其他模板语言(如Jinja2),它采用了比较自然的JavaScript语法。

1. 循环语句

在doT中,我们可以通过for循环语句来循环一个数组或对象。例如:


{{~it.people :value:index}}
  {{=index}}. {{=value.name}} - {{=value.age}} 
{{~}}

在这个例子中,我们可以看到通过{{~it.people}}来循环一组数据,在循环内部,可以使用{{= }}来输出变量值。注意,这里的冒号(:)和tilda(~)是中间没有空格的。

2. 分支语句

我们可以通过简单的if语句来实现模板分支。例如:


{{? it.gift }}
  I have a present for you!
{{??}}
  Sorry, no gift this year.
{{?}}

在这个例子中,我们看到了一般if格式。

3. 子模板

我们可以通过{{#def.load()}}来实现子模板的功能。例如:


{{#def.body()}}
Hello {{=it.name}}!
{{#def.body()}}

在这个例子中,我们看到了如何向子模板传递参数、调用子模板及如何定义加载子模板的主模板函数。

四、编译选项

从3.0.0版本开始,doT支持了更多的编译选项,包括以下内容:

  • evaluate: 最初和最后的代码应该是plain文本还是编译代码。
  • interpolate: 输出的是否需要检查HTML转义。
  • encode: 替换HTML实体中需要处理的字符。
  • use: 用于在jsp、aspx等自定义标签模板格式中。
  • define: 定义一个模板function()。使用它可以在多次请求中重复使用它。
  • string: 对于浏览器和可能需要支持IE低级浏览器的旧版本(即IE6/7/8),需要转义正斜杠。因为正斜杠在JavaScript和正则表达式中都有特殊任务,所以很容易出现语法问题。这个选项在渲染时应该启用。
  • strip: 删除模板中不需要的换行符及空格,以减少模板的大小。

这里,我们以使用strip编译选项为例,来实现缩减模板空格和换行符:


// 创建模板(使用strip编译选项)
const template = doT.template(
  '
   
\n' + '{{~it.people :value:index}}\n' + '

{{=index}}. {{=value.name}} - {{=value.age}}

\n' + '{{~}}\n' + '
', { strip: true, }, ); // 渲染模板 console.log(template({ people: [{ name: 'a', age: 1 }, { name: 'b', age: 2 }] }));

我们可以看到,通过使用编译选项strip,可以将原本模板中的多余空格和换行符去除,使其更整齐、简洁,同时也减少了模板的体积。除了strip,上面提到的其他编译选项在具体应用时可根据需求进行调整。

五、总结

doT相信对大部分开发者而言都不会太陌生,其强大的滤镜和以{{= }}为代表的认知让人难以忘记。当然,doT也在逐渐发展,加入了各种编译选项和丰富的集成,在提高性能与维护性等方面均有了新的方法。