在Firebase托管中使用Firebase和React

时间:2017-09-15 14:11:30

标签: reactjs firebase firebase-hosting

我正在开发一个使用“创建反应应用”(https://github.com/facebookincubator/create-react-app)创建的React应用。 它将托管在Firebase Hosting中,我希望使用隐式初始化作为文档(https://firebase.google.com/docs/web/setup#sdk_imports_and_implicit_initialization)中的描述,部署到多个项目(我有一个开发项目和几个生产项目)

<script src="/__/firebase/init.js"></script>

我需要在我的React组件中的上面脚本中初始化“firebase”对象。我应该如何在多个React组件文件中导入它? 我知道只有当我在开发期间和部署它时使用“firebase serve”服务它时才能使用它,因此在开发过程中我试图添加

<script src="https://www.gstatic.com/firebasejs/4.1.1/firebase.js"></script>
<script>
  // Initialize Firebase
  // TODO: Replace with your project's customized code snippet
  var config = {
    apiKey: "<API_KEY>",
    authDomain: "<PROJECT_ID>.firebaseapp.com",
    databaseURL: "https://<DATABASE_NAME>.firebaseio.com",
    storageBucket: "<BUCKET>.appspot.com",
    messagingSenderId: "<SENDER_ID>",
  };
  firebase.initializeApp(config);
</script>

我的index.html文件的代码,如Firebase文档中所述。但是,当我尝试在ReactComponent中导入Firebase时,它找不到它或抱怨没有初始化项目(我在html标签中做了什么)

如何从我的html脚本代码中导入Firebase初始化的App和Firebase库?

3 个答案:

答案 0 :(得分:1)

在使用create-react应用程序以及webpack时,您应该已经在使用nodejs firebase:

npm install --save firebase

要在部署时即时获取配置,您必须访问以下URL:

/__/firebase/init.json

因此,在尝试初始化Firebase之前,您需要进行异步调用以获取存储在此位置的json对象。所以这是一些示例代码(使用axios进行异步调用)包含在index.js中:

    import React from "react";
    import ReactDOM from "react-dom";
    import * as firebase from "firebase/app";
    import axios from "axios";

    const getFirebaseConfig = new Promise((resolve, reject) => {
      axios
        .get(`/__/firebase/init.json`)
        .then(res => {
          resolve(res.data);
        })
        .catch(err => reject(err));
    });

    getFirebaseConfig
      .then(result => {
        firebase.initializeApp(result);

        ReactDOM.render(
          <div>XXXXX</div>,
          document.getElementById("root")
        );
      })
      .catch(err => console.log(err));

此外,为了使其更加简化(使用带有npm start的dev firebase配置,并在部署时即时获取prod firebase配置),您可以执行以下操作:

fbconfig.js:

if (process.env.NODE_ENV === "production") {
  module.exports = require("./prod");
} else {
  module.exports = require("./dev");
}

dev.js:

const firebaseConfig = {
  // your dev firebase configuration
  apiKey: "xxxxx",
  authDomain: "xxxxx",
  databaseURL: "xxxxxx",
  projectId: "xxxxxx",
  storageBucket: "xxxxx",
  messagingSenderId: "xxxxx"
};

const getFirebaseConfig = new Promise((resolve, reject) => {
  resolve(firebaseConfig);
});

export default getFirebaseConfig;

prod.js:

import axios from "axios";

const getFirebaseConfig = new Promise((resolve, reject) => {
  axios
    .get(`/__/firebase/init.json`)
    .then(res => {
      resolve(res.data);
    })
    .catch(err => reject(err));
});

export default getFirebaseConfig;

最后是index.js:

import getFirebaseConfig from "./fbconfig";

getFirebaseConfig.then(result => {
  firebase.initializeApp(result);
  ...etc
)}
.catch(err => console.log(err));

答案 1 :(得分:0)

您正在直接在浏览器中提供带脚本标签的firebase API。运行捆绑软件时,它已经可以在浏览器中使用。

您正在使用webpack在后​​台使用create-react-app,但我认为您可能需要将其弹出,以便可以告诉您该软件包将在您的环境中可用(浏览器)使用externals属性。

https://webpack.js.org/configuration/externals/

根据我对此问题的了解,无法使用externalswebpack添加到create-react-app

https://github.com/facebook/create-react-app/issues/780

也许最好将<script>标签与firebase放在一起,然后直接将其安装并导入到您的CRA项目中。

这可能会帮助: https://www.codementor.io/yurio/all-you-need-is-react-firebase-4v7g9p4kf

答案 2 :(得分:-1)

尝试通过npm安装firebase包。然后,您可以通过导入

轻松地在任何反应组件中的任何位置使用它
import firebase from 'firebase';

您还可以在某些configureFirebase.js文件中导入firebase,您可以在其中使用某些配置初始化firebase应用程序,然后导出已配置的firebase实例并在任何组件中使用此实例

它会有所帮助:

import firebase from 'firebase'
const config = { /* COPY THE ACTUAL CONFIG FROM FIREBASE CONSOLE */
    apiKey: "unreadablestuff",
    authDomain: "your-domain-name.firebaseapp.com",
    databaseURL: "https://your-domain-name.firebaseio.com",
    storageBucket: "your-domain-name.appspot.com",
    messagingSenderId: "123123123123"
};
const fire = firebase.initializeApp(config);
export default fire;