不使用公共CDN加载JavaScript库有什么好处?

7
我听说使用CDN(如Google APIs)来托管JavaScript库(如JQuery和Prototype)对于我的Web应用程序是有利的。它更快,节省带宽,允许脚本的并行加载等等。但是最近我在Douglas Crockford的json2.js脚本中看到了以下评论:

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

我很好奇他背后的论点是什么,以及它是否专门针对像Google这样的公共CDN的用户,还是其他原因?

3
谷歌崩溃了。jQuery打破了一半的网站。史上最好的一天。你拥有的单点故障越多,失败的可能性就越大。 - Raynos
使用像Google API这样的CDN和来自不可靠来源的东西之间存在重大差异。该JavaScript的主机可以在任何时候更改脚本内容,例如开始向您网站的用户传播恶意软件。当然,这种事情不会(希望)发生在更值得信赖和可靠的服务(如Google API)上。此外,如果由于某种原因远程托管的脚本不可用,则可能会破坏您网站的整个功能。您确实需要小心从哪里链接您的脚本。 - Niklas
8个回答

10

假设他说的是像谷歌这样的专业托管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>

(摘自http://html5boilerplate.com/)

这样做,你就能享受所有好处,而不必担心如果Google的CDN出现问题会导致你的网站崩溃。

但是,他说:

  

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

我认为他实际上并不是在谈论CDN。我认为他只是在说“不要从随意的网站热链接脚本”。

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


回退是一种不错的技术,但只能保护您免受使用不受控制的服务器时的某些危险。您仍然有可能会提供被破坏或损坏的脚本。 - jball

2
基本上,这是一种信任问题。你需要相信主机不会更改托管文件中的任何内容,并且你需要相信文件的可用性。你能绝对确定URL不会更改吗?你是否感到舒适,他们服务器的任何停机都会导致你的应用程序停机?

0
如果公共服务器的js被攻击(可用性、安全或漏洞方面),那么访问您网站的用户将受到影响,并且很可能会责怪您。另一方面,相比于某些较小公司的服务器,Google CDN被攻击的几率有多大?当您本地托管时,您还会失去CDN提供的所有缓存优势。

0

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

我们有一个流程,在第一次请求时确定所需的静态内容以用于任何给定页面。在后台,这些静态内容(js、css)被合并和压缩成单个文件(1个JS文件,1个CSS文件),然后所有未来的请求都将使用单个文件而不是多个文件。

虽然理论上我们可以排除可能在CDN上提供的文件并使用CDN来处理它们,但实际上这样做更容易(因为我们实际上需要添加代码来处理排除),在某些情况下比使用CDN更快。


0

jQuery是开源的。如果你对它的内部做了修改,那么很明显你不能从另一个人的服务器上托管它。通常来说,托管其他人的脚本存在安全风险;他们可能会在不告知你的情况下更改脚本,然后你就将其链接到你的网页上。

这是一个信任问题;你相信CDN是否安全,不会在你想要的脚本位置托管恶意脚本吗?


0
除了其他答案之外:
您需要担心通过SSL(即https)提供页面,但是从不同来源的直接http提供JS。浏览器可能会抱怨(有时以令人震惊的方式)有关安全和非安全项目。
此外,使用noscript扩展程序(或类似扩展程序)浏览的人需要允许从多个不同来源运行JS。如果您使用主要CDN,则问题不大(因为它们很可能在过去的某个时候已经允许了),但是您需要担心他们是否仅允许部分JS。

我之前确实遇到过那个烦人的SSL问题。幸运的是,谷歌现在在他们的CDN上使用https了。 - Jonathan
我看到的所有公共CDN(除了bootcdn.cn)都支持https。 - sgoblin

0

现代答案:是的,可用性

其他人的服务器(无论是公共CDN还是一些随意的不知名站点)可能会崩溃,破坏您的应用程序的可用性。

CDN也可能被攻击,导致您的应用程序执行有害代码,但这个问题可以通过子资源完整性(SRI)来减轻。

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

使用公共CDN存在权衡,并且在某些情况下可能值得(例如,为了节省带宽)。

<!-- best -->
<script src="your_own_server/framework.js"></script>

<!-- second-best (using public CDN) -->
<script src="https://public-cdn.example/framework.js">
        integrity="sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
        crossorigin="anonymous"></script>

<!-- do not use -->
<script src="https://random-server-without-cors.example/framework.js"></script>

0

原因是,如果您依赖的服务器崩溃了,而您的服务器没有崩溃,那么您的网站体验会受到影响。有一些方法可以设置备用方案,以便在jquery或其他脚本无法加载时,您可以使用您自己托管的副本作为备份。

另一个不应该使用它的时间是在Intranet应用程序场景中,带宽通常不是问题。

从Jon Galloway创建回退的方法:http://weblogs.asp.net/jgalloway/archive/2010/01/21/using-cdn-hosted-jquery-with-a-local-fall-back-copy.aspx

<script type="text/javascript" src="http://ajax.microsoft.com/ajax/jquery/jquery-1.3.2.min.js"></script>
<script type="text/javascript">
if (typeof jQuery == 'undefined')
{
    document.write(unescape("%3Cscript src='/Scripts/jquery-1.3.2.min.js' type='text/javascript'%3E%3C/script%3E"));
}
</script>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接