Javascript模板引擎分享

模板引擎的主要功能就是把變化的數據融入到不變的模板中,並生成最終結果。目前,前端的主要數據格式無非是XML和JSON。如何將這些數據更加方便的呈現呢?javascript

最近看了不少的PHP模板引擎,今天看到了一個很是棒的Javascript模板引擎,用以更方便的呈現前臺數據。它的一個超級簡單的、快速的,高速緩存的,很是容易使用的模板引擎。html

下面就來看下這個模板引擎是如何工做的。前端

// Simple JavaScript Templating
// John Resig - http://ejohn.org/ - MIT Licensed
(function(){
  var cache = {};

  this.tmpl = function tmpl(str, data){
    // 判斷出咱們是否獲取一個模板或是否咱們要加載一個模板並肯定要緩存結果
    //Figure out if we're getting a template, or if we need to load the template - and be sure to cache the result.

    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(){} 做爲局部變量引入數據
        "with(obj){p.push('" +

        // 將模板內容轉化成JavaScript
        Convert the template into pure JavaScript
        str
          .replace(/[\r\t\n]/g, " ")
          .split("<%").join("\t")
          .replace(/((^|%>)[^\t]*)'/g, "$1\r")
          .replace(/\t=(.*?)%>/g, "',$1,'")
          .split("\t").join("');")
          .split("%>").join("p.push('")
          .split("\r").join("\\'")
      + "');}return p.join('');");

    // 提供一個基礎的currying給用戶
    return data ? fn( data ) : fn;
  };
})();

Currying 的意思爲將原來的函數只可帶一個參數列表以多個參數列表(注意不是多個參數)實現,如:def foo(x)(y)(z){}。java

上面的只是具體實現的JS庫,那到底怎麼使用呢?瀏覽器

  1. <script type="text/html" id="item_tmpl">
  2.   <div id="<%=id%>" class="<%=(i % 2 == 1 ? " even" : "")%>">
  3.     <div class="grid_1 alpha right">
  4.       <img class="righted" src="<%=profile_image_url%>"/>
  5.     </div>
  6.     <div class="grid_6 omega contents">
  7.       <p><b><a href="/<%=from_user%>"><%=from_user%></a>:</b> <%=text%></p>
  8.     </div>
  9.   </div>
  10. </script>

或者這樣緩存

<script type="text/html" id="user_tmpl">
  <% for ( var i = 0; i < users.length; i++ ) { %>
    <li><a href="<%=users[i].url%>"><%=users[i].name%></a></li>
  <% } %>
</script>

上面的使用代碼中出現了一個特別的script內容類型text/html,這樣的類型瀏覽器就不要去執行其中的內容,用戶也就看不到其中的內容。這樣就能夠很是簡單的把你想要的內容模板嵌入到你的頁面中。這是一種快速的曲線救國的策略。閉包

講了這麼多,那麼怎麼把數據給模板引擎呢,這還需使用Javascript來實現:app

var results = document.getElementById("results");
results.innerHTML = tmpl("item_tmpl", dataObject);

一樣的你能夠預先編譯好須要呈現的代碼供後面的使用,以下面的循環:函數

var show_user = tmpl("item_tmpl"), html = "";
for ( var i = 0; i &lt; users.length; i++ ) {
  html += show_user( users[i] );

以上就是所有代碼,整個邏輯很是的清晰,就是把模板語言「編譯」爲Javascript的原生語法。這個引擎的優勢在於:this

  1. 能夠使用任何Javascript支持的語法。
  2. Parse模板的過程在閉包內執行,不會產生全局變量。
  3. 對「編譯」後的模板進行了緩存,下次能夠跳過「編譯」的過程直接使用。

最後你們仍是要試一下才知道好很差用。

原代碼地址:http://ejohn.org/blog/javascript-micro-templating/

相關文章
相關標籤/搜索