我受够了复制报错去问 AI,花一下午给控制台做了个调试助手
æåå¤äºå¤å¶æ¥éå»é® AIï¼è±ä¸ä¸åç»æ§å¶å°åäºä¸ªè°è¯å©æ
kyriewen 2026-08-18 0 é 读7åéè±ä¸ä¸ååäºä¸ª Chrome æä»¶ï¼ä»»ä½é¡µé¢ä¸ç console æ¥éèªå¨æè·ï¼ä¸é®ææ¥éã宿´å æ ã页é¢ä¸ä¸ææå æä¸ä»½è½ç´æ¥ä¸¢ç» AI çæé®ï¼é 个 APIï¼è¿è½è®© AI å¨é¡µé¢å³ä¸è§ç´æ¥ç»åºè¯æãå çå¾ï¼è¿æ¯å®å¨æèªå·±å¼å页ä¸è·çæ ·åï¼ä¸¤æ¡ warn æ¯é¡µé¢åç¹èæ¬èªå·±æçï¼æåºæ¥é£ä¸å»å°±è¢«é®ä½äºï¼
å®å ·ä½è½å¹²å
åè½æå¼è¯´ï¼
- æè·åç§ä¿¡å·ï¼
console.errorãconsole.warnãæªæè·å¼å¸¸ãPromise rejectionã页é¢ä¸æå°å°±è¿å表ï¼ä¸ç¨å¼ devtools ç¯çã - æ¯æ¡æ¥éä¸ä¸ªæé®ï¼ãçæ AI æé®ãæéè¯¯ä¿¡æ¯ + 宿´å æ + 页é¢å°å + æ¥éç±»åç»è£ æç»æåæé®ï¼å¤å¶å°åªè´´æ¿ï¼ãå æ ãç¹å»å±å¼å ¨æï¼ãAI ç´è¿è¯æãæä½ é ç AI æ¥å£ï¼ç»è®ºç´æ¥åºå¨é¢æ¿éã
- æ´ä¸ª UI å¥å¨ Shadow DOM éï¼æå¨ä»»ä½é¡µé¢å³ä¸è§ï¼ä¸å页颿 ·å¼ã
éç¹æ¯ç¬¬ä¸ä¸ªãå®çæçæé®é¿è¿æ ·ï¼ä¸é¢å¾é飿¡ warnï¼ç¹ä¸ä¸å¤å¶åºæ¥çï¼èéï¼ï¼
æå¨å端éå°ä¸ä¸ªæ¥éï¼è¯·å¸®æå®ä½åå å¹¶ç»åºä¿®å¤æ¹æ¡ã
## é误信æ¯
parseImageXUrl "tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg6Iy25bqV5LiW55WM5LmL5LiL:q75.awebp" parse error
## è°ç¨å æ
at console.overrideMethod (chrome-extension://fmkadmapgofadopljbjfkapdkoienihi/build/installHook.js:1:174822)
at console.<anonymous> (https://lf-web-assets.juejin.cn/obj/juejin-web/xitu_juejin_web/9bb69b6.js:4:2273597)
at console.m (https://lf-web-assets.juejin.cn/obj/juejin-web/xitu_juejin_web/9bb69b6.js:4:2252589)
at push.Ct._hook.window.console.<computed> [as error] (https://lf-web-assets.juejin.cn/obj/juejin-web/xitu_juejin_web/9bb69b6.js:4:1722126)
## 页é¢ä¸ä¸æ
- URL: https://juejin.cn/
- ç±»å: ERROR
- è§¦åæ¬¡æ°: 11 次ï¼å·²èªå¨åå¹¶é夿¥éï¼
è¦æ±ï¼å
è§£éç´æ¥åå ï¼åæå¯è½æ§ä»é«å°ä½ååº 3 ä¸ªæ ¹å ï¼æåç»æå°ä¿®å¤ä»£ç ã
æ¿è¿ä¸ªå»é®ï¼ååªç²ä¸å¥ãdocument.cookie è¦åãå»é®ï¼åçè´¨éæ¯ä¸¤åäºã
AI ç´è¿è¯æï¼è¿å¤å¶è¿æ¥é½çäº
ãçæ AI æé®ãè¿è¦æå¨ç²è´´ä¸æ¬¡ãç´è¿è¯ææè¿æ¥ä¹çäºï¼é¢æ¿éç¹ãAPI 设置ãï¼å¡«ä¸ä¸ª OpenAI å ¼å®¹æ¥å£ï¼baseãkeyãmodel ä¸ä¸ªæ¡ï¼ï¼ç¶å对任æä¸æ¡æ¥éç¹ãAI ç´è¿è¯æãï¼ç»è®ºç´æ¥åºå¨æ¥éæ¡ç®ä¸æ¹ã
请æ±ä¸èµ°é¡µé¢ãcontent script éç´æ¥ fetch ä¼è¢«é¡µé¢ç CORS æ¦ä½ï¼æä»¥è¯·æ±æ¾å¨æä»¶ç background service worker é转åï¼é¡µé¢å®å ¨æ æã
宿µææï¼æäºä¸æ¡ç宿¥éç¹ä¸å»ï¼
ç»è®ºå ç§å°±åºæ¥ï¼ç´æ¥åå æ¯ parseImageXUrl æ¿å°äºéæ³ç URL å符串ââtplv-xxx.awebp è¿ç§åèè·³å¨ç³»ç§æèµæºæ è¯ç¬¦ï¼ä¸æ¯ç URLï¼æ ¹å ç¬¬ä¸æ¡ç´æ¥ç¹å°ä¸å¡ä»£ç ææ è¯ç¬¦å½ URL ä¼ è¿äºè§£æå½æ°ï¼è¿æé³ãç«å±±å¾åºè¿ç§å
·ä½æ¥æºé½ç¹äºåºæ¥ãè¿ä¸ªå
·ä½ç¨åº¦ï¼åªç²ä¸å¥æ¥éæ¯é®ä¸åºæ¥çââ宿´å æ å页é¢ä¸ä¸æé½å¨æé®éã
è¿çè¿æä¸¤ä¸ªé¦æµææ´é²çå°é®é¢ï¼é¡ºæä¿®äºï¼è¯æç»æåæ¬æ¯åå§ææ¬ï¼** å ## å
¨é²çï¼ç»å®å äºä¸ªè½»é Markdown 渲æï¼è®¾ç½®è¡¨åä¿åå䏿¶èµ·ï¼å ç颿¿ï¼æ¹æä¿å峿¶èµ·ã
å个çå®è¸©çå
代ç éä¸å¤§ï¼400 è¡ï¼æå没è±å¤å°æ¶é´ï¼æ¶é´å ¨è±å¨åä¸ãè¿åä¸ªåæ²¡æä¸ä¸ªæ¯è¢«æåé¢è¦çï¼å ¨æ¯è·èµ·æ¥ææ´é²ã
åä¸ï¼æä»¶é»è®¤çä¸è§é¡µé¢ç consoleã
第ä¸ç注å
¥å®è·èµ·æ¥ï¼ä¸æ¡é½æè·ä¸å°ãåå æ¯ Chrome ææä»¶èæ¬å页é¢èæ¬å
³å¨ä¸¤ä¸ªæ¿é´éï¼é¡µé¢èªå·±è°ç console.errorï¼æä»¶èæ¬å¨å¦ä¸ä¸ªæ¿é´éå¬ä¸è§ã
è§£æ³æ¯å¨ manifest é声æè¿ä¸ªèæ¬è·è¿é¡µé¢èªå·±çæ¿é´ï¼MV3 éå« world: "MAIN"ï¼ï¼
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["injected.js"],
"run_at": "document_start",
"world": "MAIN"
}
]
è¿äºé¡µé¢çæ¿é´ï¼åæ¸ä¸å°æä»¶ APIï¼æè·ç»æè¦ç¨ postMessage ä¸è½¬åå»ãè¿éè¿æä¸ªæåï¼postMessage æ¯å¹¿æï¼é¡µé¢èªå·±çèæ¬ä¹è½ååæ ¼å¼çæ¶æ¯ï¼ä¸æ ¡éªæ¥æºå段ï¼å«äººå°±è½å¾ä½ 颿¿éå¡åæ¥éã
æç« å¼å¤´é£å¼ å¾å°±æ¯ä¿®å¤åçææï¼é¡µé¢æå°çé£ä¸å»å°±è¢«é®ä½ï¼ä¸ç¨å¼ devtoolsã
åäºï¼å æ è¢«æªæäºã
宿µæ¶æè·æ£å¸¸ãå¤å¶æ£å¸¸ï¼ç¹å¼å æ åªè½çå°ä¸é¨åãæ¥ä¸æ¥æ¯ä¸¤ä¸ªåå å å ï¼æè·æ¶ææå æ æªæå¨ 2000 å符ï¼é¢æ¿éååªç»äº 140px é«ã对è°è¯å·¥å ·æ¥è¯´å æ å°±æ¯å½èï¼æå ³é®çé£ä¸å¸§å¾å¾å¨ç¬¬ 2000 å符åé¢ã
ä¿®å¤ï¼æªæä¸éæå° 6000ï¼å æ åºåç¹å»å±å¼å ¨æã
åä¸ï¼å䏿¡æ¥éï¼å表éå·äº 16 æ¡ã
æ¿ä¸ä¸ªå¸¸å»ç页颿µè¯ï¼é¢æ¿éé½å·å·ä¸æä¸æ¨¡ä¸æ ·çæ¥éã页é¢éä¸ä¸ªå½æ°æç»åºéï¼è§¦åäº 16 æ¬¡ï¼æå°±èèå®å®è®°äº 16 æ¡ï¼å表被å®å 满ï¼çæ£è¦ççæ°æ¥éå ¨è¢«æ·¹æã
ä¿®å¤æ¯å å»éï¼çº§å«åå 容é½ç¸åçæ¥éåå¹¶æä¸æ¡ï¼æ¬¡æ°ç´¯å ï¼æ¶é´åå æ æ´æ°ææè¿ä¸æ¬¡ï¼æ¡ç®æè¾¹æ¾ç¤º ÃNãå¾½ç« ä¸çæ°åæ¹ææ»è§¦å次æ°ï¼å表åªçå¯ä¸æ¡ç®ï¼è· DevTools ç使ç¨ä¹ æ¯å¯¹é½ã
ååï¼åä¸ä¸ªé¡µé¢åè·¯ç±ï¼æ¥éä¸ç´å ã
è·åä¸å䏿¶é´åç°çï¼é¡µé¢æ¯ SPAï¼å¨ä¸å tab ä¹é´æ¥ååï¼æ§è§å¾çæ¥éä¸ç´çå¨å表éï¼åå ä¸åè¡¨å ¨æ¯ä¸ä¸å±çè¿ææ¥éã
ä¸å¼å§æ³å¨ content script éçå¬è·¯ç±ååï¼åç°è¡ä¸éï¼æä»¶èæ¬åé¡µé¢ JS æ¯é离çï¼é¡µé¢æ¡æ¶ï¼React Router / Vue Routerï¼èªå·±è°ç history.pushStateï¼æä»¶è¿è¾¹æ¦ä¸å°ãæä»¥è¿æ®µé»è¾åªè½ä¹æ¾è¿è·å¨é¡µé¢æ¿é´éçæ³¨å
¥èæ¬ï¼å
ä½ history ç pushState å replaceStateï¼åçå¬ popstate å hashchangeï¼URL ä¸å就广æä¸æ¡æ¶æ¯ï¼é¢æ¿æ¶å°åæ¸
空å表ã
è¿æä¸¤ä¸ªå°åä¸å¥è¯å¸¦è¿ï¼AI ç´è¿å¨ content script éç´æ¥ fetch ä¼è¢«é¡µé¢ CORS æ¦ä½ï¼å¾è®© background service worker 转åï¼é¢æ¿åäº display: flex ä¹å hidden 屿§ä¼å¤±æï¼è¦è¡¥ä¸æ¡å¼ºå¶è§åãé½ä¸é¾ï¼ä½é½æ¯è·èµ·æ¥æåç°ã
ææ¯åä¿®å®ï¼ç¬¬äºè½®å®æµåååºäºä¸ªä½éªé®é¢ï¼æ¬æµ®å¾½ç« ä¸è½æã伿¡å 容ï¼toast é å³å¼¹ï¼æ¥éæ é¢ä¸è¡å°±çç¥ï¼å æ åè¯æä¼åæ¶æå¼ï¼é¢æ¿å¤ªçªï¼åºé¨æ¨¡æ¿æé®æ¢è¡ãéä¸ªæ¹æï¼å¾½ç« 坿æ½ãä½ç½®è®°å¿ï¼æ é¢ç两è¡ï¼å æ åè¯æäºæ¥ï¼é¢æ¿å å®½å° 460pxãè¿äºæ²¡æä¸ä¸ªæ¯ææ¯é¾ç¹ï¼ä½å ¨æ¯ä¸çæ£ç¨èµ·æ¥å°±åç°ä¸äºçé®é¢ãä¿®å®è¿è½®è¿æä¸ä¸è½®ï¼é¢æ¿å±å¼ä¼çä½å¾½ç« ã设置没æåæ¶æé®ãé¿æ¥éçä¸åºè½å±å¼ï¼è¿æ toastââæ¾åªé½è¢«é¡µé¢æ ·å¼å¸¦åï¼è¯äºä¸¤æ¬¡è§å£çº§å®ä½é½æä¸è¿ï¼æåè®¤è¾æ¶è¿é¢æ¿éåºé¨å± ä¸ï¼ä¸æäºãå·¥å ·ç±» side project çæåä¸å ¬éï¼å ¨æ¯è¿ç§æ´»ã
éæ¥è¡¨ï¼å¸¸è§æ¥éæä¹é® AI
æé®æ¨¡æ¿æ¯è¿æä»¶éæææ»¡æçé¨åï¼ç´æ¥æï¼
| æ¥éç±»å | æé®æ¨¡æ¿ |
|---|---|
| TypeError: Cannot read properties of undefined | ãå æ å¦ä¸ï¼ååºæ°æ®é¾æå¯è½æè£ç 3 个ä½ç½®ï¼æå¯è½æ§æåºã |
| Uncaught (in promise) | ãè¿ä¸ª rejection 没被æè·ï¼å®ä½è°ç¨é¾ä¸ç¼ºå¤±ç catch æé误边çã |
| Failed to fetch / CORS | ã帮æåºåæ¯å端没起ã代çé ç½®è¿æ¯é¢æ£å¤±è´¥ã |
| React 鿏²æè¦å | ãæ¾åºè§¦åå¾ªç¯æ´æ°ç state å effect ä¾èµã |
| æ°´å/渲æä¸ä¸è´ | ãååºæå¡ç«¯å客æ·ç«¯æ¸²æç»æä¸ä¸è´çå¸¸è§æ¥æºã |
颿¿éè¿å ç½®äºä¸ä¸ªä¸è½è¿½é®ï¼è¿ç±»é误æä¹å¨ ESLintãåæµãCI éæåæ¦æªï¼æä¸æ¬¡æ¥éåæä¸æ¬¡é²çº¿å级ã
å å¥å®è¯
400 è¡ä»£ç 大é¨å䏿¯ææçï¼æåºå³çï¼AI åºä»£ç ãä½å个åââçä¸è§ consoleãå æ æªæãéå¤å·å±ãè·¯ç±ç´¯ç§¯ââæ²¡æä¸ä¸ªè¢«æåé¢è¦ï¼å ¨æ¯å®æµæ´é²çã
å代ç è¶æ¥è¶ä¾¿å®ï¼éªè¯çææ¬ä¸å鱿²¡éã
ä¸ä¸çæ³åæè·å¼å ³åææ¥éç±»åè¿æ»¤ãä½ æè¿è¢«ä»ä¹æ¥éæç£¨å¾æå¤ï¼è¯è®ºåºè´´ä¸ä¸ªï¼å¼å£°æé«çå½ä¸çç´ æã
Aitishiku.com