升级Expo 53.0.9与React Native 0.79.2后,调用createSagaMiddleware()出现TypeError错误求助
升级Expo 53.0.9与React Native 0.79.2后,调用createSagaMiddleware()出现TypeError错误求助
看起来你遇到的问题是由于模块导入方式错误结合新版本Expo/React Native更严格的模块解析规则导致的,以下是针对性的解决方案:
1. 修正Redux-Saga的导入方式(最关键)
Redux-Saga的createSagaMiddleware是命名导出,而非默认导出。你当前使用的默认导入会获取到undefined,这就是调用时抛出TypeError: 0, _reduxSaga.default is not a function的根本原因。
修改你的导入语句:
// 错误写法 import createSagaMiddleware from 'redux-saga'; // 正确写法 import { createSagaMiddleware } from 'redux-saga';
2. 升级Redux-Saga到兼容版本
虽然你提到已经更新过Redux-Saga,但建议确保使用与Expo 53/React Native 0.79兼容的最新稳定版:
# 使用npm npm install redux-saga@latest # 或使用yarn yarn add redux-saga@latest
3. 调整Metro配置(可选,若仍有问题)
Expo 53搭配的React Native 0.79对模块解析规则更严格,你可以在metro.config.js中添加以下配置以确保正确处理CommonJS/ES模块:
const { getDefaultConfig } = require('expo/metro-config'); const config = getDefaultConfig(__dirname); config.resolver = { ...config.resolver, allowCommonJs: true, // 允许解析CommonJS模块 sourceExts: [...config.resolver.sourceExts, 'cjs', 'mjs'], // 支持更多模块扩展名 }; module.exports = config;
4. 清除Expo/Metro缓存
旧的缓存可能导致模块解析异常,执行以下命令清除缓存并重启项目:
npx expo start -c
修改后的完整Redux配置代码示例
import AsyncStorage from '@react-native-async-storage/async-storage'; import { legacy_createStore as createStore, applyMiddleware } from 'redux'; import { persistStore, persistReducer } from 'redux-persist'; // 修正后的Redux-Saga导入 import { createSagaMiddleware } from 'redux-saga'; import logger from 'redux-logger'; import rootReducer from '@reducers'; import rootSagas from '@sagas'; /** * Redux Setting */ const persistConfig = { key: 'root', storage: AsyncStorage, blacklist: ['home', 'wishlist', 'list', 'messenger', 'notification'], timeout: 100000, }; const sagaMiddleware = createSagaMiddleware(); let middleware = [sagaMiddleware]; if (process.env.NODE_ENV === `development`) { middleware.push(logger); } const persistedReducer = persistReducer(persistConfig, rootReducer); const store = createStore(persistedReducer, applyMiddleware(...middleware)); sagaMiddleware.run(rootSagas); const persistor = persistStore(store); export { store, persistor };
补充说明
在旧版本Expo/React Native中,Metro或Babel的模块解析规则相对宽松,可能允许错误的导入方式(比如将命名导出当作默认导出),但新版本收紧了规则,导致原本隐藏的导入错误直接暴露出来。
内容来源于stack exchange
相关产品推荐
相关产品推荐

