我有一个服务工作者,它会捕获页面的请求(fetch
事件),当URL匹配某个特定模式时,它会获取另一个URL并用那个新内容替换响应。
对于文本数据(JS、XML等)或二进制数据(例如图像),它可以完美地工作,但是在处理视频时会出现故障。
我正在使用OSX上的Chrome 41。
以下是我的工作者的简化代码:
self.addEventListener('fetch', function(event) {
var url = event.request.url;
console.log('SW: fetch', url);
if (/\.mp4$/.test(url)) {
url = 'https://vjs.zencdn.net/v/oceans.mp4';
var options = {
credentials: 'include',
mode: 'no-cors'
};
event.respondWith(fetch(url, options));
}
});
这是我 HTML 页面中简化后的代码:
navigator.serviceWorker.register('sw.js').then(function(reg) {
console.info('ServiceWorker registration successful for', reg.scope);
var video = document.createElement('video');
video.src = '/video.mp4';
video.controls = true;
video.autoplay = true;
video.onerror = function(err) {
console.error('Video load fail', err);
}
video.onload = function(data) {
console.info('Video load success');
}
document.body.appendChild(video);
}).catch(function(err) {
console.error('ServiceWorker registration failed:', err);
});
第一次加载页面时,worker被安装,因此视频请求未被捕获,导致失败。但是当您重新加载页面(而不清除缓存)时,它成功被捕获,并且worker成功加载视频(在其检查器中为HTTP 200),但由于某种原因,主页面会抛出net::ERR_FAILED
。
我无法手动读取/流式传输它,因为它来自不同的源,导致“opaque” Response类型:http://www.w3.org/TR/service-workers/#cross-origin-resources
更新:升级到Chrome 42后,错误现在为HTTP 400 Service Worker Fallback Required (from ServiceWorker)
。奇怪的是,源代码(第510行)表明,仅当CORS标头丢失时才会引发此错误,但这里的模式是no-cors
。