js模板引擎——art Template

簡單介紹

javascript 模板引擎做爲數據與界面分離工做中最重要一環,愈來愈受開發者關注。javascript

artTemplate 是新一代 javascript 模板引擎,它採用預編譯方式讓性能有了質的飛躍,而且充分利用 javascript 引擎特性,使得其性能不管在前端仍是後端都有極其出色的表現。html

javascript 模板引擎基本原理

雖然每一個引擎從模板語法、語法解析、變量賦值、字符串拼接的實現方式各有所不一樣,但關鍵的渲染原理仍然是動態執行 javascript 字符串。前端

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

artTemplate 高效的祕密

一、預編譯
在通常的模板引擎實現原理中,由於要對模板變量進行賦值,因此每次渲染都須要動態編譯 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)%>&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>

模板邏輯語法開始與結束的界定符號爲<% 與 %>,若<%後面緊跟=號則輸出變量內容。數組

三、渲染模板瀏覽器

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/

相關文章
相關標籤/搜索