使用CDN for jQuery(或其他静态文件/脚本)真的是一个好主意吗?

Can*_*ğlu 11 javascript cdn

它说无处不在使用CDN,如谷歌或微软的AJAX CDN来加载静态脚本库,比如jQuery.

我不明白这对如何让我的网站更快有所帮助.在萤火虫中,当我加载jQuery时,我在谷歌和微软AJAX服务器上都有大约300毫秒,而在Chrome中,我得到了大约100毫秒(不知道是什么创造了差异,没有下载,尝试了几次,但无论如何这不是重点),我的网站在部署时的响应时间估计平均为30到40毫秒.如何加载CDN对我的网站有用的文件?它会让一切变得更糟!

据我所知,当我使用Google的CDN中的jQuery访问许多网站时,它必须在很长一段时间内"下载"该脚本一次,但我的浏览器仍然尝试连接到Google的服务器,并要求脚本文件,然后接收304未修改的状态代码.在200ms的往返(Chrome和FF的平均值)期间,我等待.但是如果我自己托管脚本文件,那么它将(下)加载MUCH更快,大约五次,这是用户体验的一个重要因素.也许200毫秒不是一个非常大的交易,但它仍然是一个区别,我想知道为什么建议使用CDN而不是自己托管文件.最后,在一次性加载之后,浏览器也将缓存我的网站的脚本,如果我使用CDN,浏览器将向CDN询问脚本,这将落后于我的网站.

更新:我来自土耳其,这可能是进行高往返的主要原因.我的大多数访问者都来自这里,所以我想要对在土耳其服务器托管的网站以及我的网站用户也在土耳其使用CDN 有益.绝对不适合往返,但也许我错过了一些东西.

T.J*_*der 16

两部分答案:

  • 你不应该看到304s
  • 但这是个好主意吗?

你不应该看到304s

据我所知,当我使用Google的CDN中的jQuery访问许多网站时,它必须在很长一段时间内"下载"该脚本一次,但我的浏览器仍然尝试连接到Google的服务器,并要求脚本文件,然后接收304未修改的状态代码.

它不应该,如果它尊重Cache-Control标题:

Cache-Control:public, max-age=31536000

...从资源上的日期开始,浏览器可以将其缓存长达一年.无需任何HTTP请求在所有(这就是我在Chrome中看到,除非我强迫它,没有要求在所有的,只是一个"从缓存中"字条说,打开Firefox,并确保萤火虫是在为所有页面,来到StackOverflow是很长一段时间以来第一次使用Firefox [我只用于测试],果然,它根本没有发出任何jquery请求.

例如,304响应可能需要200ms,但如果您的浏览器正确缓存,则从缓存加载将为0ms.

我在强制请求中看到的完整相关标头集是:

Cache-Control:public, max-age=31536000
Date:Wed, 17 Aug 2011 21:56:52 GMT
Expires:Thu, 16 Aug 2012 21:56:52 GMT
Last-Modified:Fri, 01 Apr 2011 21:23:55 GMT

...所以我的浏览器不应该再用这个路径近一年了.

请参阅下面的@Dave Ward的评论:要获得最大缓存结果,请使用完整版本号,例如:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js'></script>
<!--                               very specific ---^^^^^                      -->
Run Code Online (Sandbox Code Playgroud)

而不是

<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js'></script>
<!--                               very generic ----^                      -->
Run Code Online (Sandbox Code Playgroud)

好的,但这是个好主意吗?

这完全取决于你.即使有这样的后备:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js'></script>
<script>
if (typeof jQuery === "undefined") {
    document.write("<scr" + "ipt src='/my/local/jquery.js'></scr" + "ipt>");
}
</script>
Run Code Online (Sandbox Code Playgroud)

......或者类似的,如果CDN关闭,用户体验将会很糟糕.浏览器将试图连接多年.如果CDN迅速回复失败,这种后备只会有所帮助,这是不太可能的.

这意味着如果Google的CDN出现故障,您必须快速调整所使用的内容,以便使用本地副本.因此,在服务器级别进行故障转移以开始使用本地路径提供页面时,防御这种情况将成为一种监控工作(Google的服务器;不要过度使用或者他们会感到不满).(或微软的道路,基于谷歌和微软可能没有共享基础CDN技术的理论,考虑到它们相处得如何.)

对我来说,大多数网站的答案可能是:继续使用CDN,当Google的图书馆CDN出现故障时做出反应.另一方面是:如果您对从服务器上加载的整体页面加载性能感到满意,那么这样做几乎没有什么害处,除非流量足够大,以至于您希望从事物中获得最后一点性能.但很多(很多很多)网站都依赖谷歌的CDN,如果网站发生故障,你的网站将会因为失败而远非一个人......

  • 需要注意的一点是,如果使用除特定1.nn引用之外的任何内容(即使是新的点发布 - 1.n.​​0),缓存也会受到严重限制.一个常见的错误是引用最新的点发布,比如1.6而不是1.6.2,它将本地缓存窗口降低到接近零. (4认同)