改善jQuery模板性能

时间:2011-01-05 19:30:03

标签: jquery performance jquery-templates

更新

显然,可以编译jQuery模板,它有助于显示 if语句 here的模板的性能。

但是如图所示here,预编译的jQuery模板对我的情况没有太大作用,因为我的模板不包含逻辑块。

对于那些建议使用另一个模板引擎的人,理想情况下我只想使用jQuery模板,因为团队中的每个人都只知道jQuery。还有this测试用例比较了一些模板引擎。


您好,

就在今天,我被告知使用jQuery模板存在性能问题。

为了比较,我使用了jQuery模板和好的旧字符串追加方法来向表中添加行。结果可见here。与字符串追加方法相比,使用jQuery模板大约慢了65%!

我想知道如何改善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>

谢谢,

5 个答案:

答案 0 :(得分:5)

Chi Chan,

在这条路上有点晚了。我发现首先编译模板然后通过字符串Id(在下面的情况下,命名变量templateAlias)引用它们实际上比通过对象路由快10倍。以下是您实现该目标的方法(基于您的代码示例):

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

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

这将显着加快程序,因为模板将被编译,并且每次运行.appendTo()函数时都不会使用整个对象模型。使用$('#tmplRow').tmpl(data).appendTo('#table');表示$('#tmplRow')查询DOM,而$.tmpl(templateAlias, data).appendTo('#table');仅基于对模板的引用添加到DOM。关于这个问题有很多阅读。

这是一个可能有用的链接:

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

希望这会有所帮助,祝你好运......

答案 1 :(得分:4)

这似乎是目前最快的引擎:http://documentcloud.github.com/underscore/

您可以在此处找到一个基准测试套件,用于比较当前可用的所有不同模板框架:https://github.com/aefxx/jQote2 [下载并运行jqote.benchmark.htm]。

我相信jQuery模板还处于起步阶段,性能将在后续迭代中得到改善。

答案 2 :(得分:1)

这很大程度上取决于执行渲染的浏览器。 IE6可能相当慢(虽然传输1,000行大量HTML标记并将其注入文档也不会很快)。

这是Chrome 9中的1,000行的jsperf benchmark that generates 1,000 rows of 10 columns and renders it. I'm averaging 200-250ms to render

更重要的问题应该是:为什么世界上你一次显示1000行?总有比这更好的用户体验替代品。

答案 3 :(得分:0)

您的模板非常简单,您可能需要take a look at handlebars.js这是一种模板语言,可以选择预编译模板。

它由rails和jquery核心成员Yehuda Katz制作。

答案 4 :(得分:0)

没有人提到胡子。 在2011年底,胡子在流行的模板框架中表现最佳。

http://mustache.github.com/