如果您正在对网站进行 Web 性能优化 (WPO),也称为前端优化 (FEO),最终最好同时使用这两种技术。他们可以惊人地携手合作。虽然如果我不得不选择一个而不是另一个,我肯定会选择缓存任何一天。事实上,我想说的是,即使您要使用 CDN,也必须为所有 Web 项目设置适当的资源缓存。
缓存
设置Expires 标头和资源缓存是必须的,并且应该在 100% 的时间内为您的资源完成。真的没有理由不做缓存。在 Apache 上,启用 mod_expires.c 和 mod_headers.c 后,这非常容易配置。 HTML5 Boilerplate project 在 .htaccess file 中有很好的实现示例,如果您的服务器是 nginx、lighttpd 或 IIS 之类的其他东西,请查看这些 other server configs。
如果有人有兴趣了解缓存,请阅读以下内容:Mark Nottingham's Caching Tutorial
内容交付网络
您提到了Google Code, jQuery latest, AJAX CDN,我只想简单谈谈 CDN,包括那些您付费并托管自己的资源的 CDN,但如果您只是使用 jquery 托管文件 cdn 或从 http://cdnjs.com/ 加载内容,这同样适用例如。
我想说 CDN 不如设置服务器端标头缓存重要,但 CDN 可以提供显着的性能提升,但您的内容交付网络性能会有所不同depending on the provider。
如果您的流量是全球受众并且 CDN 提供商在全球范围内拥有许多边缘/对等位置,则尤其如此。它还会显着减少您的虚拟主机带宽和 CPU 使用率(一点),因为您将一些工作卸载到 CDN 以交付资源。
在极少数情况下,如果 CDN 的延迟最终比您的服务器慢,那么 CDN 可能会对性能产生负面影响。此外,如果您过度优化并使用过多的parallelization 资源(使用多个子域,如 cdn1、cdn2、cdn3 等),最终可能会降低用户体验并导致额外的 DNS 查找开销。这里需要一个很好的平衡。
另一个可能发生的负面影响是 CDN 出现故障。它已经发生了,而且还会再次发生。免费 CDN 更是如此。如果 CDN 由于某种原因出现故障,您的网站也会出现故障。这是另一个潜在的single point of failure (SPOF)。对于 javascript 资源,您可以变得聪明并从 CDN 加载资源,如果它失败,无论如何,然后检测并加载本地副本。下面是一个从 ajax.googleapis.com 加载 jQuery 的示例,带有后备(取自 HTML5 Boilerplate):
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.8.2.min.js"><\/script>')</script>
除了明显的免费 API 资源(jquery、google api 等)之外,如果您使用 CDN,您可能需要支付使用费,这样会增加托管成本。当然,对于某些 CDN,您甚至必须支付额外费用才能访问某些位置,例如亚洲节点可能比北美节点成本更高。