哪个更好:公共JavaScript CDN还是自托管的合并JavaScript?

12
我的网页使用了几个JavaScript库,如jquery、jquery-ui、underscore、backbone等一些其他著名的jQuery插件。
现在我面临一个两难的选择,我可以:
1. 使用托管所有这些库的公共CDN。如果用户已经访问过使用同一CDN的另一个站点,则这些脚本可能已被缓存。但由于每个库都是独立的,所以页面需要包含许多脚本标签,因此需要发出许多HTTP请求。 2. 将所有所需的脚本合并为一个文件(包括我的自己的脚本文件)并托管在我的服务器上。只有一个请求可以获取所有内容,但我无法比CDN更快地提供脚本,并且无法利用缓存。
从您自己的经验来看,哪种方法更好?
而我想估计是否有足够的网站使用了所提到的CDN(如果许多知名站点使用它们,那么脚本被缓存的概率就很高),我该怎么调查呢?我尝试通过谷歌脚本src属性进行搜索,但似乎谷歌不会索引它。

1
这个问题主要是基于个人观点的。但是,如果您将它们合并为一个,为什么您认为浏览器不使用缓存呢?当然,在第一次页面加载时不会使用缓存,但是很少有用户从相同的CDN源缓存了您正在使用的所有脚本。 - davidkonrad
@davidkonrad 我明白缓存的工作原理。我指的是之前请求自由缓存的版本。 - NeoWang
1个回答

5
如果只使用1-2个库,一个好的做法是包含CDN版本,并回退到本地版本。这是大多数HTML模板/框架使用的做法,例如:

http://html5boilerplate.com/

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="//myserver/js/libs/jquery-1.8.3.min.js"><\/script>')</script>

然而,您使用了许多库,因此可能存在依赖关系,在页面上具有特定的排序,并且其中一些可能不存在于标准CDN上,因此您仍然需要从服务器中包含一些JavaScript文件。因此,对于您的情况,更好的选择是将所有Javascript代码进行良好的组合/版本控制,生成1-2个文件,例如一个用于库(通常不会被更改),另一个用于您自己的自定义代码(在更改时进行缓存清除)。

1
这个备用方法非常有效。我使用了document.createElement和append到<head>,但这并不能保证脚本执行顺序。Document.write似乎可以工作,至少对于Chrome是这样的。这在各种浏览器中都能工作吗? - NeoWang
那CSS回退怎么样:在CSS标签的onerror回调中使用document.write来写入一个新的<link>,这样可以吗? - NeoWang
1
不,合并不是一个好的解决方案。要考虑用户的缓存。是的,第一次用户请求页面时可能会更快,但他在其他网站上使用时没有库存在他的缓存中。 - tleb

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