在Firebase托管中将Firebase与React结合使用

pab*_*blo 5 firebase reactjs firebase-hosting

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

<script src="/__/firebase/init.js"></script>
Run Code Online (Sandbox Code Playgroud)

我需要在我的React组件的上面的脚本中初始化“ firebase”对象。如何将其导入多个React组件文件中?我知道只有在开发过程中以及在部署过程中将其与“ firebase服务”一起使用时,此功能才可用,因此在开发过程中,我尝试添加

<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>
Run Code Online (Sandbox Code Playgroud)

如Firebase文档中所述将代码编码到我的index.html文件中。但是,当我尝试在ReactComponent中导入Firebase时,找不到它或抱怨未初始化项目(我在html标记中所做的事情)

如何从html脚本标签导入Firebase初始化的App和Firebase库?

Fot*_*dis 5

当您使用 create-react app 和 webpack 时,您应该已经在使用 nodejs firebase:

npm install --save firebase
Run Code Online (Sandbox Code Playgroud)

要在部署时即时获取配置,您必须访问此 url:

/__/firebase/init.json
Run Code Online (Sandbox Code Playgroud)

因此,在尝试初始化 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));
Run Code Online (Sandbox Code Playgroud)

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

fbconfig.js:

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

开发.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;
Run Code Online (Sandbox Code Playgroud)

产品.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;
Run Code Online (Sandbox Code Playgroud)

最后在 index.js 中:

import getFirebaseConfig from "./fbconfig";

getFirebaseConfig.then(result => {
  firebase.initializeApp(result);
  ...etc
)}
.catch(err => console.log(err));
Run Code Online (Sandbox Code Playgroud)


And*_*ets -1

尝试firebase通过 npm 安装包。然后,您可以通过导入来轻松地在任何 React 组件中的任何地方使用它

import firebase from 'firebase';
Run Code Online (Sandbox Code Playgroud)

您还可以在某个文件中导入 firebase,configureFirebase.js您可以在其中使用一些配置初始化 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;
Run Code Online (Sandbox Code Playgroud)