首页 > 网站 > WEB开发 > 正文

模板引擎原理

2024-04-27 15:04:02
字体:
来源:转载
供稿:网友

模板编译用的还是比较多的,像template 、underscore的插件等等,不过随着vue ,angular ,avalon 等双向数据绑定的出现,也基本上用的不多了。都知道模板引擎都是正则匹配,但是都能想清楚么?

比如这么一个模板实例,让你用函数,如何去实现?

var template = ` <ul> <% for(var i=0;i<data.supplies.length;i++) { %> <li> <%= data.supplies[i] %> </li> <% } %> </ul> `

都清楚模板字符串中<%…%> 是放置js代码,使用<%= … %> 是输出js的表达式。

想办法将上述的模板字符串转换为如下形式:

echo('<ul>'); for(var i=0;i<data.supplies.length;i++){ echo('<li>'); echo(data.supplies[i]); echo('</li>') } echo('</ul>');

如何转换上述形式,这就得用正则表达式了。

// ?停止贪婪模式匹配 var evalExPR = /<%=(.+?)%>/g; var expr = /<%([/s/S]+?)%>/g; template = template.replace(evalExpr,'` );/n echo($1); /n echo( `' ) .replace(expr,'` ); /n $1 /n echo( `'); template = 'echo( ` ' + template + ' ` );'

最后将template 封装在一个函数里面就可以了。

var script = ` (function aa(data){ var output = ''; function echo(html){ output += html; } ${ template } return output; }) ` return script; }

整理一下,如下:

var template = ` <ul> <% for(var i=0;i<data.supplies.length;i++) { %> <li> <%= data.supplies[i] %> </li> <% } %> </ul> ` function compile(template){// ?停止贪婪模式匹配 var evalExpr = /<%=(.+?)%>/g; var expr = /<%([/s/S]+?)%>/g; template = template.replace(evalExpr,'` );/n echo($1); /n echo( `' ) .replace(expr,'` ); /n $1 /n echo( `'); template = 'echo( ` ' + template + ' ` );' var script = ` (function aa(data){ var output = ''; function echo(html){ output += html; } ${ template } return output; }) ` return script; } console.log(eval(compile(template))) var parse = eval(compile(template)); document.body.innerHTML = parse({ supplies:['broom','mop','clear'] });
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表