[ISSUE-0052] ext-context-guard import-time 自启¶
用户截图(v0.10.71):chrome://extensions 错误面板出现 -
TypeError: Failed to fetch@chunks/ext-context-guard-*.js:48-[object Object](非 Error 对象)
病灶¶
main.tsx 旧版:
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App'; // ← import 触发 React/App 全树加载
import { installContextGuard } from '@/utils/ext-context-guard';
import './style.css';
installContextGuard(); // ← line 8 才装 listener
React/App import 链可能在 line 8 之前触发某个 fetch(auth-provider cookie 登录尝试 / 远端配置 / 心跳等)。这些 fetch reject 时 listener 还没装好 → rejection 漏到 chrome 默认 handler → 出现在错误日志。
虽然 v0.10.52 ISSUE-0034 加了 suppress 网络错误的逻辑,但 suppress 只对 listener 装好之后 的 rejection 生效。
修¶
1. ext-context-guard.ts 改 import-time 自启¶
function doInstall() {
if (installed) return;
installed = true;
// ... 装 listener
}
// IIFE:import 时立即装
doInstall();
// 向后兼容
export function installContextGuard() { doInstall(); }
2. 4 个 entry main.tsx 第一行 import¶
// v0.10.72 ISSUE-0052:必须第一行 import — listener import-time 自启
import '@/utils/ext-context-guard';
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import './style.css';
涉及:main/、popup/、settings/、results/ 4 个 entry。
3. 顺便处理 [object Object] 类型 rejection¶
// 非 Error Object 类型(chrome.runtime.lastError 等)— 防 [object Object] 冒出
if (reason && typeof reason === 'object' && !(reason instanceof Error) && !reason.stack) {
console.warn('[ext-context-guard] suppressed non-Error rejection:', reason);
e.preventDefault();
}
为什么这次能根治¶
| 时序 | v0.10.71 | v0.10.72 |
|---|---|---|
main.tsx line 1: import 'ext-context-guard' |
(不在 line 1) | ext-context-guard.ts 顶层 IIFE 立即装 listener ✓ |
后续 import React/App 期间 fetch reject |
没人接 → 冒到 chrome 错误日志 | 已装好的 listener 拦截 + preventDefault ✓ |
main.tsx line 8: installContextGuard() |
listener 才装好 | 已装好(重复调安全) |
audit_grep¶
- pattern: "import\\s+\\{\\s*installContextGuard\\s*\\}"
description: "新代码不应再 import 函数 — 直接 `import '@/utils/ext-context-guard'` 即自启"
用户清错误日志¶
修复后已产生的错误不会自动消失。用户要:
- 升级到 v0.10.72
chrome://extensions/→ 找扩展 → 点 "错误" 看板- 点 "全部清除" 把历史错误清掉
- 重 reload 扩展
- 之后不该再有 Failed to fetch 冒出
相关¶
- [[0034-failed-to-fetch-leak-to-chrome-err-log|0034-Failed-to-fetch-冒到chrome扩展错误日志]] — 上一轮修(v0.10.52 加 suppress,但 listener 装得晚)
- 修bug全字典扫描 — 4 个 entry 全字典改 import 顺序