如何在FCM firebase-messaging-sw.js service worker中导入SDK 8和9之间的SDK?

polhcujo  于 2023-05-29  发布在  其他
关注(0)|答案(2)|浏览(141)

Firebase文档提供了几种在service worker中导入SDK的方法,这让我很困惑。以下是我在文档中发现的方法:

  1. https://firebase.google.com/docs/cloud-messaging/js/receive#web-version-9
import { initializeApp } from 'firebase/app';
import { getFirestore, collection, getDocs } from 'firebase/firestore/lite';

我无法使用该方法,因为我无法处理我的service worker,因为我的项目仍然使用webpack版本1。因此,我将专注于我发现的“importScripts”技术。

  1. https://firebase.google.com/docs/cloud-messaging/js/receive#web-version-8
importScripts('https://www.gstatic.com/firebasejs/8.10.0/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/8.10.0/firebase-messaging.js');

这是我测试过的一种可行的方法;不过,我有一些疑问:
1.可以在生产环境中使用这个gstatic域吗?
1.这个官方SDK与他们提供的quickstart-js不同。

  1. https://github.com/firebase/quickstart-js/blob/master/messaging/firebase-messaging-sw.js
importScripts('/__/firebase/9.2.0/firebase-app-compat.js');
importScripts('/__/firebase/9.2.0/firebase-messaging-compat.js');
importScripts('/__/firebase/init.js');

这是官方的quickstart-js示例,但我仍然有很多问题:
1.看起来他们自动更新了示例SDK,但Firebase的当前版本是9.6.1,而不是9.2.0;我应该继续使用9.2.0吗?
1.这种方法只适用于Firebase托管的项目,我在第三行找不到与gstatic匹配的init.js文件;有办法直接访问文件吗?
我应该使用哪种方法?
我目前在Service Worker之外使用Firebase 9.6.1;在我的service worker中使用版本8会导致任何问题吗?

amrnrhlw

amrnrhlw1#

我想我会坚持这一点:

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

xj3cbfub2#

我知道这是晚了,但既然我发现了这个职位,其他人也可以。使用compat版本的importScripts在当时绝对是正确的选择。你可能会遇到的一个问题是,在某些浏览器中支持es6。

**(截至2023年)**Service worker(ES6)现在被许多浏览器支持,包括Chrome、Edge、Firefox、Safari和Opera。我所知道的唯一没有的浏览器是Internet Explorer和iOS版本的Safari。

您仍然可以在不支持ES6 service worker的浏览器上使用它,但如果您希望它们能够查看您的页面,则需要使用转译器。否则,可能会显示错误。代码是不同的,所以他们的浏览器将无法读取它。转译器基本上将代码还原为可以读取的标准。
要使用ES6 service worker,您必须更新注册它的方式。例如,我正在创建一个Flutter Web应用程序,所以我在index.html文件中注册了我的service worker:

navigator.serviceWorker.register('firebase-messaging-sw.js', { type: 'module' });

唯一的区别是第二个参数,我在这里将类型设置为module。
添加后,您还可以在service worker中使用ES6导入:

import { initializeApp } from 'firebase/app'
import { getFirestore, collection, getDocs } from 'firebase/firestore/lite'

再次重申,在使用ES6之前,您需要了解转译。目前,iOS版本的Safari使用了一些ES6功能,但不是全部(包括service worker)。

相关问题