通过CDN或minifiy / concat加载资源并为自己服务?

时间:2015-06-22 15:54:29

标签: javascript css minify bundling-and-minification

当提供静态css / js / etc资源时,可以选择使用cdn或使用自己的服务器。

使用CDN,您可以包含许多内容,但它们已经可以缩小。 或者,您可以将所有文件缩小并连接成一个css包和一个js包。

哪种方法更有效/更高效?为什么会出现这种情况?

2 个答案:

答案 0 :(得分:2)

有趣的问题。我会说这取决于。

使用CDN 可能比使用自己的服务器慢。这主要是因为CDN驻留在另一个域上,因此对资产的每个请求都将导致额外的DNS往返。这可能会导致整个操作变得比使用您自己的服务器提供的速度更慢。也就是说,在一次性DNS查询惩罚之后,DNS往返很大程度上变成了无问题;然后,速度取决于其他网络因素 - CDN的拥塞程度,客户端与CDN节点之间的距离(相对于您的服务器)。

使用CDN的价值只会在您的网站增长时变得明显 - 并且您的服务器在流量过大时开始窒息。 CDN可用于卸载所有静态请求并防止它们命中您的服务器。如果您的服务器带宽有限并且您正在提供大型文件,则此功能尤其有用。如果您计划扩展,CDN几乎是必需的。

CDN还可以帮助将您的内容传播到距离世界其他地方更近的客户端。因此,如果您没有遍布多个大洲的服务器,CDN可以帮助为更广泛的受众提供快速访问。这是因为CDN通常从最靠近客户端的节点提供内容。

总而言之,您是否应该使用外部CDN取决于以下因素:

  • 您网站中的静态文件有多大?
  • 您的服务器有多少带宽?
  • 您的服务器在哪里?
  • 您的网站目标受众是什么?
  • 你需要多少流量?

我说大多数时候,选择CDN是一个更好的选择,但有些情况下“单独进行”是合理的。根据我的经验,与即使是适度的AWS或GCE servlet相比,免费的CDN也不是那么快速。网络速度也非常难以预测,偶尔会有滞后(最多几秒) - 这可能是因为周期性的DDos攻击导致CDN忙碌。对于不期望高流量的小型站点,简单地通过自己的服务器提供文件通常会更快,特别是如果您主要为本地流量提供服务。

无论CDN与否,您都应该始终缩小和连接文件。不要费心将各个库文件分开。您可能经常听到的错误承诺:如果用户访问了碰巧使用同一CDN中相同库文件的其他站点,则他的浏览器已经缓存了该文件,并且您将保存HTTP回合获取该文件的旅行请求。

可悲的是,往往不会发生这种情况。即使使用最流行的JS库jQuery,它也很少发生。由于网站是在不同时间开发的,因此在部署中有太多不同版本的jQuery。此外,不同的网站使用不同的CDN --Akamai,CloudFlare,Amazon CloudFront,cdnjs,MaxCDN,列表继续......实际上很少有人使用相同的CDN和完全相同的库文件找到两个热门网站。

所以,如果你没有连接文件,希望偶尔的浏览器缓存命中(你保存了什么 - 28KiB?),你就会产生每个文件的HTTP请求开销。我想说,只需继续将所有JS连接成一个大文件,包括jQuery和所有其他供应商库 - 它会在99%的时间内更快。

答案 1 :(得分:1)

在我看来,使用CDN更有效率,因为您将受益于并行性:当您的服务器将提供主要内容时,请求将并行发送以提供来自CDN的内容。