javascript 模板引擎做为数据与界面分离工做中最重要一环,愈来愈受开发者关注。javascript
artTemplate 是新一代 javascript 模板引擎,它采用预编译方式让性能有了质的飞跃,而且充分利用 javascript 引擎特性,使得其性能不管在前端仍是后端都有极其出色的表现。html
虽然每一个引擎从模板语法、语法解析、变量赋值、字符串拼接的实现方式各有所不一样,但关键的渲染原理仍然是动态执行 javascript 字符串。前端
可看:http://cdc.tencent.com/?p=5723 基本原理的例子java
一、预编译
在通常的模板引擎实现原理中,由于要对模板变量进行赋值,因此每次渲染都须要动态编译 javascript 字符串完成变量赋值。而 artTemplate 的编译赋值过程倒是在渲染以前完成的,这种方式称之为“预编译”。git
二、更快的字符串相加方式
不少人误觉得数组 push 方法拼接字符串会比 += 快,要知道这仅仅是 IE6-8 的浏览器下。实测代表现代浏览器使用 += 会比数组 push 方法快,而在 v8 引擎中,使用 += 方式比数组拼接快 4.7 倍。因此 artTemplate 根据 javascript 引擎特性采用了两种不一样的字符串拼接方式。github
一、引用js文件:<script src="js/arttmpl.js"></script>
二、页面中,使用一个type="text/template"的script标签存放模板:后端
<script id='doctor-template' type="text/template"> <% for(var i in data){ var item=data[i]; %> <li class="mui-table-view-cell mui-media "> <a href="javascript:;" class="mui-navigate-right"> <div class="mui-media-object mui-pull-left"> <img src="<%=(item.photo)%>" width="100%"> <span class="mui-badge mui-badge-danger"><%=(item.score)%>分</span> </div> <div class="mui-media-body"> <%=(item.name)%> <span class="mui-badge mui-badge-warning"><%=(item.position)%></span> <p class="mui-ellipsis"><%=(item.hospital)%></p> <p class="mui-ellipsis"><%=(item.desc)%></p> </div> </a> </li> <% } %> </script>
模板逻辑语法开始与结束的界定符号为<% 与 %>,若<%后面紧跟=号则输出变量内容。数组
三、渲染模板浏览器
template.render(id, data);
继续上面的例子:函数
var fragment = template('doctor-template', { "data":[ { name:"王静", score:4.5, photo:'images/logo.png', hospital:"江苏省中医院", desc:'妇科、不孕不育症、月经病等', position:'副医师' }, { name:"啦啦", score:4.9, photo:'images/logo.png', hospital:"鼓楼医院", desc:'儿童呼吸系统疾病的诊治,对于儿童疾病', position:'主治医师' } ] });
模板引擎默认数据包含的 HTML 字符进行转义以免 XSS 漏洞,若不须要转义的地方可以使用==。
<script id="test" type="text/template"> <%==value%> </script>
若须要关闭默认转义,能够设置:
template.config('escape', false);
var source = '<ul>'+ '<% for (var i = 0; i < list.length; i ++) { %>'+ '<li>索引 <%= i + 1 %> :<%= list[i] %></li>'+ '<% } %>'+ '</ul>'; var data = { list: ['文艺', '博客', '摄影', '电影', '民谣', '旅行', '吉他'] }; var render = template.compile(source); var html = render(data); document.getElementById('content').innerHTML = html;
template.compile([id], source)将返回一个渲染函数。其中 id 参数是可选的,若是使用了 id 参数,可使用template.render(id, data)渲染模板。
template.helper(name, callback)辅助方法通常用来进行字符串替换,如 UBB 替换、脏话替换等。
例如扩展一个UBB替换方法:
template.helper('$ubb2html', function (content) { return content .replace(/[b]([^[]?)[/b]/igm, '<b>$1</b>') .replace(/[i]([^[]?)[/i]/igm, '<i>$1</i>') .replace(/[u]([^[]?)[/u]/igm, '<u>$1</u>') .replace(/[url=([^]])]([^[]?)[/url]/igm, '<a href="$1">$2</a>') .replace(/[img]([^[]?)[/img]/igm, '<img src="$1" />'); });
在模板中的使用方式:
<%=$ubb2html(content) %>
注意:引擎不会对辅助方法输出的 HTML 字符进行转义。
若前端模板语法与后端语法产生冲突,能够修改模板引擎界定符,例如:
template.openTag = "<!--["; template.closeTag = "]-->";