在 Web Worker 中 Hook fetch
需要单独处理,因为 Worker 的全局作用域与主线程(HTML)是隔离的。以下是解决方案:
方法:直接在 Worker 中重写 fetch
由于 Worker 有自己独立的全局对象(如 self
),需要在 Worker 脚本内部显式重写 fetch
。
// worker.js
const originalFetch = self.fetch;
self.fetch = async function (...args) {
console.log('Intercepted fetch in Worker:', args[0]);
// 可选:修改请求参数或拦截特定请求
if (args[0].includes('blocked-url')) {
return new Response(null, { status: 403 });
}
// 调用原始 fetch
return originalFetch.apply(this, args);
};
// Worker 的其他逻辑...
关键点说明
作用域隔离:
- Web Worker(包括 DedicatedWorker、SharedWorker)运行在独立线程,无法直接访问主线程的变量或 Hook。
- HTML 中的 Hook(如通过
window.fetch
)不会影响 Worker。
不依赖 Service Worker:
- Service Worker 是另一种网络代理方案,但你的需求明确排除它。
动态加载 Worker: 如果 Worker 脚本是动态生成的,可以通过
Blob
+ URL 注入 Hook: “javascript // main.js (主线程) const workerCode =
const originalFetch = self.fetch; self.fetch = function(…args) { console.log(‘Hooked in Worker’); return originalFetch(…args); }; // …其他代码… `;
const blob = new Blob([workerCode], { type: ‘application/javascript’ }); const workerUrl = URL.createObjectURL(blob); const worker = new Worker(workerUrl); “`
- 调试技巧:
- Chrome DevTools → Sources → Workers:可以调试单独的 Worker 脚本。
替代方案(需权衡)
- postMessage + Proxy:
主线程通过postMessage
/onmessage
代理所有来自 Worker 的请求,但会增加通信开销。
如果你的场景有更多约束条件,可以提供详细信息以便进一步优化方案!
内容由零声教学AI助手提供,问题来源于学员提问