【问题标题】:Removing jQuery for performance reasons justified?出于性能原因删除 jQuery 是否合理?
【发布时间】:2015-12-09 08:55:46
【问题描述】:

我正在进行一个新项目,我们的工作是重写一个在移动设备上存在性能问题的电子商务网站。

我们正在重写基于更面向对象/模块化架构的 javascript,我认为这很棒!但是我的团队负责人说我们应该删除所有 jQuery 调用并用像 domElem.querySelectorAll(query) 这样的 javascript 替换,这样更好表现。我知道 jQuery 会在后台进行某种缓存,这会造成内存问题。

我对此有点怀疑,首先因为它看起来像是一个“过早优化”的案例,也就是说,我们应该先找到瓶颈,然后再重新编写任何东西。其次,我在互联网上没有发现任何说 jQuery 存在严重性能问题的信息。

当前网站确实有很多重叠的 dom 分支查询,我认为这会造成很多冗余。那就是发生了太多的查询,在我们新的架构方法中,我们将对象/模块限制为更少的 dom 查询和更有针对性的 dom 查询,这很棒。这确实需要重写。

但是无论我们是使用 domElem.querySelector(query) 还是 $(domElem).find(query),我都看不出有太多一个区别。我的想法对吗?

【问题讨论】:

  • 这取决于您想要多少功能。 programmers.stackexchange.com/questions/166273/…
  • jQuery 比 querySelector() 慢得多:jsperf.com/queryselector-vs-jquery-2jsperf.com/jquery-vs-document-queryselector 在我的浏览器中慢了 85 到 95%,这是巨大的。
  • 所以慢了两倍。但那是 2 毫秒而不是 1 毫秒吗?我正在寻找视角
  • 您应该比较使用 jQuery 开发网站/应用程序的“性能”(处理跨浏览器一致性和包装有用的方法)和不使用它并且不必重写轮子的相同。大多数时候,比较 CPU 性能对于 javascript 来说是没有意义的。 I understand jQuery does some kind of caching in the background which can create memory issues哪个???
  • 好吧,也许我错了

标签: javascript jquery performance design-patterns


【解决方案1】:

一些测试已经完成here(也检查其他版本)。 here 详细讨论了在 javascript 上使用 jquery 的优缺点。

还想指出jquery doesn't do any caching of selectors

【讨论】:

  • 只是对您发布的测试链接提出问题。 Ops/second 列:是否显示每秒的实际查询调用?
  • @OliverWatkins 是的,它每秒的操作数(该语句执行)。
  • 那么如果在您网站的整个生命周期中您只有大约 200 个查询调用,这不会有任何区别
  • @OliverWatkins 是的,它甚至不会对 2000 次呼叫产生影响,因为差异将不到一秒,用户不会注意到这一点。这就是为什么 AWolf 提到您需要同时考虑功能的优缺点和数量。
【解决方案2】:

由于一直使用 Javascript 框架,我们经常忘记的是 jQuery 不是框架。

显然,如果您使用 jQuery '$' 对象并使用像 getElementById 这样的直接 DOM 方法执行完全相同的单运算符操作,则后者会明显更快,因为 jQuery 本身是用 Javascript 编写的并且有很多背景东西。

但是,作为开发人员,没有什么(除了代码可读性)可以阻止您将 jQuery 与纯 Javascript 结合使用:尽可能使用纯 Javascript,并且只使用提供复杂功能并需要一些时间从头开始编写和优化的 jQuery 函数。 jQuery 中有很多这样的功能:提供独立于浏览器的 css、序列化对象以及做很多其他很酷的事情。

这取决于应用程序,但通常性能问题与设计不当的算法有关,而不是使用 jQuery。

在任何情况下,如果您的应用程序进行了大量的 DOM 操作,那么使用纯 Javascript 重新编写并进行测试可能是值得的。保留库,只是不要将它用于没有它可以轻松编写的简单操作。

如果您的应用程序严重依赖具有复杂功能的 jQuery 函数,那么删除它是不可能的。

我自己使用这种组合方法:用 Javascript 和 jQuery 函数编写的所有简单的东西,用于难以实现的东西。

此外,如果应用程序在性能方面存在问题,那么挖掘的好地方是 DOM 操作。与 Javascript 中的几乎所有其他操作相比,这些操作非常繁重。您可以通过将多个操作合并为一个、使用一个构造函数构建完成的对象而不是创建空的对象并一个一个地分配属性等方式来缩短时间。

抱歉,如果答案有点模糊,但在这种情况下如果不查看代码和运行测试就很难准确。

【讨论】:

    【解决方案3】:

    让我引用鲍勃叔叔关于这次讨论的话说"Architecture is about intent, we have made it about frameworks and details"

    需要谨慎考虑过早的优化。

    • 它们通常会导致难以恢复的架构决策。
    • 他们引入了通常特定于他们解决的问题的代码优化,这使得代码不那么抽象,因此难以 维护,并且更复杂,因此容易出现更多错误。
    • 它们往往带有偏见且不客观,有时无法与其他替代方案进行真正的比较。
    • 他们试图解决的问题往往被高估,到了不存在的程度。

    我不是 Web 开发方面的专家,但如果可能,您应该始终通过关注点分离和良好的抽象将此类决策推到最后。

    例如,在生成 java-script 代码的部分上,您可以拥有 JavaScriptWriter 的抽象,并使用不同的框架。 这样你可以在开始使用JQuery,测试系统,然后才更换你知道效率低下的部分。

    【讨论】:

    • 是的,我认为优化应该总是在最后进行。
    猜你喜欢
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    相关资源
    最近更新 更多