在HTML中嵌入Web工作代码的html5rocks解决方案相当可怕。
一团转义的JavaScript-as-a-string也好不到哪里去,尤其是因为它使工作流程复杂化(闭包编译器不能对字符串进行操作)。
就个人而言,我真的很喜欢toString方法,但@dan人那个正则表达式!
我的首选方法:
// 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 );
支持是这三个表的交集:
但是,这不适用于 SharedWorker,因为 URL 必须完全匹配,即使可选的“name”参数匹配也是如此。对于 SharedWorker,你需要一个单独的 JavaScript 文件。
2015年更新 - 服务工人奇点到来
现在有一种更强大的方法可以解决这个问题。同样,将工作代码存储为函数(而不是静态字符串),并使用 .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
这种方法的优点是:
- 还可以支持共享工作程序。
- 选项卡可以在固定地址共享单个缓存副本。Blob 方法会为每个选项卡增殖随机对象 URL。