Javascript 是否可以使用Service Worker API缓存整个HTML5视频以供脱机使用?
我有一个离线应用程序,可以缓存所有静态资源。目前,仅缓存前15秒的视频资源 下面显示了Javascript 是否可以使用Service Worker API缓存整个HTML5视频以供脱机使用?,javascript,html,browser-cache,service-worker,Javascript,Html,Browser Cache,Service Worker,我有一个离线应用程序,可以缓存所有静态资源。目前,仅缓存前15秒的视频资源 下面显示了install和fetch事件侦听器的基本实现 服务人员: self.addEventListener('install', event => { event.waitUntil( caches.open('v1').then(cache => { return cache.addAll([ '/', '/videos/one.mp4',
install
和fetch
事件侦听器的基本实现
服务人员:
self.addEventListener('install', event => {
event.waitUntil(
caches.open('v1').then(cache => {
return cache.addAll([
'/',
'/videos/one.mp4',
'/videos/two.mp4'
]);
})
);
});
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request).then(response => {
if (response) return response;
return fetch(event.request);
});
);
});
在index.html
<video controls preload>
<source src="/videos/one.mp4" type="video/mp4">
</video>
我使用以下步骤在第一页加载时完成脱机视频,而无需先观看整个视频
'/'
。如果检查服务工作者的fetch
事件,您将看到后续请求也被缓存fetch
API请求视频作为blob
const videoRequest = fetch('/path/to/video.mp4').then(response => response.blob());
videoRequest.then(blob => {
...
});
IndexedDB
API存储blob
。(使用IndexedDB
而不是LocalStorage
,以避免在存储时阻塞主线程。)html
和blob
提供服务
index.html
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
</head>
<body>
<h1>Service Worker Test</h1>
<p>Try reloading the page without an Internet connection.</p>
<video controls></video>
<script>
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/service-worker.js').then(registration => {
console.log('ServiceWorker registration successful with scope: ', registration.scope);
}).catch(error => {
console.log('ServiceWorker registration failed: ', error);
});
});
} else {
alert('serviceWorker is not in navigator');
}
</script>
<script>
const videos = {
one: document.querySelector('video')
};
const videoRequest = fetch('/path/to/video.mp4').then(response => response.blob());
videoRequest.then(blob => {
const request = indexedDB.open('databaseNameHere', 1);
request.onsuccess = event => {
const db = event.target.result;
const transaction = db.transaction(['videos']);
const objectStore = transaction.objectStore('videos');
const test = objectStore.get('test');
test.onerror = event => {
console.log('error');
};
test.onsuccess = event => {
videos.one.src = window.URL.createObjectURL(test.result.blob);
};
}
request.onupgradeneeded = event => {
const db = event.target.result;
const objectStore = db.createObjectStore('videos', { keyPath: 'name' });
objectStore.transaction.oncomplete = event => {
const videoObjectStore = db.transaction('videos', 'readwrite').objectStore('videos');
videoObjectStore.add({name: 'test', blob: blob});
};
}
});
</script>
</body>
</html>
资源:
self.addEventListener('install', event => {
event.waitUntil(
caches.open('v1').then(cache => {
return cache.addAll([
'/',
'/videos/one.mp4',
'/videos/two.mp4'
]);
})
);
});
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request).then(response => {
if (response) return response;
return fetch(event.request);
});
);
});