2012-07-05 250 views
3

我在网站上使用CDN(maxcdn.com)作为js,css和图像。我注意到,从某些ISP那里,这些资源要么完全无法加载,要么加载非常缓慢。但是,从我的服务器本地静态服务始终正常工作。因此,我希望能够检测到这些资源加载失败并回退到本地服务。处理从CDN加载资源的失败或缓慢。

我在这里找到了几种用于检测js和css加载失败的解决方案。最常见的是使用嵌入式js(位于脚本和链接标记之前,之后)检查css中的某些js var和某些cssRules。然而,这不允许:

  1. 检测加载速度慢(后备应尽快检测缓慢启动...)
  2. 检测加载失败从CSS中引用图片。

有没有简单,优雅的方式来检测资源加载失败/缓慢,并迅速回落到本地服务?

+2

http://stackoverflow.com/search?q=cdn+fallback – Andreas 2012-07-05 10:38:04

+0

@Andreas我找过类似的问题,找不到解决方案:他们无法检测到_slow_正在加载资源,只有完全失败(这可能会发生在长时间待定) – 2012-07-05 12:15:30

+0

@ raina77ow看到上面的评论 – 2012-07-05 12:15:45

回答

2

如此处所述https://stackoverflow.com/a/2021325/745190开始载入脚本后无法禁用脚本。

您可以尝试从cdn开始加载一个非常小的(.1kb)脚本。在非常短的时间内测试该脚本,如果它下载使用javascript将其他脚本标记附加到您的页面,如果它不是不必要的小文件下载。

不幸的是,这种方法有两个主要缺点。首先是对cdn有一个额外的查询,其次是未能完全加载小脚本可能导致浏览器轮子继续旋转。

如果您不确定测试是这样的:

/* tiny-file.js */ 
var window.speedTest = true; 

/* The test */ 
setTimeout(function(){ 
    if (window.speedTest !== true) { 
     //append local javascript 
    } 
    else { 
     //append cdn javascript 
    } 
}, 50); 
+0

这是如何回答检测失败图像负载的问题? – 2012-07-09 19:17:41

+0

我假设问题是连接到cdn,而不是任何单个内容的下载速度。您需要检查相对速度是多少,您可以像使用脚本标记一样方便地将图像添加到JavaScript中。 – thelastshadow 2012-07-10 14:59:00

+0

无法检查它是否缓慢或失败。尽管我会给它超过50ms,但这是一个很好的解决方案! – 2012-07-12 08:11:25

1

我怀疑你的问题将主要与一些ISP发生。

如果您的主要目标是在保持CDN作为主要解决方案的同时实现业绩,我可以看到两个选项。首先,您尝试识别失败的ISP,但它可能会很长并且很昂贵。 另一种选择是“学习”。尝试从CDN加载一个简单的JS设置变量。如果失败,您可以认为存在问题。设置一个cookie并在下一页加载时使用它来自动加载主服务器上的所有内容。

+0

如何处理js var test成功通过时图像无法加载的情况? – 2012-07-16 10:15:38

+1

我会做相反的事情:在加载一组已知图像之前设置一个变量*,然后在“加载”事件中减小它。然后可以使用超时读取变量并决定要做什么。 – yadutaf 2012-07-16 12:32:17

+0

@jtlebi以及如何将加载事件附加到从css引用的图像(作为某些元素的背景)? – 2012-07-20 08:37:47