我的网站应该如何优雅地处理偶尔丢失的javascript文件?

时间:2012-07-31 21:22:47

标签: javascript tags webserver webpage cdn

说我在我的网站上有这个脚本标记(从SO借用)。

<script type="text/javascript" async="" 
      src="http://edge.quantserve.com/quant.js"></script>

如果edge.quantserve.com发生故障或停止响应而未返回404,那么在其余页面加载之前,是否必须等待超时?我认为Chaos Monkey出现并爆炸了我的网站所依赖的服务器,这是一个不属于CDN并且故障转移率很低的服务器。

处理此问题的行业标准方法是什么?我无法在SO上找到欺骗,也许我正在寻找错误的条款。

更新:我应该更仔细地看一下SO代码,底部有这个:

<script type="text/javascript">var _gaq=_gaq||[];_gaq.push(['_setAccount','UA-5620270-1']);
        _gaq.push(['_setCustomVar', 2, 'accountid', '14882',2]); 
_gaq.push(['_trackPageview']);
    var _qevents = _qevents || [];
    (function(){
        var s=document.getElementsByTagName('script')[0];
        var ga=document.createElement('script');
        ga.type='text/javascript';
        ga.async=true;
        ga.src='http://www.google-analytics.com/ga.js';
        s.parentNode.insertBefore(ga,s);
        var sc=document.createElement('script');
        sc.type='text/javascript';
        sc.async=true;
        sc.src='http://edge.quantserve.com/quant.js'; 
        s.parentNode.insertBefore(sc,s);
    })();
    </script>

好的,如果quant.js文件无法加载,则会创建一个ga.async=true;的脚本标记。也许这就是诀窍。

可能的答案:https://stackoverflow.com/a/1834129/30946

3 个答案:

答案 0 :(得分:1)

在服务器上制作文件的副本并使用它。只有当服务器中的副本无法加载时,它才会加载您的副本

<script src="http://edge.quantserve.com/quant.js"></script>
    <script>window.quant || document.write('<script src="js/quant.js"><\/script>')</script>

答案 1 :(得分:1)

一般来说,做好它并跨浏览器是很棘手的。

一些建议:

  1. 将脚本移动到HTML页面的最底部(这样在请求脚本之前几乎所有内容都会显示)
  2. 将其移至底部并将其换入<script>document.write("<scr"+"ipt src='http://example.org/script.js'></scr"+"ipt>")</script>或更新后添加的方式(document.createElement('script')
  3. 最后一个选项是通过XHR加载它(但只有在第三方服务器上启用了CORS时才适用于同域或跨域);然后,您可以使用XHR的timeout属性(对于IE和Fx12 +),在其他浏览器中,使用setTimeout并检查XHR的readyState。现在它有点复杂且非跨浏览器,所以选项2看起来最好。

答案 2 :(得分:0)

要回答有关浏览器在页面其余部分加载之前必须等待加载脚本的问题,答案通常是否定的。典型的浏览器将有多个线程处理页面下载和链接内容(CSS,图像,js)。因此,应该加载页面的其余部分,尽管用户的浏览器指示器仍会显示尝试加载的页面,直到最终请求完成或超时。

根据您尝试加载的资源的性质,这显然会对您的网页产生不同的影响。通常情况下,如果您担心这一点,您可以将所有文件托管在一个普通的CDN(或者您的网站上,如果它不是那么高度被贩运的话),这样至少如果有一件事失败,一切都可能失败,你有一个要解决的更大问题:)