2014-02-20 45 views
19

我正在开发一个我想在CDN上托管的库。该库将用于跨多个服务器的许多不同域。该库本身包含一个加载web worker(worker.js)的脚本(现在我们称之为script.js)。执行来自不同来源的网络工作者

加载库本身非常简单:只需将<script type="text/javascript" src="http://cdn.mydomain.com/script.js"></script>标记添加到我想使用该库的域(www.myotherdomain.com)。但是,由于图书馆正在从http://cdn.mydomain.com/worker.jsnew Worker('http://cdn.mydomain.com/worker.js')加载工作人员,我得到一个SecurityException。在cdn.mydomain.com上启用CORS。

对于网络工作者,不允许在远程域上使用web worker。使用CORS不会有帮助:浏览器似乎忽略它,甚至不执行预检检查。

解决方法是执行一个XMLHttpRequest来获取worker的源代码,然后创建一个BLOB url并使用这个url创建一个worker。这适用于Firefox和Chrome。但是,这似乎不适用于Internet Explorer或Opera。

解决方案是将工作人员放在www.myotherdomain.com上或放置一个代理文件(只需使用XHR或importScripts从cdn加载工作人员)。我不喜欢这个解决方案:它需要我在服务器上放置额外的文件,并且由于该库在多台服务器上使用,更新将很困难。

我的问题包括两个parsts的:

  1. 是否有可能对远程出身工人为IE 10+?
  2. 如果是1,那么最好如何处理跨浏览器?

回答

12

对于那些谁发现了这个问题:

YES。

这绝对是可能的:诀窍是利用远程域上的iframe并通过postMessage与它通信。远程iframe(托管在cdn.mydomain.com上)将能够加载webworker(位于cdn.mydomain.com/worker.js),因为它们都具有相同的来源。 iframe可以作为postMessage调用之间的代理。然而,script.js将负责过滤消息,因此只处理有效的工作者消息。

不利的一面是通信速度(和数据传输速度)确实会造成性能下降。

简而言之:

  • 的script.js iframe中追加与src="//cdn.mydomain.com/iframe.html"
  • Iframe.html的上cdn.mydomain.com/iframe.html,执行new Worker("worker.js")并且充当用于从窗口message事件和一个代理worker.postMessage(以及其他方式)。
  • script.js使用iframe.contentWindow.postMessage和窗口中的message事件与工作人员进行通信。 (对多名工人的正确来源和工人身份进行适当检查)
+3

或者您可以自己托管脚本并节省所有这些麻烦...... – 0xcaff

+1

当然,但如果脚本作为提供给其他用户的网站的库的工作人员加载,则这是不可能的,这是该问题的用例。 – MrP