要让 Service Worker 拦截所有来自 HTML 静态资源的请求,你需要在 Service Worker 中使用 fetch
事件进行拦截。以下是一个简单的示例,展示如何设置 Service Worker 来拦截所有网络请求,并对特定类型的请求(如 HTML、CSS 和 JavaScript 文件)做出响应。
示例代码
- 注册 Service Worker(通常在你的主 JavaScript 文件中):
if ('serviceWorker' in navigator) {
window.addEventListener('load', function() {
navigator.serviceWorker.register('/sw.js').then(function(registration) {
console.log('Service Worker registered with scope:', registration.scope);
}).catch(function(error) {
console.error('Service Worker registration failed:', error);
});
});
}
- 编写 Service Worker 逻辑(创建
sw.js
文件):
self.addEventListener('install', (event) => {
// 可以在这里预缓存静态资源
});
self.addEventListener('activate', (event) => {
// 清理旧的缓存等工作
});
self.addEventListener('fetch', (event) => {
// 检查是否是 HTML、CSS 或 JS 请求
if (event.request.destination === 'document' ||
event.request.destination === 'style' ||
event.request.destination === 'script') {
event.respondWith(
fetch(event.request).then((response) => {
// 你可以在这里处理响应,例如:修改响应内容或返回缓存的版本等。
return response;
}).catch(() => {
// 网络请求失败时,可以提供离线页面或其他备用方案
return caches.match(event.request);
})
);
}
});
注意事项
范围控制:确保你的 Service Worker 注册时具有适当的作用域,以便拦截你希望监控的所有请求。默认情况下,Service Worker 的作用域与它的位置有关。例如,如果你的 Service Worker 位于根目录
/sw.js
,它将拦截整个站点下的所有请求。调试模式:记得在浏览器中打开开发者工具,查看 Console 和 Network 标签,以帮助调试和确认你的 Service Worker 是否正常工作。
Caching 策略:根据需要实现不同的缓存策略,比如 “Cache First” 或 “Network First”,以优化用户体验和性能。
HTTPS 和 localhost:请确保你在 HTTPS 环境下测试或使用 localhost,因为服务工作者只允许在安全上下文中运行。
更新机制:你可能还需要实现更新机制,以处理新的服务工作者版本并有效管理客户端。
通过以上步骤,你就可以使用 Service Worker 拦截来自 HTML 静态资源发出的所有请求了!
内容由零声教学AI助手提供,问题来源于学员提问