html5rocks在HTML中嵌入web worker代码的解决方案相当糟糕。
而一团转义的JavaScript-as-a-string也不会更好,尤其是因为它使工作流程复杂化(闭包编译器不能操作字符串)。
我个人非常喜欢toString方法,但是@dan-man THAT正则表达式!
我喜欢的方法是:
// Build a worker from an anonymous function body
var blobURL = URL.createObjectURL( new Blob([ '(',
function(){
//Long-running work here
}.toString(),
')()' ], { type: 'application/javascript' } ) ),
worker = new Worker( blobURL );
// Won't be needing this anymore
URL.revokeObjectURL( blobURL );
支持是这三个表的交集:
http://caniuse.com/#feat=webworkers
http://caniuse.com/#feat=blobbuilder
http://caniuse.com/#feat=bloburls
然而,这对SharedWorker不起作用,因为URL必须是精确匹配的,即使可选的'name'参数匹配。对于SharedWorker,您需要一个单独的JavaScript文件。
2015年更新——ServiceWorker奇点到来
现在有一种更有效的方法来解决这个问题。
同样,将工作代码存储为函数(而不是静态字符串),并使用. tostring()进行转换,然后将代码插入CacheStorage中您选择的静态URL下。
// Post code from window to ServiceWorker...
navigator.serviceWorker.controller.postMessage(
[ '/my_workers/worker1.js', '(' + workerFunction1.toString() + ')()' ]
);
// Insert via ServiceWorker.onmessage. Or directly once window.caches is exposed
caches.open( 'myCache' ).then( function( cache )
{
cache.put( '/my_workers/worker1.js',
new Response( workerScript, { headers: {'content-type':'application/javascript'}})
);
});
有两种可能的退路。ObjectURL和上面一样,或者更无缝地将一个真正的JavaScript文件放在/my_workers/worker1.js
这种方法的优点是:
还可以支持SharedWorkers。
选项卡可以在固定地址共享单个缓存副本。blob方法为每个选项卡增加随机objecturl。