模板引擎分为前端和后端的,前端常用的模板引擎如artTemplate,juicer渲染是在客户端完成的;后端的模板引擎如基于PHP的smarty,渲染是服务器完成的。
前两天看到一篇博客挺好的是用了不到20行代码实现一个前端的模板引擎,感觉挺有趣的,今天就来实现下
1.简单的例子
逻辑
1 | var tplEngine = function(tpl, data) { |
就是把<%name%>
替换成data.name
即可
测试1
2
3
4
5var template1 = '<p>Hello, my name is <%name%>. I\'m <%age%> years old.</p>';
console.log(tplEngine(template1, {
name: "Tom",
age: 29
}));
2. data属性复杂点
1 | var tplEngine = function(tpl, data) { |
我们研究下new Function
构造函数1
new Function ([arg1[, arg2[, ...argN]],] functionBody)
argN是传入的参数,当然可以省略
函数体是code.replace(/[\r\t\n]/g,'')
,apply将函数体的上下文环境(this)指向了data
测试
1 | var template2 = '<p>Hello, my name is <%name%>. I\'m <%profile.age%> years old.</p>'; |
3.加入for if循环和判断语句
按照上面的测试
1 | var template3 = |
报错:1
Uncaught SyntaxError: Unexpected token for
打印结果r.push(for(var index in this.skills) {);
是有问题的。1
2
3
4
5
6
7
8
9var r=[];
r.push("My skills:");
r.push(for(var index in this.skills) {);
r.push("<a href=\"#\">");
r.push(this.skills[index]);
r.push("</a>");
r.push(this.});
r.push("");
return r.join("");
修改
1 | var tplEngine = function(tpl, data) { |
我们可以打印code
看看1
code+='console.log(r);\n';
1 | ["My skills:", "<a href="#">", "js", "</a>", "<a href="#">", "html", "</a>", "<a href="#">", "css", "</a>", ""] |
最终的结果1
2
3
4
5
6
7
8
9
10var r=[];
r.push("My skills:");
for(var index in this.skills) {
r.push("<a href=\"#\">");
r.push(this.skills[index]);
r.push("</a>");
}
r.push("");
console.log(r);
return r.join("");
解析结果1
My skills:<a href="#">js</a><a href="#">html</a><a href="#">css</a>
参考阅读: