资讯专栏INFORMATION COLUMN

14行实现js原生语法前端模板引擎

hyuan / 2074人阅读

最近开发前端一直用的前端模板引擎;

一直使用的 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;
}

今天突发奇想,考虑到eval()中放入自执行函数,而这个闭包又可以直接访问到外部变量,那么经过整理,终极版的模板引擎出炉,代码如下:

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()自执行函数,函数又可以访问到外部的 data 数据; 如果不传需要渲染的数据,那么可以返回该自执行函数字符串。当需要渲染的时候,可以通过eval()或者new Function()来调用

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89958.html

相关文章

  • 自己动手撸个简易模板引擎(50左右)

    摘要:写在前面模板的诞生是为了将显示与数据分离,模板技术多种多样,但其本质是将模板文件和数据通过模板引擎生成最终的代码。目前有着很多这种模板引擎,诸如的,,的。当然在用过这么多的模板引擎后,也有着自己实现一个简易模板引擎的冲动。 写在前面 模板的诞生是为了将显示与数据分离,模板技术多种多样,但其本质是将模板文件和数据通过模板引擎生成最终的HTML代码。目前有着很多这种模板引擎,诸如Node的...

    ixlei 评论0 收藏0
  • 【连载】前端个人文章整理-从基础到入门

    摘要:个人前端文章整理从最开始萌生写文章的想法,到着手开始写,再到现在已经一年的时间了,由于工作比较忙,更新缓慢,后面还是会继更新,现将已经写好的文章整理一个目录,方便更多的小伙伴去学习。 showImg(https://segmentfault.com/img/remote/1460000017490740?w=1920&h=1080); 个人前端文章整理 从最开始萌生写文章的想法,到着手...

    madthumb 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<