移動端開發中模板引擎的選擇


  移動端開發常常需要創建大量具有相同代碼結構,只有其中數據不同的代碼,如果使用for循環來不停的判斷不停地動態創建dom,這樣不僅繁瑣而且效率低,較高效的辦法是拼接html字符串,然后將整個html字符串解析成dom添加到所需要的位置,然而拼接字符串也是有技術的,並不是用+=來拼接就可以的,這樣做反而使效率低下,因為這里涉及到js的高效編程,js中字符串拼接使用=+在拼接次數少的時候效率非常高,但是在次數多,也就是多次循環的時候效率會非常低下。而與之相反的使用數組的push與join或者concat來拼接字符串在拼接數量較少的情況下效率比+=拼接略低,但是在拼接數量多的情況下,明顯優於+=拼接,那么這里所說的拼接數量到底是多少呢?說實話沒人知道,js的執行時間本來就不一樣的,同一個代碼第一次測試與第二次測試的事件不可能一樣,但是在你使用模板的地方肯定不止一點點的字符串拼接吧,這樣考慮,簡單點的地方,一個模板其中涉及到5個值,3個判斷,每次加載20條數據,那么就是9*20=180次拼接,180次不是一個小數了,況且一般的情況下會只有3個判斷?因此使用數組來拼接才是最佳方式,現在流行的模板引擎的核心應該都是使用的數組拼接法來拼接dom元素的,可能在處理方式上有些不同,例如artTemplate所稱之為的“預編譯”,那些模板都是功能擴展的比較多的了,像artTemplate支持文件與目錄組織模板,支持子模板嵌套,支持調試信息輸出等等,已經成為一個多元化的模板工具,所以其js文件較為大,而對應的doT.js相對功能就少,只是針對模板創建與渲染,因此大小只有4kb。

  流行的模板js框架有很多,例如最先jquery中的tmpl,artTemplate,juicer,doT,HandleBars等等,但是受其編譯與渲染效率影響在移動端適合使用的卻不多,主要有artTemplate,doT這兩種,artTemplate渲染速度較快,doT編譯速度較快,各有優點,但往往選擇artTemplate的比較多,因為artTemplate具有原生語法版,這種語法更容易使開發者接受,同時在一個頁面中同一種模板只需要編譯一次,后面的都是渲染過程,並不需要在每次都去編譯然后渲染,這樣artTemplate就具有相當的優勢,當然如果你覺得doT較輕量,從而選擇他的話,那我也沒辦法。最近在GitHub看到一個新的模板tppl.js,代碼非常少,一共26行代碼,但是測試效率卻非常高,測試是在手機端多次測試的,能夠具有一定的說服性,測試連接:http://yangjiepro.github.io/tppl/test/test.htm 而其並沒有專門的模板語法,並不像doT和artTemplate那樣有專門的模板語法,例如在dot中{{?}}表示if,{{~}}表示數組循環遍歷,這些奇怪的語法,在artTemplate中也存在,當然這樣寫獲取會使得代碼比較簡單,但是原生js支持這樣的語法嗎?還不是要在模板引擎中轉換成原生js所支持的語法,這就多了一部轉換過程。雖然少了點代碼,但是增加了引擎工作,因此我自己是不傾向使用模板獨特語法的,在使用artTemplate的時候也是使用的是原生語法版。而tppl語法完全是js原生語法,只是在js方法外面包一層[: 以及:],這與artTemplate中的<%...%>類似,當然如果你不習慣[::]這種,而習慣<%%>,那么也很容易DIY啊,只要把里面的[::]替換成<%%>就好,具體的GitHub地址:https://github.com/yangjiePro/tppl 

  在此感謝作者的分享,可能看到這么點代碼頓時覺得你也能寫出來,那么恭喜你,你已經高大上了!

  具體代碼如下:

/************************************************
 ** Copyright (C) 2000-2015 TIZA Inc..
 ** 類    名:模板類js
 ** 作    者:yanxlg
 ** 描    述:
 ** 生成日期:2015/12/1
 ** 修改日志:
 ** 基於GitHub中tppl.js源碼修改
 ** 原作者:楊捷
 *************************************************/
;(function ($) {
    /**
     * @param tpl {String}    模板字符串
     * @param data {Object}   模板數據(不傳或為null時返回渲染方法)
     *
     * @return  {String}    渲染結果
     * @return  {Function}  渲染方法
     *
     */
    function tppl(tpl, data){
        var fn =  function(d) {
            var i, k = [], v = [];
            for (i in d) {
                k.push(i);
                v.push(d[i]);
            };
            return (new Function(k, fn.$)).apply(d, v);
        };
        if(!fn.$){
            var tpls = tpl.replace(/[\r\n]/g, "").split('<%');
            // log(tpls);
            fn.$ = "var $=''";
            for(var t in tpls){
                var p = tpls[t].split('%>');
                if(t!=0){
                    fn.$ += '='==p[0].charAt(0)
                        ? "+("+p[0].substr(1)+")"
                        : ";"+p[0]+"$=$"
                }
                fn.$ += "+'"+p[p.length-1].replace(/\'/g,"\\'")+"'"
            }
            fn.$ += ";return $;";
            // log(fn.$);
        }
        return data ? fn(data) : fn;
    }
    $.tppl=tppl;
})(Zepto)

使用方法:

  1、在html中使用script節點創建單獨的模板,在該script中與普通html一樣的寫,只有用到涉及js的時候需要使用<%%>包裝,然后使用$.tppl(document.querySelector("#tpl").innerHTML)即可編譯成模板,也可以直接在編譯的同時渲染$.tppl(document.querySelector("#tpl").innerHTML,{});

<script type="text/html" id="tpl">
<div class="ub ub-ver">
<%if(data.length>0){%>
數量值:<%=data.length%>
<%}else{%>
數量值:0
<%}%>
</div>
</script>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM