2011-01-05 32 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