name: cloud-debug description: 雲平臺(Cloudflare Pages/Vercel/Netlify)前端部署問題系統化除錯——當生產環境出現本地無法復現的bug時使用,綜合 systematic-debugging + ECC harness 方法論 triggers: - "生產環境崩了" - "本地正常部署後報錯" - "Cloudflare Pages 有問題" - "部署後頁面崩潰" - "生產環境獨有的bug" - "removeChild" - "fetch 掛起" - "頁面崩潰"
綜合 superpowers/systematic-debugging + everything-claude-code-harness + Cloudflare Wrangler 的雲平臺專屬除錯框架
NO FIXES WITHOUT EVIDENCE FIRST
沒有日誌的猜測 = 浪費時間。每多一次盲目修復 = 引入新 bug。
removeChild、insertBefore 等)// Level 1: localStorage 持久日誌 — 崩潰不丟失
const LOG_KEY = 'debug_log'
const debugLog: string[] = JSON.parse(localStorage.getItem(LOG_KEY) || '[]')
function dlog(msg: string) {
debugLog.push(`[${new Date().toISOString().slice(11,19)}] ${msg}`)
localStorage.setItem(LOG_KEY, JSON.stringify(debugLog))
}
// Level 2: 全域性異常捕獲
window.onerror = (msg, src, line, col, err) => {
dlog(`GLOBAL: ${msg} at ${src}:${line}`)
}
window.onunhandledrejection = (e) => {
dlog(`REJECTION: ${e.reason?.message || e.reason}`)
}
// Level 3: ErrorBoundary 展示日誌
class ErrorBoundary extends React.Component {
componentDidCatch(err) {
dlog(`CRASH: ${err.message}`)
dlog(`STACK: ${err.stack?.split('\n').slice(0,3).join(' | ')}`)
}
render() {
if (this.state.error) {
return <pre>{debugLog.join('\n')}</pre> // 崩潰頁面直接展示日誌
}
return this.props.children
}
}
小蔥技能站7w4.net每天更新,海量AI技能等你發現。
在以下位置加 dlog():
- 所有 fetch() 呼叫前後(URL、method、status)
- 所有 setState / useState 狀態切換點
- 所有 useEffect 執行點
- 路由導航點
# 源1: Cloudflare Pages Function 日誌
npx wrangler pages deployment tail <deploy-id> --project-name=<name>
# 源2: 直接 curl 測試服務端(排除客戶端干擾)
curl -sv --max-time 10 -X POST "https://<domain>/api/..." -d '{...}'
# 源3: 本地生產構建對比
npm run build && npx vite preview # 或 npx serve dist/
# 源4: Cloudflare 安全設定檢查
# Dashboard → Speed → Optimization(Auto Minify 關掉)
# Dashboard → Speed → Rocket Loader(關掉)
1. 本地 npm run build + npx vite preview → 正常?
YES → 問題在 Cloudflare/部署層
NO → 問題在構建產物
2. curl 直接調 API → 返回正常?
YES → 問題在瀏覽器端(CORS/Bot Detection/指令碼衝突)
NO → 問題在服務端/網路
3. 去掉非同步呼叫,只做 UI 狀態切換 → 正常?
YES → 問題在非同步操作(fetch/await)
NO → 問題在 React 渲染本身
在頁面臨時加一個"跳過所有非同步、只做狀態切換"的按鈕:
<Button onClick={() => { setStep("next"); setMessage("test"); }}>
測試:直接跳轉
</Button>
如果這個按鈕正常工作,說明 React 渲染沒問題,問題在非同步操作。
// 直接調 Supabase → 跨域,可能被 Cloudflare Bot Detection 攔截
fetch('https://xxx.supabase.co/auth/v1/otp', {...})
// 改為同源代理 → 繞過跨域和 Bot Detection
fetch('/api/auth/otp', {...}) // Pages Function 轉發
| 症狀 | 可能根因 | 驗證方法 |
|---|---|---|
| fetch 掛起不返回 | Cloudflare Bot Detection 攔截跨域請求 | curl 同 URL 對比 |
removeChild 崩潰 |
Cloudflare 注入指令碼與 React 衝突 | 關 Auto Minify/Rocket Loader |
| 生產 JS 語法錯誤 | Cloudflare 二次壓縮破壞程式碼 | 關 Auto Minify |
| 頁面白屏 | 靜態資源 404 / SPA 路由未配置 | 檢查 _redirects 檔案 |
| 第三方 API 調不通 | CORS / CSP 頭被 Cloudflare 修改 | 檢查 Response Headers |
Cloudflare Pages 會在瀏覽器端注入 __cf_bm Bot Detection 指令碼,操作 DOM 實現人機驗證。React 的非同步回撥(.then())如果恰好在 Cloudflare 指令碼操作 DOM 的同一幀觸發,React 的 reconciler 會因 DOM 節點已不存在而丟擲 removeChild 錯誤。
證據鏈:
1. 本地生產構建正常(排除程式碼/構建問題)
2. curl 調 Pages Function 返回 200(排除服務端問題)
3. "直接跳轉"按鈕正常(排除 React 渲染問題)
4. await 改為 .then() 無效(非同步回撥仍與 Cloudflare 指令碼衝突)
5. requestAnimationFrame 推遲到下一幀 → 修復(確認是幀內衝突)
| 優先順序 | 方案 | 適用場景 |
|---|---|---|
| 1 | requestAnimationFrame(() => setState(...)) |
DOM 衝突 |
| 2 | 同源 Pages Function 代理 | 跨域 fetch 被攔截 |
| 3 | 移除 StrictMode | React 18 生產環境問題 |
| 4 | 關 Cloudflare Auto Minify/Rocket Loader | JS 被破壞 |
| 5 | 純 REST API 替代 SDK | SDK 注入 iframe/DOM 操作 |
部署到 Cloudflare Pages 之前:
dist/_redirects 存在:/* /index.html 200dist/_headers 存在(如需 CSP).env 變數已設出現生產環境 bug 時:
| superpowers skill | cloud-debug 中的角色 |
|---|---|
systematic-debugging |
四階段流程骨架 |
writing-plans |
測試組計劃編寫 |
requesting-code-review |
修復後獨立審查 |
test-driven-development |
修復前寫失敗測試 |
| ECC 能力 | cloud-debug 中的角色 |
|---|---|
security-scan |
檢查生產環境金鑰洩露 |
harness-audit |
審計部署配置完整性 |
hooks/PostEdit |
每次修改後自動跑 npm run build |
rules/typescript |
確保除錯程式碼不影響型別安全 |
來源: Yuie 專案
yuie.cnCloudflare Pages 部署除錯實戰 驗證日期: 2026-06-18 關鍵發現: Cloudflare Bot Detection 注入指令碼與 React 非同步回撥 DOM 衝突 最小修復:requestAnimationFrame+ Pages Functions 同源代理
這個 Skill 質量紮實,來自真實專案經驗,方法論清晰易上手,程式碼示例可直接使用,對除錯學習很有幫助。它強調先收集證據再動手修,避免盲目試錯,這點很實用。不足是內容覆蓋範圍有限,部分場景的深度指導可以再加強。總體適合需要解決雲端部署除錯問題的開發者使用。