我正在尝试从导入脚本
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版本),我也认为没有什么与此有关
我的理论是,我认为它真的没有加载,而我看到的是控制台请求?(因为文件名是(索引)在意味着它没有文件名因此不存在?)
5条答案
按热度按时间1u4esq0p1#
我发现以下线程有助于解决此问题:
https://github.com/firebase/firebase-js-sdk/issues/5403
在Service Workers和
importScripts
函数周围似乎引入了一个兼容性问题。此线程中显示了一个解决方法,允许您在使用最新(v9)版本的Firebase时使用较旧的导入库样式。imzjd6km2#
如果你想使用版本9,你应该使用这样的代码
因为他们已经改变了像ts这样的lib脚本格式。
如果您仍然想使用旧版本,您可以使用Compat Edition。
您仍然可以将版本代码更改为最新。
44u64gxh3#
如果你想在>= v9 SDK中继续使用普通JS服务工作文件沿着,你需要像这样重新格式化文件:
public/firebase-messaging-sw.js
importScripts
在不使用-compat
库的情况下无法与v9+一起工作,但请注意,这将失去模块化库的所有优点(它将导入所有内容)。你必须 Boot 你的应用程序,并调用
firebase.messaging()
让服务工作者开始监听。如果您在应用中使用现代Firebase库,则不需要注册service worker -它会找到
firebase-messaging-sw.js
并自动注册。如果你想使用这些答案中提供的其他示例,使用
import
和v9模块化语法,你需要在你的应用构建中包含service worker,因为你不能在一个不是模块的纯JS文件中使用import
。DEEz使用的解决方案是通过将他们的库降级到v8并继续使用命名空间语法来避免这个问题。这当然会起作用,但在某些时候会阻止升级维护。
我想我会添加这个答案,因为其他答案都没有完整的“v8”风格的worker文件,只是部分混合在v9示例中,我发现这令人困惑。
vcirk6k64#
在解决了半天之后,我认为它需要一个旧版本的Firebase(9.1.0 => 8.10)
所以我同步了
angular.json
firebase版本和service worker版本到8. 10,它工作了!qgelzfjb5#
在web版本-9中,您必须这样做