关于模板剖析的典范实践

提要:摘录的jquery的模板的部份代码,整顿一下剖析模板的思绪。重点在正则的用法的控制。

剖析代码内容

<script>
(function(){
  var cache = {};
  var tag_start='<!--';
  var tag_end='-->';

  this.tmpl = function tmpl(str, data){
  var strTemp = str.replace(/[\r\t\n]/g, " ")
          .split(tag_start).join("\t")
          .replace(new RegExp("((^|"+tag_end+")[^\\t]*)'", "g"), "$1\r")
          .replace(new RegExp("\\t=(.*?)"+tag_end, "g"), "',$1,'")
          .split("\t").join("');")
          .split(tag_end).join("p.push('")
          .split("\r").join("\\'");

    var fn = !/\W/.test(str) ? cache[str] = cache[str] ||
      tmpl(document.getElementById(str).innerHTML) :
      new Function("obj", "var p=[],print=function(){p.push.apply(p,arguments);};" +
        "with(obj){p.push('" + strTemp  + "');}return p.join('');");
    if (data)
       {document.getElementById(str).innerHTML=fn( data )
       }
    else
        {return fn;
        }
  };
})();
</script>

<div id="tpl">
    <br>
<!--for (i=0;i<users.length;++i){-->
 Name:'<!--=users[i].name-->'
    <br>
<!--}-->
</div>

<script>
var data={users:[{name:'name1'},
                 {name:'name2'}
                ]
         };
   tmpl("tpl", data);
</script>



剖析后代码:

(function anonymous(obj) {
    var p = []
      , print = function() {
        p.push.apply(p, arguments);
    };
    with (obj) {
        p.push('  <br> ');
        for (i = 0; i < users.length; ++i) {
            p.push(' Name:\'', users[i].name, '  \'<br> ');
        }
        p.push(' ');
    }
    return p.join('');
}
)


剖析部份

//婚配部份
str.replace(/[\r\t\n]/g, " ")  // 将回车,换行,制表符 替代成空格,将代码拍平
  .split("<--").join("\t")     //将替代部份的最先符替代成\t,不要纠结,下面会诠释为何这么做
  .replace(new RegExp("((^|-->)[^\\t]*)'", "g"), "$1\r")  //不以\t开首的字符(能够没有)+'或许--> +\t之外的字符(能够没有)+' ,假如满足前提,$1\r里的$1为前面()的部份,相当于将'替代为\r
  .replace(new RegExp("\\t=(.*?)-->", "g"), "',$1,'")  // \t 为前面的<--,婚配下面模板中的<!--=users[i].name--> ,替代内容',$1,' 即()内婚配到的users[i].name 加上前缀',和后缀,'
  .split("\t").join("');")  //不符合上面划定规矩的\t即<--替代为');
  .split("-->").join("p.push('") //不符合上面划定规矩的-->替代为p.push(');
  .split("\r").join("\\'");   //第三即将'替代为',此处再替代回'


//模板部份
   <div id="tpl">
        <br>
    <!--for (i=0;i<users.length;++i){-->  //<-- 变成了'); --> 变成p.push('
     Name:'<!--=users[i].name-->'  //此处的'变成了\' <!---->被划定规矩婚配为',users[i].name,'的单词分开符
        <br>
    <!--}-->     //<-- 变成了'); --> 变成p.push('
    </div>

<!– –> 所以有两种用法,一种是继往开来 <– 变成了’); –> 变成p.push(‘一种是分开字符 ‘,$1,’

文例子出处:JavaScript Micro-Templating

    原文作者:codehunter
    原文地址: https://segmentfault.com/a/1190000017271610
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞