由于“尝试导入错误”,Reactfire 在 Next/React 应用程序中失败

Sav*_*lou 5 firebase reactjs reactfire next.js react-context

我正在用我需要的 Reactfire 提供程序包装 Next 根布局的子级:

import './globals.css';
import { AuthProvider, FirebaseAppProvider } from 'reactfire';
import { auth, firebaseConfig } from '../config/firebase';

export default function RootLayout({ children }: { children: React.ReactNode }) {
    return (

        <html lang="en">
            <body>
                <FirebaseAppProvider firebaseConfig={firebaseConfig}>
                    <AuthProvider sdk={auth}>
                        {children}
                    </AuthProvider>
                </FirebaseAppProvider>
            </body>
        </html>

    )
}
Run Code Online (Sandbox Code Playgroud)

firebaseConfig是正确的,因为我可以使用该模块成功连接到我的 Firebase 应用程序firebase

当我运行时npm run dev失败并出现以下错误:

请求模块的导入跟踪:

../node_modules/reactfire/dist/index.js
./src/app/layout.tsx
- error ../node_modules/reactfire/dist/index.js
Attempted import error: 'createContext' is not exported from 'react' (imported as 'f').
Run Code Online (Sandbox Code Playgroud)

我尝试更新 npm,降级到以前的 Reactfire 版本,清除 npm 缓存,重新安装所有节点模块,并使用 Reactfire 文档给出的确切设置结构。

Alg*_*mic 1

我遇到了同样的问题,并尝试降级到某个更高的版本,该版本提供了一些对此错误消息有用的提示。对我来说,问题是我正在FirebaseAppProvider应用程序的入口点中配置,就像您一样。但是,FirebaseAppProvider使用 useContext,这是客户端功能。这意味着该文件需要'use client'在文件顶部添加注释。

更复杂的是,您不能只点击'use client'文件的顶部layout.tsx(不记得确切的原因)。

我通过创建一个单独的组件解决了这个问题,Providers在该组件中放置FirebaseAppProvider'use client'在文件顶部添加了注释,如下所示:

// app/providers.tsx
'use client' //<- REMEMBER THIS

import { FirebaseAppProvider } from 'reactfire'

export function Providers({ children }: { children: React.ReactNode }) {
    const firebaseConfig = {
        ...
    };


    return (
        <FirebaseAppProvider firebaseConfig={firebaseConfig}>
            {children}
        </FirebaseAppProvider>
    )
}
Run Code Online (Sandbox Code Playgroud)

然后,我可以在我的layout.tsx文件中使用它,如下所示:

//app/layout.tsx
import { Providers } from './providers'

export default function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    <html lang="en">
      <body>
        <Providers>
          {children}
        </Providers>
      </body>
    </html>
  )
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!