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

React+TypeScript集成FCM获取Token报错:ServiceWorker MIME类型不支持

React(TypeScript)集成FCM获取Token时Service Worker MIME类型错误解决方案

错误原因

这个报错的核心是FCM尝试注册firebase-messaging-sw.js时,服务器返回了HTML内容(通常是404错误页面),浏览器识别为不支持的text/html MIME类型,而非Service Worker要求的application/javascript。

解决步骤

  • 1. 正确放置Service Worker文件
    在React项目的public根目录下创建firebase-messaging-sw.js文件(必须放在public目录,不能在src里),示例内容如下:

    importScripts('https://www.gstatic.com/firebasejs/9.23.0/firebase-app-compat.js');
    importScripts('https://www.gstatic.com/firebasejs/9.23.0/firebase-messaging-compat.js');
    
    const firebaseConfig = {
      apiKey: "你的实际apiKey",
      authDomain: "你的实际authDomain",
      projectId: "你的实际projectId",
      storageBucket: "你的实际storageBucket",
      messagingSenderId: "你的实际messagingSenderId",
      appId: "你的实际appId",
      measurementId: "你的实际measurementId"
    };
    
    firebase.initializeApp(firebaseConfig);
    const messaging = firebase.messaging();
    
    // 可选:处理后台推送消息
    messaging.onBackgroundMessage((payload) => {
      console.log('收到后台消息:', payload);
      const notificationTitle = payload.notification?.title || '新消息';
      const notificationOptions = {
        body: payload.notification?.body || '您有一条新通知',
        icon: '/your-icon.png'
      };
      self.registration.showNotification(notificationTitle, notificationOptions);
    });
    

    注意:请替换脚本链接中的版本号为你项目中使用的Firebase版本,确保版本一致。

  • 2. 验证Service Worker可正常访问
    启动项目后,直接在浏览器访问http://localhost:3000/firebase-messaging-sw.js,确认页面显示的是正确的JS代码,而非HTML错误页面。如果还是返回HTML,检查文件名拼写是否正确、是否确实放在public根目录下。

  • 3. 自定义Service Worker路径(可选)
    若不想使用默认的文件名或路径,可以在初始化时手动指定Service Worker:

    import { initializeApp } from "firebase/app";
    import { getMessaging, getToken, registerServiceWorker } from "firebase/messaging";
    
    const firebaseConfig = { /* 你的Firebase配置 */ };
    
    export const app = initializeApp(firebaseConfig);
    
    const fcmMessaging = getMessaging();
    registerServiceWorker(fcmMessaging, '/custom-sw.js')
      .then(() => getToken(fcmMessaging, { vapidKey: '你的有效VAPID密钥' }))
      .then(currentToken => {
        if (currentToken) {
          console.log(currentToken, "FCM token");
        } else {
          console.log('无可用注册令牌,请先请求通知权限。');
        }
      })
      .catch(err => console.log('获取令牌失败:', err));
    
  • 4. 确保VAPID密钥有效
    VAPID密钥需要从Firebase控制台获取:进入项目设置 > 云消息传递 > Web配置 > 生成密钥对,复制生成的公钥作为vapidKey的值,不要使用占位符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:27:35