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

更新日期: 2020-03-08阅读: 1.6k标签: 模板

最近开发前端一直用的前端模板引擎;一直使用的 TPPL 模板引擎 源代码如下:

function tppl(tpl, _data) {
    tpl = tpl.replace(/(&lt;)/g, "<").replace(/(&amp;)/g, "&").replace(/(&gt;)/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(‘<nb>‘);
        fn.$ = "var $empty=‘‘; var $reg = RegExp(/object|undefined|function/i); var $=‘‘";
        for (var t in tpls) {
            var p = tpls[t].split(‘</nb>‘);
            if (t != 0) {
                fn.$ += ‘=‘ == p[0].charAt(0) ?
                    "+($reg.test(typeof(" + p[0].substr(1) + "))?$empty:" + p[0].substr(1) + ")" :
                    ";" + p[0].replace(/\r\n/g, ‘‘) + "$=$";
            }
            fn.$ += "+‘" + p[p.length - 1].replace(/\‘/g, "\\‘").replace(/\r\n/g, ‘\\n‘).replace(/\n/g, ‘\\n‘).replace(/\r/g, ‘\\n‘) + "‘";
        }
        fn.$ += ";return $;";
    }
    return data ? fn(data) : fn;
}


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

function evalTE (tpl, data) {
    tpl = tpl.replace(/^\s+|\s+$/gm, ‘‘).replace(/\r\n/g, ‘‘).replace(/\n/g, ‘‘)
        .replace(/\r/g, ‘‘).replace(/(&lt;)/g, ‘<‘).replace(/(&amp;)/g, ‘&‘).replace(/(&gt;)/g, ‘>‘);
    var fn = ‘(function(){var $$ = \‘\‘‘,
        evals = tpl.split(‘<nb>‘);
    for (var t in evals) {
        var p = evals[t].split(‘</nb>‘);
        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.cnblogs.com/homehtml/p/12846009.html

链接: https://www.fly63.com/article/detial/8905

前端模板引擎jsrender的实用入门教程

下一代Jquery模板JsRender。jsrender官网号称简单直观、强大轻快可扩展。压缩体积也只有8.9kb,可以单独在浏览器或node中使用,也可以配合jQuery使用。

EJS实例教程详解_ejs模板引擎的使用

ejs是一个款简单的纯js模板引擎,其主要作用是:用来从JSON数据中生成HTML字符串。

artTemplate模板引擎的使用

artTemplate是腾讯开源的前端模板框架,和mustache,handlerbars类似,在web项目中可以很方便的使用,上手快,如果用过mustache,那么几乎可以快速切换到template框架上来。

Vue模板语法中数据绑定

们通过 vue 对象修改数据可以直接影响到 DOM 元素,但是,如果直接修改 DOM 元素,却不会影响到 vue 对象的数据;我们把这种现象称为 单向数据绑定 ;通过 v-model 指令展示表单数据,此时就完成了 双向数据绑定

发送邮件使用html模板的实现的大致思路

客户最近有一个需求,大致的意思是提供一个 word文档,让其作为一个模板,在发送邮件的时候能够实现按照这个模板的样式和内容,替换其中 的一些字段,作为邮件的内容发给收件人

Bootstrap后台管理模板有哪些?

在开发项目中,后台管理因为面向群体相对比较固定,使用Bootstrap后台模板可以让后端开发很轻松的就展现给客户一个响应式的后台,节约前端开发的时间。下面给大家分享一下最值得拥有的免费Bootstrap后台管理模板

如何选择 Web 前端模板引擎?

模板引擎负责组装数据,以另外一种形式或外观展现数据。浏览器中的页面是 Web 模板引擎最终的展现。无论你是否直接使用模板引擎,Web 模板一直都在,不在前端就在后端,它的出现甚至可以追溯到超文本标记语言 HTML 标准正式确立之前。

我来聊聊面向模板的前端开发

在软件开发中,研发效率永远是开发人员不断追求的主题之一。于公司而言,在竞争激烈的互联网行业中,产出得快和慢也许就决定着公司的生死存亡;于个人而言,效率高了就可以少加班,多出时间去提升自己、发展爱好、陪伴家人,工作、生活两不误

Vue模板语法、事件和表单使用

文本绑定,两个大括号,中间加上data里面的数据,message里面不仅可以是变量还可以是表达式;JS表达式(计算、拼接、只能是单个表达式)插入HTML代码(慎用!防止XSS攻击 ),我们可以直接在data里面定义html代码

面向模板的前端开发

在软件开发中,研发效率永远是开发人员不断追求的主题之一。于公司而言,在竞争激烈的互联网行业中,产出得快和慢也许就决定着公司的生死存亡;于个人而言,效率高了就可以少加班,多出时间去提升自己

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!