如果CDN失败而不使用document.write(),如何加载本地静态文件?

时间:2019-07-03 00:14:49

标签: javascript jquery html twitter-bootstrap cdn

我要完成的事情


我将在局域网上托管一个Web应用程序,最多可容纳50人。局域网之外的任何人都不会访问Web服务器。现在,我有一个使用CDN的Web应用程序,除了其他功能外,还提供了Bootstrap和jQuery。我想让Web应用程序回退到CDN文件的本地静态副本,以防出现问题。


我的问题


  1. 如果我的Web服务器仅由LAN上的用户使用,哪种方法更好:CDN或本地文件?
  2. 如何使用document.write()不使用回退本地文件?

注意:我并不是想仅针对jQuery完成此操作。我想对几个文件执行此操作。


相关的SO问题


我查看了其他数十个问题,这些问题回答了我想做的事情,以下列出了最受欢迎的问题。

  1. Best way to use Google's hosted jQuery, but fall back to my hosted library on Google fail
  2. How to load local script files as fallback in cases where CDN are blocked/unavailable?
  3. Is Google’s CDN for jQuery available in China?


我尝试过的事情


我从问题(1)中实现了以下代码

<!--<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>-->
 <script>
     console.log(window.jQuery) // ==> undefined
     window.jQuery || document.write('<script type="text/javascript" src="{% static "js/jquery-3.4.1.min.js" %}"><\/script>');
     console.log(window.jQuery) // ==> undefined
 </script>

但此解决方案:

  1. 无法加载文档
  2. 使Google Chrome DevTools声明以下内容
[Violation] Avoid using document.write(). https://developers.google.com/web/updates/2016/08/removing-document-write
[Violation] Parser was blocked due to document.write(<script>)

这随后使我想到了标题为A Parser-blocking, cross-origin script is invoked via document.write - how to circumvent it?的SO问题。然后,我尝试实现可接受的解决方案,并像这样将async附加到我的代码中

<script>
   console.log(window.jQuery) // ==> undefined
   window.jQuery || document.write('<script type="text/javascript" src="{% static "js/jquery-3.4.1.min.js" %}" async><\/script>');
   console.log(window.jQuery) // ==> undefined
</script>

但是它仍然无法加载文档,并且再次出现以下错误:

[Violation] Avoid using document.write(). https://developers.google.com/web/updates/2016/08/removing-document-write.


总结


那么实现此目标的正确方法是什么?不使用document.write()怎么办?似乎先前问题的答案现在已经过时。

2 个答案:

答案 0 :(得分:3)

您应该收听 onerror 事件,如果发生,请加载本地事件。
这是一个示例(您应该更改代码以适合您的情况):

<script>
    function onJqueryLoadError()
    {
        document.write('<scr' + 'ipt src="static/jquery-3.4.1.min.js"></scr' + 'ipt>');
    }
</script>
<script src="https://www.cdn/jquery-3.4.1.min.js" onerror="onJqueryLoadError()"></script>

答案 1 :(得分:-2)

  1. 对于使用CDN(IMHO)的LAN上的50个用户来说,这太过分了。 (任何“玩具”网络服务器都足够)。
  2. 任何解决方案都可能是“ hacky”的并且在某种程度上不安全:您是否尝试过通过http请求(例如XMLHttpRequest)提取页面,然后调用eval()?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval

评估可能不是正确的选择(几乎从来没有)。

以下选项之一可能会更适合您: How to load javascript code to an html file at runtime?