firebase 未捕获的DOMException:无法在“WorkerGlobalScope”上执行“importScripts”

wtzytmuj  于 2023-10-22  发布在  其他
关注(0)|答案(5)|浏览(287)

我正在尝试从导入脚本

importScripts("https://www.gstatic.com/firebasejs/9.1.0/firebase-app.js");
importScripts("https://www.gstatic.com/firebasejs/9.1.0/firebase-messaging.js");

它用于firebase云消息传递(FCM),但不知道为什么angular不喜欢在ServiceWorker上导入
它导入它(点击错误URL并获得脚本),但不知何故未能加载?

错误在这里:

Uncaught DOMException: Failed to execute 'importScripts' on 'WorkerGlobalScope': The script at 'https://www.gstatic.com/firebasejs/9.1.0/firebase-app.js' failed to load.
    at initInSw (http://localhost:4200/firebase-messaging-sw.js:35:1)
    at http://localhost:4200/firebase-messaging-sw.js:56:1

angular.json

"assets": [
          "src/favicon.ico",
          "src/assets",
          "src/manifest.json",
          "src/firebase-messaging-sw.js"
        ],

index.html

<link rel="manifest" href="/manifest.json">

目录

试图使用fireship的实现https://www.youtube.com/watch?v=z27IroVNFLI&t=140s&ab_channel=Fireship,但也不工作(相同的实现只是不同的firebase版本),我也认为没有什么与此有关
我的理论是,我认为它真的没有加载,而我看到的是控制台请求?(因为文件名是(索引)在意味着它没有文件名因此不存在?)

1u4esq0p

1u4esq0p1#

我发现以下线程有助于解决此问题:
https://github.com/firebase/firebase-js-sdk/issues/5403
在Service Workers和importScripts函数周围似乎引入了一个兼容性问题。此线程中显示了一个解决方法,允许您在使用最新(v9)版本的Firebase时使用较旧的导入库样式。

imzjd6km

imzjd6km2#

如果你想使用版本9,你应该使用这样的代码

import { initializeApp } from "firebase/app";
import { getMessaging } from "firebase/messaging/sw";

const firebaseApp = initializeApp({
  apiKey: 'api-key',
  authDomain: 'project-id.firebaseapp.com',
  databaseURL: 'https://project-id.firebaseio.com',
  projectId: 'project-id',
  storageBucket: 'project-id.appspot.com',
  messagingSenderId: 'sender-id',
  appId: 'app-id',
  measurementId: 'G-measurement-id',
});

const messaging = getMessaging(firebaseApp);

因为他们已经改变了像ts这样的lib脚本格式。
如果您仍然想使用旧版本,您可以使用Compat Edition。

importScripts('https://www.gstatic.com/firebasejs/9.1.0/firebase-app-compat.js');
importScripts('https://www.gstatic.com/firebasejs/9.1.0/firebase-messaging-compat.js');

您仍然可以将版本代码更改为最新。

44u64gxh

44u64gxh3#

如果你想在>= v9 SDK中继续使用普通JS服务工作文件沿着,你需要像这样重新格式化文件:
public/firebase-messaging-sw.js

// v8/namespaced style service worker
importScripts('https://www.gstatic.com/firebasejs/10.1.0/firebase-app-compat.js')
importScripts('https://www.gstatic.com/firebasejs/10.1.0/firebase-messaging-compat.js')

const firebase_config = {
    apiKey: "...",
    projectId: "...",
    messagingSenderId: "...",
    appId: "...",
}
firebase.initializeApp(firebase_config)
firebase.messaging()

importScripts在不使用-compat库的情况下无法与v9+一起工作,但请注意,这将失去模块化库的所有优点(它将导入所有内容)。
你必须 Boot 你的应用程序,并调用firebase.messaging()让服务工作者开始监听。
如果您在应用中使用现代Firebase库,则不需要注册service worker -它会找到firebase-messaging-sw.js并自动注册。
如果你想使用这些答案中提供的其他示例,使用import和v9模块化语法,你需要在你的应用构建中包含service worker,因为你不能在一个不是模块的纯JS文件中使用import
DEEz使用的解决方案是通过将他们的库降级到v8并继续使用命名空间语法来避免这个问题。这当然会起作用,但在某些时候会阻止升级维护。
我想我会添加这个答案,因为其他答案都没有完整的“v8”风格的worker文件,只是部分混合在v9示例中,我发现这令人困惑。

vcirk6k6

vcirk6k64#

在解决了半天之后,我认为它需要一个旧版本的Firebase(9.1.0 => 8.10)
所以我同步了angular.json firebase版本和service worker版本到8. 10,它工作了!

qgelzfjb

qgelzfjb5#

web版本-9中,您必须这样做

import { initializeApp } from "firebase/app";
import { getMessaging } from "firebase/messaging/sw";

const firebaseApp = initializeApp({
  apiKey: 'api-key',
  authDomain: 'project-id.firebaseapp.com',
  databaseURL: 'https://project-id.firebaseio.com',
  projectId: 'project-id',
  storageBucket: 'project-id.appspot.com',
  messagingSenderId: 'sender-id',
  appId: 'app-id',
  measurementId: 'G-measurement-id',
});

const messaging = getMessaging(firebaseApp);

相关问题