在 HTML 中 Hook fetch
不生效的问题,通常与 Service Worker 的独立运行环境或 Hook 方式有关。以下是可能的原因和解决方案:
1. Service Worker 的独立作用域
- Service Worker 运行在独立的线程中,无法直接访问主线程的全局变量(如
window.fetch
)。 - 现象:你在主页面(HTML)中 Hook 了
fetch
,但 Service Worker 中的fetch
不受影响。
解决方案:
- 在 Service Worker 内部单独 Hook
fetch
:// service-worker.js self.addEventListener('fetch', (event) => { event.respondWith( fetch(event.request) .then(response => { console.log('Intercepted by Service Worker:', event.request.url); return response; }) ); });
2. Hook 方式不正确
- 错误的 Hook:如果直接在 HTML 中覆盖
window.fetch
,Service Worker 不会使用这个覆盖后的版本。 - 正确的 Hook(主线程):
但这种方式仅对主线程生效,不影响 Service Worker。// HTML 或主 JS 文件 const originalFetch = window.fetch; window.fetch = async function(...args) { console.log('Intercepted by Main Thread:', args[0]); return originalFetch.apply(this, args); };
3. Service Worker 未正确注册或更新
- 缓存问题:旧的 Service Worker 可能仍在运行,导致新代码未生效。
- 解决步骤:
- 卸载旧版本:
// HTML 中注销所有已注册的 Service Worker navigator.serviceWorker.getRegistrations().then(registrations => { registrations.forEach(registration => registration.unregister()); });
- 强制刷新浏览器(Chrome:
Ctrl + Shift + R
)。
- 卸载旧版本:
4. 请求被跳过 Service Worker
- 原因:某些请求(如跨域请求或非 HTTP/HTTPS)可能绕过 Service Worker。
- 检查方法: 在 Chrome DevTools → Application → Service Workers → Fetch Events。
5. 验证是否生效
在 Service Worker 脚本中添加日志,确认它是否正确拦截请求:
self.addEventListener('install', () => console.log('SW Installed'));
self.addEventListener('activate', () => console.log('SW Activated'));
self.addEventListener('fetch', (e) => console.log('Fetch:', e.request.url));
⚠️注意事项
- Service Worker 只能拦截同源请求(除非响应头包含 CORS)。
- HTTPS/本地开发环境(
localhost
)才能注册 Service Worker。
如果问题仍未解决,请提供更多上下文(如代码片段、浏览器控制台日志)。
内容由零声教学AI助手提供,问题来源于学员提问