从事前端这一行业,那么不得不接触前端的模板引擎,所谓的模板引擎就是为了在前端更好的渲染后端的数据,前端有很多的模板引擎比如underscore、arttemplate等等,今天自己总结了一下自己平时是如何使用它们的。
javascript模板引擎实现原理
原生js模板引擎内部实现原理的实质是:利用正则表达式,替换模板当中事先定义好的标签。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34<div id="content">
  <!-- 模板内容显示位置 -->
</div>
<!-- 1.创建模板 -->
<script type="text/html" id="tpl">
    <h4>my name is <%= name %></h4>
   <h5>i am <%= age %> years old</h5>
</script>
<script>
   //2.将函数进行简单封装
   function template(id,data){
      var tpl = document.getElementById(id);
  //字符串
      tpl = tpl.innerHTML;
      //通过正则表达式查换特殊标记的内容,这里正则表达式不做介绍,网上有很多,可以查
      var reg = /<%=\s*([^%>]+\S)\s*%>/;
      var match;
      //匹配不到则为null,循环则停止
      while(match = reg.exec(tpl)){//exec匹配字符串中的正则表达式
         //替换
         tpl = tpl.replace(match[0],data[match[1]]);
      }
      return tpl;//返回渲染值
   }
// 3.渲染模板
   var data = {
      name:'cici',
      age:10
   }
   //4.调用模板引擎
   var html = template('tpl',data);
   //5.输出内容
   document.getElementById('content').innerHTML = html;
</script>
result:
1.artTemplate
新一代的javascript模板引擎,他有两个版本选择,一个是简洁语法版,另一个是原生语法版。
- github地址:arttemplate
1.1 简洁语法
编写模板:1
2
3
4
5
6
7<script type="text/template" id="tpl">
   <ul>
       <!-- each list as value i -->
       {{each list}}
       <li>我的名字时{{$value.name}},我的年龄是{{$value.age}}</li>
       {{/each}}
   </ul>
渲染模板1
2
3
4
5
6
7
8
9
10
11
12
13<script src="libs/template.js"></script>
  <script>
    var data = {
    list:[
        {name:'xjj1',age:10},
        {name:'xjj2',age:12},
        {name:'xjj3',age:16},
        {name:'xjj4',age:40}
    ]
  }
  var html = template('tpl',data);
  document.querySelector('.box').innerHTML = html;
  </script>
result:
1.2原生语法
编写模板1
2
3
4
5
6
7<script type="text/template" id="tpl">
     <ul>
        <% for(var i = 0 ; i < list.length ; i ++){%>
        <li>我的名字是:<b><%=list[i].name%></b>我的年龄是:<b><%=list[i].age%></b>。</li>
        <%};%>
    </ul>
  </script>
渲染模板1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<script src="libs/template-native.js"></script>
  <script>
   var data = {
        list:[
            {name:'xjj1',age:10},
            {name:'xjj2',age:12},
            {name:'xjj3',age:16},
            {name:'xjj4',age:40}
        ]
    }
    //解析数据成html字符串
    var html = template('tpl',data);
    //添加到html页面中
    document.querySelector('.box').innerHTML = html;
  </script>
result:
注意:因为原生的js模板不能使用全局的变量,所以要自己引入全局变量
假如要使用jquery中的方法时,要引入jquery包
编写模板:1
2
3
4
5
6<script type="text/template" id="tpl">
    <% var $ = getJquery();%>
    <%$.each(model,function(i,v){%>
        <%=v.name%>今年<%=v.age%><br>
    <%});%>
  </script>
渲染模板:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19<script src="libs/template-native.js"></script>
  <script src="libs/jquery.min.js"></script>
  <script>
   var list = [
            {name:'xjj1',age:10},
            {name:'xjj2',age:12},
            {name:'xjj3',age:16},
            {name:'xjj4',age:40}
        ];
    // 把全局变量传进模板引擎
    // 第一个参数是:name
    // 第二个参数是:callback
    template.helper('getJquery',function(){
      return $;
    })
    var html = template('tpl',{model:list});
    document.querySelector('.box').innerHTML = html;
  </script>
result:
2.underscore
- 官网:(underscore)(http://www.css88.com/doc/underscore/)
- Underscore一个JavaScript实用库,提供了一整套函数式编程的实用功能,但是没有扩展任何JavaScript内置对象。
编写模板:1
2
3
4
5
6
7
8<script type="text/template" id="tpl">
   <% _.each(datamodel,function(v, k){ %>
     <tr>
       <td><%=v.name%></td>
       <td><%=v.age%></td>
     </tr>
  <% })%>
 </script>
渲染模板:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<script src="libs/underscore/underscore.js"></script>
  <script>
    var data = [
    {name:'张三',age:20},
    {name:'李四',age:22},
    {name:'王五',age:23},
    ];
    // 获得模板内容的字符串
    var templateStr = document.querySelector('#tpl').innerHTML;
    // 转化成模板方法
    var templateFun = _.template(templateStr);
    //解析成html结构
    var html = templateFun({datamodel:data});
    //添加到html结构中去
    document.querySelector('tbody').innerHTML = html;
  </script>
result:
