我有一个服务工作者可以捕获我的页面请求(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 安装,所以视频请求没有被捕获,因此失败。但是当您重新加载页面时(不清理缓存),它被成功捕获,并且工作人员成功加载了视频(其检查器中的 HTTP 200),但由于某种原因,主页抛出net::ERR_FAILED
.
而且我无法手动读取/流式传输它,因为它来自不同的来源,导致“不透明”响应类型:http ://www.w3.org/TR/service-workers/#cross-origin-resources
更新:更新到 Chrome 42,现在的错误是HTTP 400 Service Worker Fallback Required (from ServiceWorker)
. 奇怪的是,源代码(第 510 行)表明它只应在缺少 CORS 标头时引发,但这里的模式是no-cors
.