成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

14行實現(xiàn)js原生語法前端模板引擎

hyuan / 2083人閱讀

最近開發(fā)前端一直用的前端模板引擎;

一直使用的 TPPL 模板引擎 源代碼如下:

function tppl(tpl, _data) {
    tpl = tpl.replace(/(<)/g, "<").replace(/(&)/g, "&").replace(/(>)/g, ">");
    var data = _data || {};
    if (typeof data !== "object") {
        console.log("TEFinal -> data is not JSON Object");
        return null;
    }
    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.split("");
        fn.$ = "var $empty=""; var $reg = RegExp(/object|undefined|function/i); var $=""";
        for (var t in tpls) {
            var p = tpls[t].split("");
            if (t != 0) {
                fn.$ += "=" == p[0].charAt(0) ?
                    "+($reg.test(typeof(" + p[0].substr(1) + "))?$empty:" + p[0].substr(1) + ")" :
                    ";" + p[0].replace(/
/g, "") + "$=$";
            }
            fn.$ += "+"" + p[p.length - 1].replace(/"/g, """).replace(/
/g, "
").replace(/
/g, "
").replace(/
/g, "
") + """;
        }
        fn.$ += ";return $;";
    }
    return data ? fn(data) : fn;
}

今天突發(fā)奇想,考慮到eval()中放入自執(zhí)行函數(shù),而這個閉包又可以直接訪問到外部變量,那么經(jīng)過整理,終極版的模板引擎出爐,代碼如下:

function evalTE (tpl, data) {
    tpl = tpl.replace(/^s+|s+$/gm, "").replace(/
/g, "").replace(/
/g, "")
        .replace(/
/g, "").replace(/(<)/g, "<").replace(/(&)/g, "&").replace(/(>)/g, ">");
    var fn = "(function(){var $$ = """,
        evals = tpl.split("");
    for (var t in evals) {
        var p = evals[t].split("");
        if (t != 0) {
            fn += "=" == p[0].charAt(0) ? "+" + p[0].substr(1) : ";" + p[0] + "$$=$$";
        }
        fn += "+"" + p[p.length - 1] + """;
    }
    fn += ";return $$; })();";
    return data ? eval(fn) : fn;
}

通過eval()自執(zhí)行函數(shù),函數(shù)又可以訪問到外部的 data 數(shù)據(jù); 如果不傳需要渲染的數(shù)據(jù),那么可以返回該自執(zhí)行函數(shù)字符串。當(dāng)需要渲染的時候,可以通過eval()或者new Function()來調(diào)用

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/89958.html

相關(guān)文章

  • 自己動手擼個簡易模板引擎(50左右)

    摘要:寫在前面模板的誕生是為了將顯示與數(shù)據(jù)分離,模板技術(shù)多種多樣,但其本質(zhì)是將模板文件和數(shù)據(jù)通過模板引擎生成最終的代碼。目前有著很多這種模板引擎,諸如的,,的。當(dāng)然在用過這么多的模板引擎后,也有著自己實現(xiàn)一個簡易模板引擎的沖動。 寫在前面 模板的誕生是為了將顯示與數(shù)據(jù)分離,模板技術(shù)多種多樣,但其本質(zhì)是將模板文件和數(shù)據(jù)通過模板引擎生成最終的HTML代碼。目前有著很多這種模板引擎,諸如Node的...

    ixlei 評論0 收藏0
  • 【連載】前端個人文章整理-從基礎(chǔ)到入門

    摘要:個人前端文章整理從最開始萌生寫文章的想法,到著手開始寫,再到現(xiàn)在已經(jīng)一年的時間了,由于工作比較忙,更新緩慢,后面還是會繼更新,現(xiàn)將已經(jīng)寫好的文章整理一個目錄,方便更多的小伙伴去學(xué)習(xí)。 showImg(https://segmentfault.com/img/remote/1460000017490740?w=1920&h=1080); 個人前端文章整理 從最開始萌生寫文章的想法,到著手...

    madthumb 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<