2011-01-05 73 views
12

更新提高jQuery的模板性能

顯然,jQuery的模板可以被編譯,它有助於與if語句顯示here爲模板的性能。

但如here所示,預編譯的jQuery模板對我的情況並沒有太大的作用,因爲我的模板不包含邏輯塊。

對於那些建議使用另一個模板引擎的人,理想情況下我想只使用jQuery模板,因爲團隊中的每個人都知道jQuery。還有一些this測試用例比較了幾個模板引擎。


嗨,

就在今天,我被告知,有與使用jQuery模板的性能問題。

爲了進行比較,我使用了jQuery模板和良好的舊字符串append方法將行添加到表中。結果可以看到here。與字符串附加方法相比,使用jQuery模板大約慢65%,Ouch!

我想知道怎樣才能提高jQuery模板腳本的性能。

完整的腳本可以在提供的鏈接中查看。但基本思路如下:

模板:

<script type="x-jquery-tmpl" id="tmplRow"> 
<tr> 
    <td><input type="checkbox" value="${id}" /></td> 
    <td>${firstName} ${lastName}</td> 
    <td class="edit"> 
     <a>Edit</a> 
     <input style="display:none;" type="hidden" value="Blah" /> 
     <input class="cancel" type="button" value="cancel" /> 
    </td> 
    <td class="select"> 
     <a>Select</a> 
     <select style="display:none;"> 
      <option>0</option> 
      <option>1</option> 
      <option>2</option> 
      <option>3</option> 
      <option>4</option> 
      <option>5</option> 
      <option>6</option> 
      <option>7</option> 
      <option>8</option> 
      <option>9</option> 
      <option>10</option> 
     </select> 
     <input class="cancel" type="button" value="cancel" /> 
    </td> 
    <td>More string</td> 
    <td>More string</td> 
    <td>More string</td> 
    <td>More string</td> 
    <td>More string</td> 
    <td>More string</td> 
</tr> 
</script> 

數據:

<script type="text/javascript"> 
    var data = []; 

    for (var i = 0; i < 100; i++) { 
     var row = { 
      id: i, 
      firstName: 'john', 
      lastName: 'doe' 
     }; 

     data.push(row); 
    } 
</script> 

HTML:

<table id="table"></table> 

執行:

<script type="text/javascript"> 
$('#tmplRow').tmpl(data).appendTo('#table'); 
</script> 

謝謝,

回答

0

你的模板是非常簡單的,你可能想take a look at handlebars.js這是具有預編譯模板的選項模板語言。

它由rails和jquery核心成員Yehuda Katz製作。

+0

我不介意檢查車把。但他們的下載不起作用。如果我僅從源代碼引用「handlebars.js」,它將會以未定義的方法「required」失敗。你有沒有js文件的副本? – 2011-01-06 16:00:31

+0

jquery模板'編譯'模板以及... – user406905 2011-01-06 22:27:55

+0

顯然,'編譯'模板只有在有邏輯控制塊時纔有幫助。詳細信息請查看更新後的問題。 – 2011-01-06 22:41:40

4

這似乎是現在最快的引擎:http://documentcloud.github.com/underscore/

您可以在這裏找到一個基準測試套件,比較目前市面上所有不同的模板框架:https://github.com/aefxx/jQote2 [點擊下載和運行jqote.benchmark.htm。

我確實認爲jQuery模板處於初期階段,在隨後的迭代中性能會提高。

+0

我認爲這是最接近的答案......基本上,等待jQuery模板改善性能。現在,我會盡量不要依賴它。 – 2011-01-14 22:45:25

+0

,如果你確實需要殺手速度,請使用下劃線。它更接近原生的JavaScript。當然,你必須稍微改變/調整你的jQuery模板(如果你使用循環/條件邏輯和其他複雜的東西)。好的是,儘管缺乏詳盡的文檔,但仍然可以管理所有這些,並且在某些情況下比jQuery更容易。 – Mrchief 2011-01-19 14:51:54

1

這取決於渲染的瀏覽器。IE6可能相當慢(儘管傳輸1,000行大量HTML標記並將其注入到文檔中也不會很快)。

下面是在Chrome瀏覽器jsperf benchmark that generates 1,000 rows of 10 columns and renders it. I'm averaging 200-250ms to render 1000行9

更重要的問題確實應該:世界爲什麼你一次顯示1000行?除此之外,總是有更好的用戶體驗選擇。

+0

我們不是試圖做1000行,而是100行。 100行並不是那麼糟:)。我想快速測試模板的性能,因爲我們正在考慮構建一個交互式網格,其中每個​​根據數據顯示不同的結果。將會有很多更多的模板邏輯,然後只是附加行。所寫的測試只是一種查看性能是否可能成爲問題的方法。 – 2011-01-11 16:26:35

+0

我創建了一個新的測試版本的RAW HTML,我得到的速度似乎比jQuery模板快。 http://jsperf.com/jquery-templates-performance/4 - jQuery模板(1.2秒),原始HTML(0.2秒)!巨大的差異 – 2011-04-26 09:01:30

+0

如果你要複製/粘貼別人的答案,至少要給他們信用。 http://stackoverflow.com/questions/4590718/jquery-templates-performance/4590790#4590790 – 2011-08-04 12:43:05

5

陳志

有點遲了跟這一個。我發現首先編譯模板,然後通過字符串ID引用它們(在下面的情況下,命名變量templateAlias)實際上比通過對象路徑快10倍。這裏是你如何做到這一點(基於您的代碼示例):

var templateAlias = 'tmplRow'; 
// compile the template 
$.template(templateAlias, $("#tmplRow")); 

<script type="text/javascript"> 
    $.tmpl(templateAlias, data).appendTo('#table'); 
</script> 

爲模板,將已編譯這應該顯著加快procedings並不會使用整個對象模型每次運行.appendTo()功能。使用$('#tmplRow').tmpl(data).appendTo('#table');意味着$('#tmplRow')查詢DOM,而$.tmpl(templateAlias, data).appendTo('#table');僅基於對模板的引用添加到DOM。關於這個問題有很多的閱讀。

這裏有一個鏈接,可以幫助:

http://boedesign.com/misc/presentation-jquery-tmpl/#13

希望這會有所幫助,祝你好運......

+0

嗨,吉姆!感謝您的輸入:)您的演示文稿非常棒。編譯模板的事情我仍然很困擾。我不知道它在後臺做了什麼,但是如果模板中有條件塊,編譯好的模板似乎只會有所作爲。我爲此寫了一個測試,看看問題中的「更新」塊。怪怪的? – 2011-01-28 21:51:33

+0

Chi - 嘗試將上面的代碼作爲第二次更新插入到您的測試中,看看有什麼不同。我認爲這些數字會下降60-70%...... – 2011-01-29 10:55:00

+0

我認爲你的性能測試存在缺陷。也許它不會有所作爲,但是我會運行第二個「$ .tmpl」語句而不測量,然後*運行它1000次以查看它的速度。該方法可能會在第一次運行時在幕後進行一些優化。至少我肯定希望如此。 總之,您的第二次1000次運行包括在運行#1中進行的任何可能的優化。 – 2012-10-17 17:46:31