【问题标题】:template.find() vs document.querySelector vs jquery vs template.$ performance in Meteortemplate.find() vs document.querySelector vs jquery vs template.$ Meteor 的性能
【发布时间】:2016-01-23 02:44:38
【问题描述】:

我知道在 Meteor 中使用 template.find() 或 template.$ 搜索 DOM 比使用 document.querySelector() 或 jQuery 搜索所有 DOM 更快。但是不知道快了多少。 我想这将与应用程序的 DOM 节点的数量直接相关,但我不知道是否是这种情况,或者 Meteor 中是否有任何其他优化/降级使得这个假设不那么成比例。 有人知道这方面的性能测试/结果吗?

【问题讨论】:

    标签: performance meteor meteor-blaze


    【解决方案1】:

    template 不等于 document。一个document 可以包含许多templates。 template.find abstracts $,但 template.find 没有添加任何功能。所以template.$ 和template.find 将或多或少地表现相同。 $ 是jQuery 的常见别名,当您将单个字符串传递给jQuery 函数时,它将经过更多抽象,可能 登陆document.querySelector。这就是document.querySelector is a lot faster than jQuery 的原因(jsperf 现在已经关闭,所以我不能告诉你快多少)。 jQuery 慢得多,在大多数情况下,它可能会在 document.querySelector 和 template.$ 之间接近。

    您将获得最佳性能,方法是获取包裹目标的节点,然后使用本机 DOM 函数。如果模板中有包装元素,则可以使用 template.firstNode 属性。否则你可以做 blaze 所做的事情:template.firstNode.parentElement。然后我会使用getElementsByClassName 或getElementById。它们比querySelector 更快,因为使用querySelector 必须首先解析查询。至少在大多数情况下,这取决于您的包装节点中的节点数以及您搜索的元素在树内的距离。

    【讨论】:

    • 你是对的。我使用 jperf 来查看这些 DOM 遍历差异有多大。从你所说的我想,通过使用 template.$ 查询首先完成,然后才将结果传递给 jQuery 对象,而不是相反。此外,您建议不在文档上而是在 template.firstNode 上使用本机 getElementByClassName(我不在元素中使用 ID)。但这不会搜索我认为的兄弟姐妹,所以我必须将我的模板元素包含在一个 div 中,例如?
    • template.$ 通过抽象层执行$。它被隐藏了deep inside blaze。所以它很慢。搜索我找到了一个替代包装div 艰难。看看我的last revision。另外,回答你的问题:正确。
    • @PauloJaneiro 我发现 blaze 使用_domrange.parentNode 作为$-selector 的上下文。这意味着template.$ 的范围等于template.firstNode.parentElement。 So I updated my answer
    • 感谢您的调查!我认为这对应用质量非常重要,但我做得不对,最糟糕的是,直到昨天我才停下来思考。
    【解决方案2】:

    我不能说我注意到我的用户有任何真正的性能提升,但我会说 template.find() 似乎在我的编码方式上给了我性能提升。

    例如

    var someID = $('#some-id');
    

    在我添加这样的数组槽之前将无法管理:

    var someID = $('#some-id')[0];
    

    在哪里

    var someID = template.find('#some-id')
    

    只返回那个 html 元素,这意味着我不必每次都将它视为一个数组。

    【讨论】:

    • 关于 Array 的事情.. Meteor 只是执行 jQuery 并返回 [0]。 Source code。我知道它更好一点,但它需要 jQuery 的整个可链接性。在我看来,这是它唯一的好处。
    • 我也有这个问题。然后仔细查看文档(Meteor 和 jQuery),我发现这正是使用 template.$(selector) 的优势之一,特别是在使用类作为选择器时:将搜索范围缩小到模板我得到的只是元素希望它可以正常工作,并且我可以应用与使用 jQuery 完全相同的 jQuery 方法。当我使用 jQuery 时,有时我会得到更多具有相同类的其他元素,我会遇到同样的问题。
    • 谢谢 Paulo,是的,确切的问题是我不能将 jQuery 方法应用于它。很高兴知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 2021-02-27
    • 2013-10-18
    • 2015-09-30
    • 2018-02-21
    相关资源
    最近更新 更多