【问题标题】:Upgrade to Firebase JS 8.0.0: Attempted import error: 'app' is not exported from 'firebase/app' (imported as 'firebase')升级到 Firebase JS 8.0.0:尝试导入错误:“app”未从“firebase/app”导出(导入为“firebase”)
【发布时间】:2021-02-09 05:25:04
【问题描述】:

升级到8.0.0后出现如下错误:

尝试导入错误:“initializeApp”未从“firebase/app”导出(导入为“firebase”)。

我的导入如下所示:

import * as firebase from "firebase/app"
firebase.initializeApp({ ... })

TypeScript 也抱怨:

“typeof import("/path/to/my/file")”类型上不存在属性“initializeApp”。 ts(2339)

我该如何解决这个问题?

【问题讨论】:

    标签: javascript typescript firebase


    【解决方案1】:

    在版本 8.0.0 中,Firebase SDK 处理导出的方式发生了重大变化:

    重大更改:package.json 文件中的 browser 字段现在指向 ESM 捆绑包而不是 CJS 捆绑包。使用 ESM 导入的用户必须 现在使用默认导入而不是命名空间导入。

    8.0.0 之前

    import * as firebase from 'firebase/app'
    

    8.0.0 之后

    import firebase from 'firebase/app'
    

    使用require('firebase/app')require('firebase') 的代码将 仍然可以工作,但为了获得正确的输入(用于代码完成, 例如)用户应该改变这些要求调用 require('firebase/app').defaultrequire('firebase').default。这 是因为 SDK 现在使用 ESM 包的类型,并且 不同的包共享一个类型文件。

    因此,您将不得不使用新的 ESM 捆绑包默认导出:

    import firebase from "firebase/app"
    firebase.initializeApp({ ... })
    

    如果您正在使用 SDK version 9.0,请阅读此问题:

    【讨论】:

    • 关于其他包(如消息传递)我在这里找到了相关文档:npmjs.com/package/firebase 示例(来自上述站点)://此导入加载了 firebase 命名空间及其所有类型信息。从'firebase/app'导入firebase; // 这些导入将单个服务加载到 firebase 命名空间中。导入'firebase/auth';导入“火力基地/数据库”;
    • @MikkoPöri 是的,这涵盖了使用模块捆绑器集成 Firebase SDK 的文档。这部分在 8.0.0 中没有改变:firebase.google.com/docs/web/setup#using-module-bundlers
    • @DougStevenson 如何仅导入类型 firebase.firestore ?对我来说,它在 v8.0 之后就坏了。以前我做过import { firestore } from 'firebase',它正好适合我的类型!
    • @mesqueeb 如果您有新问题,请单独发布。
    • 这解决了我在导入 firebase/firestore 时遇到的问题。这是一个令人头疼的问题,因为 firebase/storage 与 import * 一样正常工作。还是谢谢!
    【解决方案2】:

    导入 firebase 的旧方法:import * as firebase from "firebase/app";

    8.0.0版本导入新方法:从“firebase/app”导入firebase

    例如:我这样做的方式。只有前 2 行是相关的,其他行仅作为我的代码的一部分添加,但它非常一般!

    import firebase from "firebase/app"
    import "firebase/auth"
    
    const firebaseConfig = {
      apiKey: XXXX,
      authDomain: XXX,
      projectId: XXXX,
      storageBucket: XXXX,
      messagingSenderId: XXXX,
      appId: XXXX,
    }
    
    
    if (!firebase.apps.length) {
      firebase.initializeApp(firebaseConfig)
    }
    
    
    export const auth = firebase.auth() 
    export const googleAuthProvider = new firebase.auth.GoogleAuthProvider()
    

    用你的数据替换 XXXX,只是清楚:)

    【讨论】:

      【解决方案3】:

      尝试在上面的 firebase 9 上使用它

      import firebase from 'firebase/compat/app';
      import 'firebase/compat/auth';
      import 'firebase/compat/firestore';
      

      或者您可以阅读更多信息:https://firebase.google.com/docs/web/modular-upgrade

      【讨论】:

        【解决方案4】:

        如果您使用的是身份验证,则需要单独导入: 导入'firebase/auth'; 因为您没有导入“* as firebase”之类的所有内容。

        【讨论】:

          【解决方案5】:

          这是一个更新问题,虽然您可以修复导入 firebase 的方式,但无法修复在您使用的库中导入的方式,您将等待这些库更新

          8.0.0 之前 从 'firebase/app' 导入 * 作为 firebase

          8.0.0 之后 从'firebase/app'导入firebase

          类库之类的FirebaseUI身份验证还没更新,从4月开始就一直在等FirebaseUI更新

          https://stackoverflow.com/a/66708552/12490386

          【讨论】:

            【解决方案6】:

            我自己的错误提示:确保所有拼写正确,然后尝试使用这个?import firebase from 'firebase'

            【讨论】:

              【解决方案7】:

              这是新的 firebase 9 更新:

                 import { initializeApp } from "firebase/app";
                 import { getMessaging, getToken } from "firebase/messaging";
              

              【讨论】:

                【解决方案8】:

                我在旧网站中尝试使用 Firebase 身份验证时遇到了类似问题。

                这解决了问题:

                npm uninstall firebase step
                npm install firebase
                

                【讨论】:

                  【解决方案9】:

                  我通过在路由中使用解决了 firebase 版本 > 9 的类似问题: /compat/ 例如: import firebase from "firebase/compat/app";

                  【讨论】:

                    【解决方案10】:

                    我在 firebase 9.6.1 版中使用这种“导入”方法解决了我的问题:

                    import "firebase/auth"
                    import firebase from 'firebase/compat/app';
                    import 'firebase/compat/auth';
                    import 'firebase/compat/firestore';
                    
                    const firebaseConfig = {
                     apiKey: "AIzaSyBbaKxbqufRCfrwGpQ3sfuBgIifIhTCP1A",
                     authDomain: "facebook-clone-f4994.firebaseapp.com",
                     projectId: "facebook-clone-f4994",
                     storageBucket: "facebook-clone-f4994.appspot.com",
                     messagingSenderId: "593047789391",
                     appId: "1:593047789391:web:11459d7b291b9465542f3a",
                     measurementId: "G-FNW1K23DBJ"
                    };
                    
                    
                    const firebaseApp = firebase.initializeApp(firebaseConfig);
                    const db = firebaseApp.firestore();
                    const auth = firebase.auth();
                    const provider = new firebase.auth.GoogleAuthProvider();
                    
                    
                    export { auth, provider };
                    export default db;
                    

                    【讨论】:

                      【解决方案11】:

                      2021 年更新:

                      Firebase v9 带有新的 API,旨在促进 tree-shaking(删除未使用的代码)。这将使您的网络应用程序尽可能小而快。

                      /compat 包的创建是为了兼容并简化模块化 API 的升级。没有获得性能津贴的缺点。要获得模块化设计的性能优势,请改用getApps

                      import { getApps, initializeApp } from 'firebase/app';
                      
                      if (!getApps().length) {
                        initializeApp({
                          // your config
                        });
                      }
                      

                      来自库的 JSDoc:getApps return A (read-only) array of all initialized apps.

                      还有一个getApp函数When called with no arguments, the default app is returned. When an app name is provided, the app corresponding to that name is returned. An exception is thrown if the app being retrieved has not yet been initialized.

                      【讨论】:

                        猜你喜欢
                        • 2021-02-13
                        • 2021-11-18
                        • 2021-10-26
                        • 2021-10-26
                        • 2021-06-27
                        • 1970-01-01
                        • 1970-01-01
                        • 2021-08-22
                        • 2021-04-15
                        相关资源
                        最近更新 更多