跳转至

[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'` 即自启"

用户清错误日志

修复后已产生的错误不会自动消失。用户要:

  1. 升级到 v0.10.72
  2. chrome://extensions/ → 找扩展 → 点 "错误" 看板
  3. "全部清除" 把历史错误清掉
  4. 重 reload 扩展
  5. 之后不该再有 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 顺序