React Native报错TypeError: _firebase.default.auth is not a function如何解决
错误原因
- Firebase 9.x 采用模块化API设计,完全摒弃了v8版本
firebase.auth()这种命名空间调用方式,你当前的代码是v8版本的语法,和安装的9.5.0版本不兼容。 - 你同时安装了原生React Native专用的
@react-native-firebase套件和web版firebase库,二者属于完全不同的实现,混用会导致方法调用异常。 - 即使你要使用web版Firebase 9,也没有额外导入auth功能模块,自然无法调用auth相关方法。
- 你之前的Expo项目能正常运行,大概率是Expo内置的Firebase集成默认兼容了v8语法,和你新安装的依赖版本逻辑不同。
修复方案
你可以从以下两种方案中二选一,不要同时混用两套实现。
方案一:使用@react-native-firebase(原生RN项目推荐,性能和适配性最优)
- 先卸载冲突的web版firebase:
npm uninstall firebase
- 安装对应版本的auth模块,版本要和你现有
@react-native-firebase/app版本保持一致:
npm install @react-native-firebase/auth@^13.0.1
- 完成安卓、iOS端的原生配置:将Firebase控制台下载的
google-services.json放入安卓项目app目录,GoogleService-Info.plist放入iOS项目根目录并在Xcode中添加到项目target即可。 - 删除你原来的
firebase.js文件,修改业务代码如下:
import auth from '@react-native-firebase/auth'; export function MainNavigator() { const [token, setToken] = useAtom(tokenAtom); useEffect(() => { const unsubscribe = auth().onIdTokenChanged(async (user) => { setToken(user ? await user.getIdToken() : null); }); // 返回卸载函数避免内存泄漏 return unsubscribe; }, []); // 其余原有代码 }
方案二:继续使用web版Firebase 9(无需修改原生配置,适合轻量使用场景)
- 卸载不需要的
@react-native-firebase套件,避免冲突:
npm uninstall @react-native-firebase/app @react-native-firebase/functions
- 修改你的
firebase.js配置文件,导入auth模块:
import { initializeApp } from "firebase/app"; import { getAuth } from "firebase/auth"; const firebaseConfig = { apiKey: "Secret stuff", authDomain: "Secret stuff", databaseURL: "Secret stuff", projectId: "Secret stuff", storageBucket: "Secret stuff", messagingSenderId: "Secret stuff", appId: "Secret stuff", measurementId: "Secret stuff" }; const app = initializeApp(firebaseConfig); export const auth = getAuth(app); export default app;
- 修改业务代码,使用Firebase 9的模块化语法调用:
import { onIdTokenChanged } from "firebase/auth"; import { auth } from './firebase' export function MainNavigator() { const [token, setToken] = useAtom(tokenAtom); useEffect(() => { const unsubscribe = onIdTokenChanged(auth, async (user) => { setToken(user ? await user.getIdToken() : null); }); return unsubscribe; }, []); // 其余原有代码 }
内容的提问来源于stack exchange,提问作者Gurmukh Singh
相关产品推荐
相关产品推荐

