使用javascript原生实现一个模板引擎
2016-10-02 21:50
573 查看
模板引擎分为前端和后端的,前端常用的模板引擎如artTemplate,juicer渲染是在客户端完成的;后端的模板引擎如基于PHP的smarty,渲染是服务器完成的。
前两天看到一篇博客挺好的是用了不到20行代码实现一个前端的模板引擎,感觉挺有趣的,今天就来实现下
就是把
测试
我们研究下
构造函数
argN是传入的参数,当然可以省略
函数体是
测试
报错:
打印结果
修改
我们可以打印
最终的结果
解析结果
参考阅读:
- 只有20行Javascript代码!手把手教你写一个页面模板引擎
前两天看到一篇博客挺好的是用了不到20行代码实现一个前端的模板引擎,感觉挺有趣的,今天就来实现下
1.简单的例子
逻辑var tplEngine = function(tpl, data) { var re = /<%([^%>]+)?%>/g; while (match = re.exec(tpl)) { tpl = tpl.replace(match[0], data[match[1]]); } return tpl; };
就是把
<%name%>替换成
data.name即可
测试
var template1 = '<p>Hello, my name is <%name%>. I\'m <%age%> years old.</p>'; console.log(tplEngine(template1, { name: "Tom", age: 29 }));
2. data属性复杂点
var tplEngine = function(tpl, data) { var re = /<%([^%>]+)?%>/g; var code = 'var r=[];\n', cursor = 0;//辅助变量 var add = function(line, js) {//针对变量还是普通的片段分别处理 js ? code += 'r.push(' + line + ');\n' : code += 'r.push("' + line.replace(/"/g, '\\"') + '");\n'; }; while (match = re.exec(tpl)) { add(tpl.slice(cursor, match.index)); add("this."+match[1],true);//要替换的变量 cursor = match.index + match[0].length; } add(tpl.substr(cursor, tpl.length - cursor)); code += 'return r.join("");'; // <-- return the result console.info(code); return new Function(code.replace(/[\r\t\n]/g,'')).apply(data); };
我们研究下
new Function
构造函数
new Function ([arg1[, arg2[, ...argN]],] functionBody)
argN是传入的参数,当然可以省略
函数体是
code.replace(/[\r\t\n]/g,''),apply将函数体的上下文环境(this)指向了data
测试
var template2 = '<p>Hello, my name is <%name%>. I\'m <%profile.age%> years old.</p>'; console.log(tplEngine(template2, { name: "Kim", profile: { age: 29 } }));
3.加入for if循环和判断语句
按照上面的测试var template3 = 'My skills:' + '<%for(var index in this.skills) {%>' + '<a href="#"><%skills[index]%></a>' + '<%}%>'; console.log(tplEngine(template3, { skills: ["js", "html", "css"] }));
报错:
Uncaught SyntaxError: Unexpected token for
打印结果
r.push(for(var index in this.skills) {);是有问题的。
var 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("");
修改
var tplEngine = function(tpl, data) { var re = /<%([^%>]+)?%>/g, re2 = /(^( )?(if|for|else|switch|case|break|{|}))(.*)?/g; var code = 'var r=[];\n', cursor = 0; var add = function(line, js) { js ? code += line.match(re2) ? line + '\n' : 'r.push(' + line + ');\n' : code += 'r.push("' + line.replace(/"/g, '\\"') + '");\n'; }; while (match = re.exec(tpl)) { add(tpl.slice(cursor, match.index)); re2.test(match[1]) ? add(match[1], true) : add("this." + match[1], true); cursor = match.index + match[0].length; } add(tpl.substr(cursor, tpl.length - cursor)); code += 'return r.join("");'; console.info(code); return new Function(code.replace(/[\r\t\n]/g, '')).apply(data); };
我们可以打印
code看看
code+='console.log(r);\n';
["My skills:", "<a href="#">", "js", "</a>", "<a href="#">", "html", "</a>", "<a href="#">", "css", "</a>", ""]
最终的结果
var 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("");
解析结果
My skills:<a href="#">js</a><a href="#">html</a><a href="#">css</a>
参考阅读:
- 只有20行Javascript代码!手把手教你写一个页面模板引擎
相关文章推荐
- 使用javascript原生实现一个模板引擎
- Juicer – 一个Javascript模板引擎的实现和优化
- 一个Javascript模板引擎的实现和优化
- 教你使用javascript简单写一个页面模板引擎
- [转载]Juicer – 一个Javascript模板引擎的实现和优化
- Rhino 是一个完全使用Java语言编写的开源JavaScript实现。Rhino通常用于在Java程序中,为最终用户提供脚本化能力。它被作为J2SE 6上的默认Java脚本化引擎。
- Juicer – 一个Javascript模板引擎的实现和优化
- Juicer – 一个Javascript模板引擎的实现和优化
- 教你使用javascript简单写一个页面模板引擎
- 只有20行Javascript代码!手把手教你写一个页面模板引擎
- 使用原生javascript实现瀑布流
- 学习 "使用cocos2d-x3.0和物理引擎实现碰撞检测" 中出现的一个问题
- SharePoint 2013 使用嵌入JavaScript方式实现一个垂直滚动列表
- 使用MVC中的HtmlHelper对象的ActionLink方法,实现一个Javascript:void(0)效果,去调用一个JS方法
- 在javascriptl中使用表格模板引擎template.js简化开发
- JavaScript模板引擎使用
- 只有20行Javascript代码!手把手教你写一个页面模板引擎
- Linux下之使用简单3种创建文件的命令,并实现一个Html和JavaScript小程序
- 一个前端html模板处理引擎(javascript) - pure
- JavaScript templating engine(一个好的JS模板引擎)