不使用公共CDN加载Javascript库是否有好处?

不使用公共CDN加载Javascript库是否有好处?,javascript,cdn,google-cdn,Javascript,Cdn,Google Cdn,我听过所有支持使用CDN的案例,比如为我的web应用程序托管JQuery和Prototype之类的JavaScript库。它更快,节省带宽,允许并行加载脚本,等等。但我最近在道格拉斯·克罗克福德的剧本中看到了以下评论: 使用你自己的副本。从您无法控制的服务器加载代码是极不明智的 我很好奇他的论据是什么,是专门针对像谷歌这样的公共CDN用户还是其他什么?原因是,如果你所依赖的服务器坏了,而你的服务器没有坏。网站的体验会受到影响。有一些方法可以让回退到位,因此如果jquery或其他脚本没有加载,那么

我听过所有支持使用CDN的案例,比如为我的web应用程序托管JQuery和Prototype之类的JavaScript库。它更快,节省带宽,允许并行加载脚本,等等。但我最近在道格拉斯·克罗克福德的剧本中看到了以下评论:

使用你自己的副本。从您无法控制的服务器加载代码是极不明智的


我很好奇他的论据是什么,是专门针对像谷歌这样的公共CDN用户还是其他什么?

原因是,如果你所依赖的服务器坏了,而你的服务器没有坏。网站的体验会受到影响。有一些方法可以让回退到位,因此如果jquery或其他脚本没有加载,那么您可以使用您托管的副本作为备份

另一种情况是,在Intranet应用程序场景中,不应该使用它,因为带宽通常不是问题

从Jon Galloway创建回退的一种方法:


if(typeof jQuery==“未定义”)
{
write(unescape(“%3Cscript src=”/Scripts/jquery-1.3.2.min.js'type='text/javascript'%3E%3C/script%3E”);
}

如果公共服务器的js受到损害(可用性、安全性或缺陷),那么访问您网站的访问者将受到影响,并可能会责怪您。另一方面,与一些较小公司的服务器相比,谷歌CDN受到损害的可能性有多大?当您在本地托管时,您还失去了CDN提供给您的所有缓存优势。

虽然其他一些答案肯定是正确的,但我们有一个稍微不同的/额外的原因

我们有一个过程,在第一次请求时确定,评估任何给定页面所需的静态内容。在后台,这个静态内容(js、css)被合并并缩小为一个文件(1个用于js,1个用于css),然后所有未来的请求都由一个文件提供,而不是多个文件


虽然从理论上讲,我们可以排除可能在CDN上提供服务的文件并使用CDN来处理这些文件,但实际上这比使用CDN更容易(因为我们实际上必须添加代码来处理排除),而且在某些情况下,比使用CDN更快。

jQuery是开源的。如果您对内部进行了修改,那么很明显,您无法托管其他人的服务器。一般来说,托管他人的脚本是一种安全风险;他们可以在不告诉你的情况下更改脚本,而现在你正在将其链接到页面上


这是信任的问题;您是否相信无论何种CDN都会安全,不会在您想要的脚本位置托管恶意脚本?

基本上,这是一个信任问题。您需要信任主机不会更改托管文件中的任何内容,并且需要信任文件的可用性。你能绝对确定URL不会改变吗?服务器的任何宕机都会导致应用程序的宕机,您对此感到满意吗?

假设他说的是像谷歌这样的专业托管CDN,那么最好的办法就是这样做:

<!-- Grab Google CDN's jQuery, with a protocol relative URL; fall back to local if necessary -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.js"></script>
<script>window.jQuery || document.write("<script src='js/libs/jquery-1.5.1.min.js'>\x3C/script>")</script>

window.jQuery | | document.write(“\x3C/script>”)
(摘自)

这样,你就可以获得所有的好处,如果谷歌的CDN崩溃,你的网站也不会有崩溃的风险

但是,他说:

使用你自己的副本。这是非常重要的 从您的服务器加载代码是不明智的 不要控制

我不认为他说的是CDN。我想他只是在说“不要随意链接网站上的脚本”


您不希望这样做,因为网站可能会更改脚本的位置,甚至更改脚本。CDN永远不会这样做。

除了所有其他答案之外:

您需要担心通过SSL(即https)为您的页面提供服务,但是您的JS通过来自不同来源的直接http提供服务。浏览器可能会抱怨(有时会以令人担忧的方式)安全和不安全的项目


此外,使用noscript扩展(或类似扩展)浏览的用户需要允许JS从多个不同的源运行。如果你正在使用一个主要的CDN(很有可能他们在过去的某个时候会允许),这没什么大不了的,但是你需要担心他们只允许你的一些JS。

现代答案:是的,可用性

其他人的服务器(不管是公共CDN还是一些随机的不起眼的站点)可能会宕机,从而破坏你的应用程序的可用性

CDN也可能受损,导致您的应用程序执行有害代码,但此问题可以通过子资源完整性(SRI)来缓解

如果您将其托管在自己控制的服务器上,则它将在整个应用程序不可用的同时变得不可用,而不是在其他人控制下的任意时间

使用公共CDN有折衷,在某些情况下可能值得(例如,为了节省带宽)


integrity=“sha256-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”
crossorigin=“匿名”>

谷歌倒闭了。jQuery破坏了一半的web。有史以来最好的一天。单点故障越多,失败的可能性就越大。使用像谷歌API这样的CDN和来自不可靠来源的东西有很大区别。JavaScript的宿主可以随时更改脚本的内容,例如开始向您的网站用户传播恶意软件。当然,这种事情不会(希望)发生在更可信和可靠的服务上,比如谷歌API。此外,如果出于某种原因远程托管脚本不可用,它可能会破坏您网站上的整个功能。您确实需要小心链接脚本的位置。回退是一种很好的技术,但只会保护您免受使用您无法控制的服务器的危险之一。你仍然有可能遭到妥协或破坏
<!-- Grab Google CDN's jQuery, with a protocol relative URL; fall back to local if necessary -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.js"></script>
<script>window.jQuery || document.write("<script src='js/libs/jquery-1.5.1.min.js'>\x3C/script>")</script>