【问题标题】:Reduce HTTP requests or not?是否减少 HTTP 请求?
【发布时间】:2011-03-07 21:21:35
【问题描述】:

一个理论问题:
我们都知道缩小和组合 javascript 文件以减少 HTTP 请求以加快网站速度的专业人士。但是当使用流行的 javascript 库(例如 jQuery)时,假设这些库已经从另一个页面下载到客户端计算机并不是太愚蠢。

那么应该首选什么? 业内大佬们是怎么处理的?

A) 将每个脚本合并并缩小为一个庞大的脚本,并从我自己的 CDN 中提供。

B) 将所有“自写”脚本合并到一个文件中,并尽可能利用可用的 CDN 库。

谢谢!

【问题讨论】:

    标签: javascript http performance minify


    【解决方案1】:
    • “将每个脚本合并并缩小为一个庞大的脚本,并从 我自己的 CDN 提供它”

      如果您有 CDN,我们在谈论什么? :) 你的意思是服务器,对吧?

    • “业内大佬们是怎么处理的?”

      大人物总是使用自己的服务器。

    • “......假设这些已经从另一个页面下载到客户端计算机并不太愚蠢。”

      不幸的是。事实:

      • 40-60% 的用户拥有 empty cache experience
      • 浏览器的cache limits are small
      • 不同版本的库正在使用中,只有在它们匹配时才会缓存
      • 来自新域的资源创建 DNS 查找,速度很慢
      • +您需要管理依赖项

    【讨论】:

    • 实际引用是“40-60% 的 Yahoo! 的用户 有空缓存体验”。对于任何不是雅虎的网站,这些数字可能非常不同。值得注意的是,yahoo.com 是一个非常常见的浏览器主页。这导致了非常不同的使用配置文件。这给我们带来了最重要的一点:跟踪您自己的统计数据。在您自己衡量之前,您不会知道什么最适合您的网站。
    • “值得注意的是,yahoo.com 是一个非常常见的浏览器主页” - 大声笑。这就是为什么同一用户每天两次访问 yahoo 主页的机会实际上高于用户在其缓存中从完全相同的 CDN 拥有完全相同的库和完全相同版本的机会(并且没有被其他内容取代,因为然后)。
    • 好吧,在这种情况下,我没有区分 CDN 或服务器。应该使用速度最快的存储,并且肯定是CDN。非常感谢您的帖子!
    【解决方案2】:

    我认为这取决于您的网站:

    • 如果您的网站主要由需要相同脚本的相同类型的页面组成,我会选择 A)
    • 如果您有很多与您网站的每个子网站不同的脚本,我会选择 B)。将最常用的脚本组合在一个脚本中。如果您的大型脚本并非在每个页面上都使用,请为其制作单独的脚本。

    真正知道该做什么的最好方法是测试哪种技术组合可以为您节省最多的流量/连接。

    P.S.:我个人不喜欢让其他人为我的网页提供文件的想法,因为如果 CDN 发生故障,但您的服务器仍然存在,会发生什么情况?如果这对您来说不是问题,请尝试从可靠的 CDN 为您使用的所有库提供服务器。

    【讨论】:

    • +1 用于测试并使用真实指标做出选择
    • +1 表示潜在的 CDN 问题。我也时不时地看到这些问题。更糟糕的是,大多数访问者会认为您的网站是垃圾,因为您的 CSS/JS 无法加载。
    【解决方案3】:

    我认为最好的方法是使用缩小的“application.js”文件(包含所有特定于应用程序的 javascript),然后使用诸如 Google AJAX 库 API(找到 here)之类的服务来加载 jQuery、Prototype 等.

    【讨论】:

      【解决方案4】:

      我认为这归结为几件事:

      1. 整个网站有多少网页使用该代码
      2. CDN 的质量
      3. 代码多少

      使用流行的 Javascript 包(如 jQuery)与使用个人包(只有访问过您网站的访问者才会拥有)之间也有区别。

      性能提升可能来自两个地方:1)浏览器缓存和2)dns缓存,即使文件没有存储在本地,dns服务器也有一个路由可以最小化请求时间,甚至临时服务于文件。

      我建议使用 CDN 并在本地托管文件。根据您的资源(硬件/带宽),您可能无论如何都需要使用 CDN。最好使用服务器端调度程序检查 CDN 状态并在适用时重新路由路径。

      另外,请注意一些用户选择关闭浏览器缓存。所以缩小你的 JS 总是一个优点。您应该将您的 JS 分成两个文件:1)加载时需要和 2)加载时不需要。基本上,首先获取必要的代码,以改善感知加载时间。然后加载所有其他附加内容(例如幻灯片、换色器等)。

      最后一点是使用 Expires 标头,因为如果您不对其进行优化,这些都不重要。这将真正降低启用缓存的返回访问者的速度。 YSlow 是一个不错的 Firefox 插件,可以帮助评估您的加载性能。


      回答您的问题:减少 HTTP 请求,但请自行评估 JS 的文件大小。

      (Being Extreme) 你不想要一个 10MB 的 JS 文件,否则你的网站加载时间太长。由于 HTTP 开销,您也不想要 1000 个 10KB 的文件。同样,使用它来说明您希望在文件大小和数量之间取得平衡的观点 - 正如我之前所说,将它们打包成所需的性能和想要的性能。

      【讨论】:

      • 到对象大小点:"我们发现如果组件大小大于25 KB,iPhone的浏览器不会缓存组件。因此,专为iPhone设计的网页应该减少每个组件的大小为 25 KB 或更小,以实现最佳缓存行为。” yuiblog.com/blog/2008/02/06/iphone-cacheability IE6 SP1,最后一个可用于 win2k 的 IE 版本,它也限制了它可以处理的最大 javascript 文件的大小。 IIRC,如果遇到超出限制的 javascript 文件,它会简单地截断它。
      • @Frank 好点,客户端硬件也应该考虑。 @Industrial,您可能希望使用您网站的移动版本,这通常需要较少的 JS 开销。
      • @Frank - 非常感谢您提供有关 iphone 和 IE6 的信息。我们一定会在这个网站上推出移动版,所以您的评论真的很方便!
      • 博客中另一个值得注意的好处是“iPhone 版 Safari 最多可以缓存 19 个外部组件,最大缓存限制在 475 KB 左右。”并且如果您的文件大于 25KB,它不会从当前缓存中弹出任何内容 - 只有被认为可缓存的文件才会取消堆叠当前缓存。此外,Safari 会在缓存之前对文件进行解码,因此 25KB 是解压缩文件的大小(重要的是要知道您是否 gzip 文件)。
      【解决方案5】:

      Omar al Zabir 经营着一个名为 pageflakes 的网站,并有大量关于如何提高性能的文章。 One of them 特别解释了如何在发送到客户端之前在服务器端压缩和组合各种东西。

      您还可以使用 css 图像精灵来减少 HTTP 请求。它们对常用图像有很大帮助。

      *我当然没有庞大的生产站点,但这些东西肯定有助于节省带宽成本。

      【讨论】:

      • 是的,已经知道 sprite,一个非常方便的技术使用
      【解决方案6】:

      特别是关于行业大人物如何处理客户端脚本的问题,您可以随时查看。 stackoverflow.com 似乎很好,依赖于 Google 的 jquery lib 版本。其他人最坚决不....

      【讨论】:

      • IE8 不喜欢 google 的缩小 jQuery 库用于我正在做的图像效果之一。所以不要总是依赖已建立的代码~仍然在不同的浏览器中执行质量检查。
      【解决方案7】:

      获取一个脚本比拆分它更快并没有什么特别的原因。这是因为浏览器并发下载是有限的,但不是一个。

      我认为这个想法应该是首先处理同步 UI 脚本,然后是“用户活动响应”脚本(如验证等)。

      在其他条件相同的情况下,选项 B 看起来是最好的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多