You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Expo SDK 43后使用firebase-js-sdk触发RCTAsyncStorage.multiMerge报错

问题成因
  • Expo SDK 43 对应版本移除了 React Native 核心内置的 RCTAsyncStorage 原生模块,目前官方推荐使用的社区版 @react-native-async-storage/async-storage,在 Web 端实现和部分原生版本中默认没有暴露 multiMerge 方法。
  • firebase-js-sdk 的 getReactNativePersistence 方法内部会优先校验 RCTAsyncStorage.multiMerge 属性是否存在,当该属性不存在时,就会抛出空对象访问的报错,和调用的 auth 具体版本无关,属于持久化层的兼容逻辑问题。

报错截图

触发报错的代码逻辑在firebase内部:

if (!RCTAsyncStorage.multiMerge) {
解决方案

方案1:手动补全multiMerge兼容方法(推荐,三端通用)

在初始化firebase之前,给AsyncStorage手动添加multiMerge方法的兼容实现即可,不需要修改其他业务逻辑:

import AsyncStorage from '@react-native-async-storage/async-storage';

// 补全firebase需要的multiMerge方法
if (!AsyncStorage.multiMerge) {
  AsyncStorage.multiMerge = async (keyValuePairs) => {
    await Promise.all(
      keyValuePairs.map(async ([key, valueToMerge]) => {
        const storedValue = await AsyncStorage.getItem(key);
        const parsedStored = storedValue ? JSON.parse(storedValue) : {};
        const parsedToMerge = JSON.parse(valueToMerge);
        const mergedValue = { ...parsedStored, ...parsedToMerge };
        await AsyncStorage.setItem(key, JSON.stringify(mergedValue));
      })
    );
  };
}

// 之后再执行firebase初始化逻辑
let auth = initializeAuth(config, {
  persistence: getReactNativePersistence(AsyncStorage),
});
let analytics = getAnalytics(config);

方案2:匹配依赖版本

确认你使用的 @react-native-async-storage/async-storage 版本和Expo SDK 43匹配,Expo SDK 43官方适配的版本为~1.15.0,不要使用过高的版本,避免出现原生模块和JS层不匹配的问题。

方案3:使用自定义持久化层

如果不需要依赖AsyncStorage的持久化能力,也可以自定义firebase的持久化实现,跳过AsyncStorage的校验逻辑,不过该方案需要自己实现数据存储逻辑,适合对持久化有自定义需求的场景。

内容的提问来源于stack exchange,提问作者Steven Matthews

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:06:01