在 react ssr 应用程序中调用 firebase 消息传递方法时,如何修复 self 未定义?

Sub*_*ndu 3 firebase reactjs firebase-cloud-messaging react-ssr razzle

我正在尝试在使用https://github.com/jaredpalmer/razzle with-react-router-3创建的 SSR 应用程序中使用 firebase 按摩。我已经在使用 Firebase,它非常有效,包括托管。但是当我开始在应用程序中添加消息时开始抛出错误。

我的入口点看起来像,

import firebase from 'firebase/app';
import 'firebase/auth';
import 'firebase/database';
import 'firebase/storage';
import 'firebase/firestore';
import 'firebase/messaging';

import FirebaseConfig from 'config/firebase-config.json';
if (!firebase.apps.length) {
  firebase.initializeApp(FirebaseConfig);
}
const messaging = firebase.messaging();
Run Code Online (Sandbox Code Playgroud)

当我使用以下命令启动服务器时出现以下错误 razzle start

/Users/subkundu/Desktop/Work/Projects/React/ownerstown/node_modules/@firebase/messaging/index.ts:75
  if (self && 'ServiceWorkerGlobalScope' in self) {
  ^

ReferenceError: self is not defined
Run Code Online (Sandbox Code Playgroud)

我如何解决它?任何领先都将是惊人的。谢谢。:)

小智 5

我相信您必须提供支票以查看是否window可用。

let Messaging;
if (YOUR_CHECK_HERE) {
    Messaging = firebase.messaging();
}
// Then you can use "Messaging"
Run Code Online (Sandbox Code Playgroud)

我对 razzle 不熟悉。访问window取决于服务器端呈现 (SSR) 框架。我从这篇文章中得到了这个想法。当我在使用 nuxt.js 时遇到这个问题时,我可以window使用 this来检查process.browser。希望这可以帮助!