2014-02-20 44 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