You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发Chrome Extension MV3时Firebase Firestore报XMLHttpRequest未定义错误

解决Chrome扩展MV3中Firestore写入时的XMLHttpRequest未定义错误

问题根源

Manifest V3的背景Service Worker环境移除了对XMLHttpRequest的支持,而你使用的Firebase 8.5版本的Firestore底层依赖XHR进行网络请求,这直接导致了报错。

可行解决方案

1. 升级到Firebase 9+版本(模块化API)

Firebase 9及以后的版本采用模块化设计,默认使用Fetch API替代XHR,完美适配Service Worker环境。

2. 修改Firebase引入与代码逻辑

替换原有的Firebase脚本引入,改用模块化版本,同时调整代码适配新的API语法:

修改后的firebase-main.js示例:

// 引入Firebase模块化API
import { initializeApp } from 'https://www.gstatic.com/firebasejs/9.23.0/firebase-app.js';
import { getFirestore, doc, setDoc } from 'https://www.gstatic.com/firebasejs/9.23.0/firebase-firestore.js';

try {
  const firebaseConfig = {
    apiKey: "MYDATAHERE",
    authDomain: "MYDATAHERE",
    projectId: "MYDATAHERE",
    storageBucket: "MYDATAHERE",
    messagingSenderId: "MYDATAHERE",
    appId: "MYDATAHERE"
  };

  console.log("firebase main inizializing");
  const app = initializeApp(firebaseConfig);
  console.log(app);
  const db = getFirestore(app);
  console.log(db);

  chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
    console.log("msg.command = " + msg.command);
    if(msg.command == "post"){
      console.log("msg = post");
      console.log("msg.data.extensionEmail is " + msg.data.extensionEmail);
      
      // 使用Firebase 9+的setDoc方法
      setDoc(doc(db, "users", msg.data.extensionEmail), {
        data: msg.data
      })
      .then(() => {
        console.log("Document successfully written!");
        sendResponse(true);
      })
      .catch((error) => {
        console.error("Error writing document: ", error);
        sendResponse(false);
      });
      
      // 返回true保持消息通道开放,等待异步操作完成
      return true;
    }
    sendResponse(false);
  })
} catch (e) {
  console.error(e);
}

3. 关键配置补充

确保在manifest.json中添加Firebase相关的跨域权限:

"host_permissions": [
  "https://*.firebaseio.com/*",
  "https://*.firestore.googleapis.com/*"
]

为什么之前的方法无效

手动引入xhr2无法解决问题,因为Firebase内部对网络请求的封装是硬编码调用XMLHttpRequest,全局替换的XHR对象不会被Firebase的内部逻辑识别,无法从根源上适配Service Worker环境。

内容的提问来源于stack exchange,提问作者Pitta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 14:01:40