一种方法是创建我所说的“窗口代理”......
假设您想在您使用new Worker('at.yourCDN.com/worker.js')
. 该工作人员可能是一个 SharedWorker,它允许您在同一域上的不同选项卡保持共享状态。也许您希望这个工作人员也可以访问不同域上的所有选项卡。换句话说,您希望将工作人员用作服务/服务器平台。
问题:您不能指向位于不同域或使用文件协议的 Worker()/SHAredWorker()。
这就是我本周要测试的内容:
- 为您的 SharedWorker() 提供一个专用位置,例如 CDN 或来自 file:// 协议。
- 使用新窗口或 iframe 打开此位置。
- 使与该工作人员的所有交互都通过此窗口或 iframe 进行交互,然后将消息转发给工作人员——此窗口/iframe 可能只是 DOM 中的一个脚本标签,它可以拉动工作人员,也可以是内联工作人员。
详细信息:只需让任何需要访问此工作人员的窗口/选项卡运行 a myWindow.postMessage('my message')
,然后让工作人员运行myWindow
a port.postMessage(myMsg)
。
就像我说的,我还没有测试过这个,但我希望这会有所帮助。
此外,我正在寻找一个正在运行的无头浏览器,或者一个带有 CORS 的“永远服务器”,以希望减轻这么多的 iframe-injection 和 window.postMessageing。
当我找到解决方案时,我会回复。
************************************ EDIT ************************************
我研究了如何使用 a 共享状态SharedWorker
,不仅适用于同一域上的多个选项卡,而且还可以在多个域之间共享状态 - 使用SharedWorker
作为本地托管服务。这不是一个解决方案,但这里是演示如何从FileReader
API 构建工作器的代码:
//DOM 代码:
<b>1</b>
<input id="uploadImage" type="file" name="myPhoto" onchange="onSelect();" autofocus="true" />
<script>
var fReader = new FileReader();
fReader.onload = function(e){
var blob = new Blob([e.target.result], {type: 'text/javascript'});
var blobURL = URL.createObjectURL(blob);
var w = new SharedWorker(blobURL);
w.port.onmessage = function(e){
console.log('%%^', e);
};
w.port.start();
w.port.postMessage('Echo');
};
function onSelect(e){
var file = document.getElementById("uploadImage").files[0];
var dataURL = fReader.readAsText(file);
}
</script>
//桌面上工人文件的代码:
var ports = ports || [];
self.onconnect = function(e){
var port = e.ports[0];
ports.push(port);
port.addEventListener('message', function(e){
port = e.target;
ports.forEach(function(p){
p.postMessage('gWorker:: ' + e.data);
});
}, false);
port.start();
};
可能的解决方案:
就 CDN-Worker 而言,似乎我们不能使用FileReader
/因为它们会在本地BlobBuilder
创建我们自己的. 似乎我们不能用作启用的服务器,可以通过 来推销工作代码,但是创建一个失败的“ ” ,我们已经见过太多了。worker object
heap
CORS
CORS
XMLHttpRequest
new Worker('http://from.mycors.com/enabled/server')
DOM Exception 18
SecurityError
最好的解决方案可能是上面详述的“Window-Proxy”方法(iframe.postMessage()
在具有自己的工作人员的另一台服务器上的 iframe 上,window.onmessage
将消息转发给工作人员)。请注意,如果您计划利用 http 以外的其他 Internet 协议,window.postMessage 将使用 http。
或者,有些人求助于运行google-chrome --allow-file-access-from-files
——但这对于生产场景来说显然是有风险的。
另一种途径是为 WebRTC 架构创建一个集合点,这可能是最健壮的。
我希望这可以为您节省大量不必要的研究,并激发更好的解决方案。
干杯,