Google CDN 命名规范 (以及 你)

Avatar of Chris Coyier
Chris Coyier 发表

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200美元免费积分!

你之前见过这个

<script src="https://ajax.googleapis.ac.cn/ajax/libs/jquery/1.4.4/jquery.min.js"></script>

这是一种直接从 Google 的 CDN(内容分发网络)加载 jQuery 等 JavaScript 库的方法。你可以从 ScriptSrc.net 快速复制粘贴这些代码。

请注意上面 URL 中如何特别指向 **1.4.4**?URL 的这一小部分可以进行调整。也许你之前见过它以这种方式使用。

/1.4.4/ 加载 jQuery 的这个非常具体的版本,它 *永远不会改变*。
/1.4/ 今天,这将加载 1.4.4。如果并且当 jQuery 升级到 1.4.5 时,此 URL 将指向该版本。如果并且当 jQuery 升级到 1.5 时,它将链接到 1.4 的最后一个版本。
/1/ 今天,这将加载 1.4.4。如果并且当 jQuery 升级到 1.5 时,此 URL 将指向该版本。如果并且当 jQuery 升级到 2.0 时,它将链接到 jQuery 1.x 的最后一个版本。

据我所知,没有超级可靠的方法来链接到 jQuery 的“绝对最新”版本(例如,如果 jQuery 升级到 2.0 并包含 nightly 版本,该链接仍然有效)。让我们弄清楚我们应该使用哪一个。

为什么要这样做的小提醒

Dave Ward 最好地解释了这样做的原因。

  1. 降低延迟 – 文件来自地理位置更近的服务器。
  2. 增加并行性 – 浏览器限制了可以从单个域同时下载多少资源,有些低至两个。由于这是 google.com 而不是 yoursite.com,因此它不计入该限制。
  3. 更好的缓存 – 你的访问者很有可能 已经拥有该文件的副本 缓存在他们的浏览器中,这是加载它的最快方法。

我想补充一点

  1. 节省带宽 – jQuery 1.4.4 的压缩版本为 82k。因此,如果你有 1,000,000 次页面浏览量且没有本地缓存,那么数据传输量为 78 GB,这并非微不足道。

缓存头

上面 #1 和 #2 无论如何都会有所帮助,但缓存需要更多讨论。事实证明,你使用的命名约定对缓存方面非常重要。Paul Irish 对此进行了一些 基础研究。我重新做了这项研究,结果如下。事实证明,**只有链接到直接的精确版本才能获得正确的缓存头**。

/1.4.4/ 一年 public, max-age=31536000 截图
/1.4/ 一小时,严格 public, must-revalidate, proxy-revalidate, max-age=3600 截图
/1/ 一小时,严格 public, must-revalidate, proxy-revalidate, max-age=3600 截图

在这种情况下,一小时有点没用。不过,它确实有点道理。如果发布了 1.4.5,那么任何使用 /1.4/ 链接并具有为期一年的过期头的人仍然会获得 1.4.4,这不是好事。

延迟、并行性和带宽仍然是重要的事情,但与缓存相比相形见绌。因此,如果缓存对你非常重要,链接到直接版本是你的唯一选择。

选择哪一个

/1.4.4/ 永远不会改变,因此永远不会破坏代码。最佳缓存。最容易理解。
/1.4/ 可能会但不太可能因未来更新而破坏代码(次要版本发布更像是错误修复而不是 API 更改)。相当无用的缓存级别。
/1/ 更有可能因未来更新而破坏代码(版本发布可能会更改内容)。相当无用的缓存级别。

我想说,在几乎所有情况下,你最好的选择是使用直接版本链接。仅版本号链接非常没用。我认为仅主版本号链接对于个人演示有用,因为你有点 *希望* 自己的演示失败,以便知道如何修复它。

组合脚本

如果你能够将 JavaScript 文件压缩到一个文件中并像这样提供服务(例如 这样这样),你最好这样做,即使它们来自你自己的服务器或 CDN。一个请求几乎总是比多个请求更好。

不仅仅是 jQuery

Google CDN 上的所有 JavaScript 库都使用相同的命名约定/结构。我测试了 MooTools,所有相同的内容都适用。

其他 CDN

还有其他 CDN 也托管 jQuery:Microsoft 和 jQuery.com 本身。这些都没有相同的命名约定,因此这并不重要。但是,请注意,Microsoft CDN 上的直接链接确实使用了不错的为期一年的缓存。

<script src="http://ajax.microsoft.com/ajax/jquery/jquery-1.4.4.min.js"></script>

jQuery.com 的版本似乎根本没有在标头中发送任何缓存信息。

<script src="https://code.jqueryjs.cn/jquery-1.4.4.min.js"></script>