简单介绍

javascript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注。

artTemplate 是新一代 javascript 模板引擎,它采用预编译方式让性能有了质的飞跃,并且充分利用 javascript 引擎特性,使得其性能无论在前端还是后端都有极其出色的表现。

javascript 模板引擎基本原理

虽然每个引擎从模板语法、语法解析、变量赋值、字符串拼接的实现方式各有所不同,但关键的渲染原理仍然是动态执行 javascript 字符串。

可看:http://cdc.tencent.com/?p=5723 基本原理的例子

artTemplate 高效的秘密

1、预编译
在一般的模板引擎实现原理中,因为要对模板变量进行赋值,所以每次渲染都需要动态编译 javascript 字符串完成变量赋值。而 artTemplate 的编译赋值过程却是在渲染之前完成的,这种方式称之为“预编译”。

2、更快的字符串相加方式
很多人误以为数组 push 方法拼接字符串会比 += 快,要知道这仅仅是 IE6-8 的浏览器下。实测表明现代浏览器使用 += 会比数组 push 方法快,而在 v8 引擎中,使用 += 方式比数组拼接快 4.7 倍。所以 artTemplate 根据 javascript 引擎特性采用了两种不同的字符串拼接方式。

使用方法

1、引用js文件:<script src="js/arttmpl.js"></script>
2、页面中,使用一个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)%>&nbsp;<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>
    

模板逻辑语法开始与结束的界定符号为<% 与 %>,若<%后面紧跟=号则输出变量内容。

3、渲染模板

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

模板引擎默认数据包含的 HTML 字符进行转义以避免 XSS 漏洞,若不需要转义的地方可使用==。

<script id="test" type="text/template">
<%==value%>
</script>

若需要关闭默认转义,可以设置:

template.config('escape', false);

在js中存放模板

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 = "]-->";

GitHub 地址

更多参考文档:http://aui.github.io/artTemplate/


dada86
993 声望22 粉丝

多努力一点点。