我听说过所有支持使用像Google API这样的 CDN来为我的 Web 应用程序托管像 JQuery 和 Prototype 这样的 JavaScript 库的案例。它更快、节省带宽、允许并行加载脚本等等。但我最近在 Douglas Crockford 的json2.js脚本中看到了以下评论:
使用您自己的副本。从您不控制的服务器加载代码是非常不明智的。
我很好奇他的论点可能在这个断言背后,以及它是否专门针对像谷歌这样的公共 CDN 的用户,还是其他什么?
我听说过所有支持使用像Google API这样的 CDN来为我的 Web 应用程序托管像 JQuery 和 Prototype 这样的 JavaScript 库的案例。它更快、节省带宽、允许并行加载脚本等等。但我最近在 Douglas Crockford 的json2.js脚本中看到了以下评论:
使用您自己的副本。从您不控制的服务器加载代码是非常不明智的。
我很好奇他的论点可能在这个断言背后,以及它是否专门针对像谷歌这样的公共 CDN 的用户,还是其他什么?
假设他说的是像 Google 这样的专业托管 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 永远不会这样做。
基本上,这是一个信任问题。您需要信任主机不会更改托管文件中的任何内容,并且您需要信任文件的可用性。你能绝对确定 URL 不会改变吗?您对他们的服务器的任何停机时间都会导致您的应用程序停机这一事实感到满意吗?
原因是,如果您依赖的服务器出现故障,而您的服务器没有。您的网站体验会受到影响。有一些方法可以进行回退,所以如果 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>
如果公共服务器的 js 受到威胁(可用性、安全性或错误),那么您网站的访问者将受到影响并可能责怪您。另一方面,Google 的 CDN 受到某些较小公司服务器的威胁的可能性有多大?当您在本地托管时,您还会失去 CDN 为您提供的所有缓存优势。
虽然其中一些其他答案肯定是有效的,但我们有一个稍微不同/额外的原因。
我们有一个流程,可根据第一次请求确定任何给定页面所需的静态内容。在后台,此静态内容(js、css)被合并并缩小为单个文件(JS 为 1 个,CSS 为 1 个),然后所有未来的请求都使用单个文件而不是多个文件提供服务。
虽然理论上我们可以排除可能在 CDN 上提供的文件并使用 CDN,但实际上它更容易(因为我们实际上必须添加代码来处理排除项),并且在某些情况下,比使用 CDN 更快。
jQuery 是开源的。如果您对内部进行了修改,那么显然您无法托管其他人的服务器。一般来说,托管其他人的脚本是一种安全风险;他们可以在不告诉您的情况下更改脚本,现在您将其链接到您的页面上。
这是一个信任问题;您是否相信任何 CDN 都不会在您想要的脚本位置托管恶意脚本?
除了所有其他答案:
您想担心通过 SSL(即 https)为您的页面提供服务,但您的 JS 通过来自不同来源的直接 http 提供服务。浏览器可能会抱怨(有时以惊人的方式)关于安全和不安全的项目。
此外,使用 noscript 扩展(或类似扩展)浏览的人需要允许 JS 从多个不同的源运行。如果您使用主要的 CDN,这没什么大不了的(因为他们可能在过去的某个时候允许这样做),但是您需要担心他们只允许您的 JS 中的一部分。
现代答案:是的,可用性
其他人的服务器(无论是公共 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>