美文网首页
模板渲染学习

模板渲染学习

作者: Gary嘉骏 | 来源:发表于2017-09-09 22:44 被阅读0次

    应用场景

    前端如angular 和 vue 都有模板指令,后端express也可以配合使用多种模块引擎,这些大部分都是模板渲染

    要点

    将模块按照规则合成一个Function实例,然后调用

    例子,实现模板引擎ejs的for功能

    html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>模板渲染</title>
        <style>
        </style>
    </head>
    <body>
    <div id="list">
    </div>
    <!--
        模板放置的地方,由于设置了type,所以浏览器不会把这当作JavaScript来运行
    -->
    <script type="text/template" id="templs">
    <ul>
        <% for(var i in obj){ %>
            <li><%= obj[i].text %>:<%= obj[i].status %></li>
        <% } %>
    </ul>
    
    </script>
    <script src="mytempltes.js"></script>
    <script>
    new Template({
        el:"list",// 渲染节点
        tem:"templs", // 模板节点
        data:[
            {
                text:"大前端",status:"火热"
            },
            {
                text:"大前端2",status:"火热2"
            }
        ]
    });
    
    </script>
    </body>
    </html>
    
    

    mytempltes.js

    (function(win,factory){
    
        win.Template = factory;
    
    })(this,function(options){//options就是传入的对象
        //匹配指定的字符:A:<% ... %>  B:<%= %>
        var matcher = /<%=([\s\S]+?)%>|<%([\s\S]+?)%>|$/g;//这个正则不是去匹配,而是根据正则替换
        var el = document.getElementById(options.el);
        var tem = document.getElementById(options.tem).innerHTML;
        var data = options.data;
    
        var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;//特殊字符列表
        //空格:$nbsp;  &glt;....
        var escapers = {//匹配需要匹配的字段,替换为指定的字段
            "'":"'",
            "\\":"\\",
            "\r":"r",
            "\n":"n",
            "\t":"t",
            "\u2028":"u2028",
            "\u2029":"u2029"
        }
    
        //XSS攻击:传入一些特殊的字符,以混淆JS,传入进来,导致程序错误或者出现Bug
        var template = function(text,data){//处理业务逻辑
            /*
                由于语法特殊,如果单纯的通过if或者其他判断,肯定不能达到理想的效果
                就需要根据已有的模板字符来动态创建方法
    
             */
            var index = 0;
            var function_body = "var dataHtml = '';";
            function_body += "dataHtml += '";
            text.replace(matcher,function(match,interlpolate,evaluate,offset){
                /*
                    match:被匹配的模板字符
                    interlpolate:已经替换的字符
                    evaluate:已经替换的字符
                    offset:被替换字符的下标位置
    
                    指定字符串的位置:text.slice(起始位置,结束位置)
                 */
                function_body += text.slice(index,offset)
                    .replace(escaper,function(match){
                        return '\\' + escapers[match];//因为没有指定的字符
                });
    
                if(evaluate){
                    function_body += "';"+evaluate+"dataHtml += '";
                }
                if(interlpolate){
                    function_body += "' + " + interlpolate + " + '";
                }
                index = offset + match.length;//已有的长度+字符的长度 = 下一个的长度
                return match;
            });
    
            function_body += "';return dataHtml";
            //此时render已经是一个动态的方法了
            var render = new Function('obj',function_body);//通过new Functionn得到一个通过字符串生成的动态方法
            return render(data);
    
        }
        el.innerHTML = template(tem,data);
    
    
    
    });
    
    

    如果觉得文章对你有点用的话,麻烦拿出手机,这里有一个你我都有的小福利(每天一次): 打开支付宝首页搜索“8601304”,即可领红包。谢谢支持

    相关文章

      网友评论

          本文标题:模板渲染学习

          本文链接:https://www.haomeiwen.com/subject/vqnajxtx.html