我正在开发一个使用“创建反应应用”(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库?
答案 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/
根据我对此问题的了解,无法使用externals
将webpack
添加到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;