您使用哪个 CDN 链接到您的 jquery 文件或任何 javascript 文件实际上是否重要。一个可能比另一个快吗?还有哪些其他因素会影响您决定使用哪个 cdn?我知道微软、雅虎和谷歌现在都有 CDN。
17 回答
根据评论更新:
简短版:没关系,但可能取决于他们托管的内容。它们都托管不同的东西:Google 不托管 jQuery.Validate,Microsoft 不托管 jQuery-UI,自 2016 年以来他们托管了!!,Microsoft 提供了原本可以通过它们提供服务的脚本,ScriptResource.axd
并且更容易集成(例如ScriptManager 与 ASP.净 4.0)。
重要提示: 如果您正在构建 Intranet 应用程序,请远离 CDN 方法。谁托管它并不重要,除非您在内部使用非常过载的服务器,否则没有 CDN 可以为您提供比本地 100mb/1GB 以太网更高的性能。如果您将 CDN 用于严格的内部应用程序,则会损害性能。 正确设置缓存过期标头并忽略仅 Intranet 方案中存在的 CDN。
被阻止的机会似乎大致相同,几乎为零。我处理过的合同并非如此,但这似乎是个例外。此外,自从最初发布此答案以来,围绕它的上下文发生了很大变化,Microsoft CDN 取得了很大进展。
我目前正在进行的项目同时使用了最适合我们解决方案的 CDN。有几个因素在其中起作用。按照 HTTP 规范的建议,使用较旧浏览器的用户仍然可能会在每个域中同时发出 2 个请求。对于任何运行任何支持流水线的新东西(每个当前浏览器)的人来说,这都不是问题,但基于另一个因素,我们也正在消除这个限制,至少就 javascript 而言。
我们使用的 Google 的 CDN:
我们使用的微软 CDN:
- 微软Ajax.js
- MicrosoftAjaxWebForms.js(直到 4.0 我们没有完全删除所有更新面板)
- jQuery.Validate.min.js
我们的服务器:
- Combined.js?v=2.2.0.6190 (Major.Minor.Iteration.Changeset)
由于我们构建过程的一部分是合并和缩小所有自定义 javascript,因此我们通过自定义脚本管理器执行此操作,该管理器包括这些脚本的发布或调试(非缩小)版本,具体取决于构建。由于 Google 不托管 jQuery 验证包,这可能是不利的一面。MVC 在其 2.0 版本中包含/使用它,因此您可以完全依赖 Microsoft 的 CDN 来满足您的所有需求,并且所有这些都通过 ScriptManager 自动完成。
唯一要提出的其他论点是 DNS 时间,这在页面加载速度方面是有代价的。 平均而言:仅仅因为它被使用得更多(它的使用时间更长)ajax.googleapis.com
可能会比 更早地被 DNS 返回ajax.microsoft.com
,仅仅是因为本地 DNS 服务器更有可能收到它的请求(这是该地区的第一个用户惩罚) . 这是一件非常小的事情,只有在性能非常重要时才应考虑,精确到毫秒。
(是的:我意识到这一点与我同时使用两个 CDN 是相反的,但在我们的例子中,DNS 时间远被发生的 javascript/阻塞的等待时间所掩盖)
最后,如果您还没有看过它,最好的工具之一是Firebug和一些插件:Page Speed和YSlow。如果您使用 CDN,但由于没有缓存标头,您的页面每次都请求图像,那么您就错过了唾手可得的果实。Firebug 的 Net 面板可以快速为您提供页面加载时间的快速细分,Page Speed/YSlow 可以提供一些很好的建议来帮助您。
您绝对应该为 jQuery 使用 Google CDN(这来自以 Microsoft 为中心的开发人员)。
就是简单的统计。那些会考虑为 jQuery 使用 MS CDN 的人永远是少数。有太多使用 jQuery 的非 MS 开发人员会使用 Google 的,而不会考虑使用 Microsoft 的。由于公共 CDN 的一大优势是改进了缓存,因此在多个 CDN 之间拆分使用会降低获得该好处的潜力。
谷歌会给你一个用他们自己的软件缩小的 jQuery 版本,这个版本比 MS 提供的标准缩小版本轻 6kb。去谷歌吧。
要考虑的一件小事是两家公司都提供略有不同的“额外”库:
- Microsoft 在其 CDN 上提供JQuery 验证库,而 Google 没有 ( http://www.asp.net/ajaxlibrary/cdn.ashx )
- 谷歌在他们的 CDN 上提供了JQuery UI 库,而微软没有 ( http://code.google.com/apis/ajaxlibs/documentation/ )
根据您的需要,这可能是相关的。
还应注意,由于 ajax.microsoft.com 是 microsoft.com 请求的子域,因此发送所有 microsoft.com cookie 会增加获取文件所需的总时间。
此外,ajax.microsoft.com 使用默认的 IIS7 压缩,它不如其他 Web 服务器使用的标准压缩。
http://ajax.microsoft.com/ajax/jquery/jquery-1.4.4.min.js - 33.4K
http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js - 26.5K
此外,正如其他人所提到的,谷歌 CDN 更受欢迎,这大大增加了文件被缓存的机会。
所以我强烈推荐使用谷歌。
这可能无关紧要,但您可以通过一些 A/B 测试来验证这一点。将一半流量发送到一个 CDN,另一半发送到另一个,并设置一些分析来衡量响应。我认为更重要的是能够轻松切换,以防其中一个或另一个出现严重的不可用问题。
我知道我在这里插话有点晚了,但这是我在生产中一直使用的代码。我从来没有遇到过问题,但你的里程可能会有所不同。确保在自己的环境中对其进行测试。
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
!window.jQuery && document.write('<script src="/scripts/jquery-1.4.2.min.js"><\/script>')
</script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/jquery-ui.min.js" type="text/javascript"></script>
<script type="text/javascript">
!window.jQuery.ui && document.write('<script src="/scripts/jquery-ui-1.8.2.min.js"><\/script>')
</script>
一个可能比另一个快吗?
我自己其实对此很好奇,所以我使用以下各项设置了一个 jsbin 测试页面,然后通过webpagetest.org 的视觉比较工具运行它。我测试过:
- ajax.googleapis.com
- 代码.jquery.com
- ajax.aspnetcdn.com
- cdnjs.cloudflare.com
谁是最快的:code.jquery.com在两个测试中都快了 0.1 秒
谁最慢:第一次测试中ajax.aspnetcdn.com慢了 0.7 秒,第二次测试中ajax.googleapis.com 慢了 1 秒
这是第一次测试(每个测试 3 次):
视频: http ://www.webpagetest.org/video/view.php?id=121019_16c5e25eff2937f63cc1714ed1eac814794e62b3
这是第二次测试(另外 3 次):
视频: http ://www.webpagetest.org/video/view.php?id=121019_a7b351f706cad2c25664fee7ef349371f17c4e74
正如Pingdom所说:
当有人访问您的站点时,如果他们已经访问过在同一个 CDN 上使用相同 jQuery 文件的另一个站点,则该文件将被缓存并且根本不需要下载。没有比这更快的了。
这意味着使用最广泛的 CDN 将有优势,这可以为您的网站带来回报。
关于性能的一些观察:Google 的 CDN 在北美和欧洲一直是三者中最慢的。在欧洲,微软的 CDN 是最快的。
我认为这取决于您的目标受众在哪里。您可以使用 alertra.com 从世界各地的许多地方检查 CDN 速度。
另一个考虑因素 - 如果您的站点是 SSL 并且您需要支持 Android 2.1(或更早版本),则 Microsoft CDN 的 HTTPS 版本上的 SSL 证书将导致这些版本的 Android 浏览器崩溃,根据此问题:http://code .google.com/p/android/issues/detail?id=5001。这不是微软的“错”,因为 SSL 证书在技术上是有效的,并且缺陷在于 Android 的 SSL 实现......但它会导致您的网站崩溃。
Google 的 CDN 上的 SSL 证书不违反这个特定问题(与证书的“证书主题替代名称”有关)。
因此,对于 SSL + Android 2.1 支持,请使用 Google CDN。
我的回答与其他人有点不同,如果你需要 jquery 验证器,我会选择微软,如果你使用 jquery,几乎每个人都需要它。
Microsoft CDN http 连接是 Keep-Alive,当您请求多个项目时,这是一个很大的优势。
因此,如果您需要 jquery 验证,请使用 Microsoft CDN,即使您需要 jquery ui 也使用 microsoft,因为 google 不会保持活动状态,因此每个请求都是独立的。所以以这种方式混合是加号的。如果您仅将 microsoft 用于验证器,那么您正在为每个请求与谷歌服务器进行单独连接。
总而言之,它说微软不提供 UI,这是不正确的(不再)。它可以在http://www.asp.net/ajaxlibrary/cdn.ashx下载。
还要考虑在使用 Google CDN 时,有时人们会打错字,例如 ajax.googelapis.com。这可能会造成非常讨厌的 xss(跨站点脚本)攻击。我实际上已经通过注册一个 googlapis.com 错字测试了这一点,并且很快发现自己在为 javascript、maps、css 等提供服务。
我给谷歌发了电子邮件,要求他们注册类似的 CDN 拼写错误 URL,但没有收到回复。这可能是不依赖 CDN 的真正原因,因为有潜在的危险攻击者在等待拼写错误请求,并且可以轻松地使用 xss 有效负载返回 jquery 等。
谢谢
根据应用程序针对的行业,您可能不想使用由其他组织管理的 CDN。它经常引发有关合规性、隐私和保密性的问题。
例如,当您在安全应用程序中包含 Google Analytics 时,浏览器仍将当前 URL 作为“引用”标头发送。任何标识符,比如会话 ID 或秘密令牌都可能出现在他们的日志中。例如,如果 192.0.2.5 的客户端 IP 引用https://healthsystem.example/condition/impotence,那么您可以推断出被认为是相当私密的信息。
其他情况包括后果信息,例如 URL 中的帐号、社会保险号或会话信息。此类数据不应该在 URL 中,因为它可以在应用程序之外使用。
虽然您可能信任 Google、Microsoft 或 Yahoo,但您的用户可能不信任。
对于金融、法律和医疗保健等行业,您可能希望在可以签署 BAA 的供应商(例如 Akamai)的帮助下建立自己的 CDN。
我建议您根据您所定位的用户的大致位置来使用。
如果您的网站面向公众,那么使用 Google 的 CDN 将是一个不错的选择。
如果您的网站也是针对中国的,那么使用微软的 CDN 会是更好的选择。根据我的经验,我知道,因为谷歌的服务器不断被中国政府封锁,导致使用它们的网站无法加载。
*请注意,您可以创建特定区域的站点,例如 cn.mysite.com 专门针对中国,但如果您的资源和时间不足,则值得考虑。
Microsoft CDN 的完整列表在这里。 http://www.asp.net/ajaxlibrary/cdn.ashx
此后,它们已重命名为ajax.aspnetcdn.com,从而降低了被防火墙规则阻塞的可能性。
我会同时使用!
由于 Google Jquery 托管已经存在了很长时间,与 Microsoft 相比,人们已经缓存它的机会要高得多,所以我会先拥有它。
就个人而言,我会使用这样的东西 -
if (typeof jQuery == 'undefined') {
// jQuery is not loaded
document.write("<scr" + "ipt type=\"text/javascript\" src=\"http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js\"></scr" + "ipt>");
}
} else {
// jQuery is loaded
}
(不确定这 100% 是否有效,但我只是要写这个想法而不是示例 - 这引用了 Google 托管的 Jquery 而不是 Microsoft 的,因为我找不到链接)