我很好奇他背后的论点是什么,以及它是否专门针对像Google这样的公共CDN的用户,还是其他原因?使用您自己的副本。从您无法控制的服务器加载代码是极其不明智的。
我很好奇他背后的论点是什么,以及它是否专门针对像Google这样的公共CDN的用户,还是其他原因?使用您自己的副本。从您无法控制的服务器加载代码是极其不明智的。
假设他说的是像谷歌这样的专业托管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永远不会这样做。
虽然其他答案都是正确的,但我们有一个稍微不同/额外的原因。
我们有一个流程,在第一次请求时确定所需的静态内容以用于任何给定页面。在后台,这些静态内容(js、css)被合并和压缩成单个文件(1个JS文件,1个CSS文件),然后所有未来的请求都将使用单个文件而不是多个文件。
虽然理论上我们可以排除可能在CDN上提供的文件并使用CDN来处理它们,但实际上这样做更容易(因为我们实际上需要添加代码来处理排除),在某些情况下比使用CDN更快。
jQuery是开源的。如果你对它的内部做了修改,那么很明显你不能从另一个人的服务器上托管它。通常来说,托管其他人的脚本存在安全风险;他们可能会在不告知你的情况下更改脚本,然后你就将其链接到你的网页上。
这是一个信任问题;你相信CDN是否安全,不会在你想要的脚本位置托管恶意脚本吗?
现代答案:是的,可用性
其他人的服务器(无论是公共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>
原因是,如果您依赖的服务器崩溃了,而您的服务器没有崩溃,那么您的网站体验会受到影响。有一些方法可以设置备用方案,以便在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>