React Native 0.77.1升级后出现setImmediate不存在的EarlyJsError求助
升级React Native 0.77.1 + Expo SDK 52后出现"EarlyJsError: Property 'setImmediate' doesn't exist"错误的解决方案
问题背景
按照官方指南从React Native 0.76.6升级到0.77.1(搭配Expo SDK 52),升级前Expo环境运行正常,升级后触发EarlyJsError: Property 'setImmediate' doesn't exist错误。
已尝试的无效操作:
- 手动安装
setimmediate包并在index文件顶部导入 - 添加手动polyfill代码:
if (typeof global.setImmediate === 'undefined') { global.setImmediate = (callback, ...args) => setTimeout(callback, 0, ...args); }
- 参考社区相关建议,但问题仍未解决
当前package.json配置
{ "name": "appname", "version": "1.0.0", "main": "expo-router/entry", "scripts": { "start": "expo start", "android": "expo run:android", "ios": "expo run:ios", "web": "expo start --web" }, "dependencies": { "@babel/runtime": "^7.26.0", "@expo/vector-icons": "^14.0.4", "@fortawesome/fontawesome-svg-core": "^6.7.2", "@fortawesome/free-brands-svg-icons": "^6.7.2", "@fortawesome/free-regular-svg-icons": "^6.7.2", "@fortawesome/free-solid-svg-icons": "^6.7.2", "@fortawesome/react-native-fontawesome": "^0.3.2", "@react-native-async-storage/async-storage": "^1.23.1", "@react-native-vector-icons/common": "^11.0.0", "@react-native-vector-icons/fontawesome": "^4.7.0", "@react-native-vector-icons/fontawesome6": "^6.7.1", "@react-navigation/bottom-tabs": "^7.2.0", "@react-navigation/drawer": "^7.1.1", "@react-navigation/native": "^7.0.14", "@react-navigation/stack": "^7.1.1", "axios": "^1.7.9", "expo": "^52.0.35", "expo-blur": "~14.0.3", "expo-constants": "~17.0.3", "expo-font": "~13.0.3", "expo-linear-gradient": "~14.0.2", "expo-linking": "~7.0.5", "expo-router": "~4.0.15", "expo-secure-store": "^14.0.1", "expo-status-bar": "~2.0.1", "react": "18.3.1", "react-dom": "18.3.1", "react-native": "~0.77.1", "react-native-checkbox": "^2.0.0", "react-native-dev-menu": "^4.1.1", "react-native-gesture-handler": "~2.22.0", "react-native-linear-gradient": "^2.8.3", "react-native-reanimated": "~3.16.7", "react-native-safe-area-context": "~5.1.0", "react-native-screens": "~4.8.0", "react-native-svg": "15.8.0", "react-native-vector-icons": "^10.2.0", "react-native-web": "~0.19.13", "zustand": "^5.0.3", "setimmediate": "^1.0.5", "react-native-webview": "~13.13.1" }, "devDependencies": { "@babel/cli": "^7.26.4", "@babel/core": "^7.26.0", "@types/react": "~18.3.12", "metro-react-native-babel-preset": "^0.77.0", "typescript": "^5.3.3" }, "private": true, "expo": { "install": { "exclude": [ "react-native@~0.76.6", "react-native-reanimated@~3.16.1", "react-native-gesture-handler@~2.20.0", "react-native-screens@~4.4.0", "react-native-safe-area-context@~4.12.0", "react-native-webview@~13.12.5" ] } } }
可行解决方案
1. 提前注入polyfill
确保polyfill在所有依赖代码前执行,对于Expo Router项目,修改app/_layout.js(或项目入口文件),将polyfill代码放在最顶部:
// 放在文件最开头,优先于任何import语句 global.setImmediate = global.setImmediate || ((callback, ...args) => setTimeout(callback, 0, ...args)); // 后续的import和业务代码 import { Stack } from 'expo-router'; // ...其他代码
2. 清理冗余依赖
package.json中同时存在多套图标库(@react-native-vector-icons/*、react-native-vector-icons、@expo/vector-icons),这类重复依赖可能导致环境异常。建议保留Expo官方推荐的@expo/vector-icons,移除其他同类依赖,然后执行:
npm install npx expo start --clear
3. 修复Expo配置的exclude项
当前expo.install.exclude列表保留了旧版本依赖,可能导致版本不一致。清空或更新exclude列表后,执行依赖对齐:
"expo": { "install": { "exclude": [] } }
然后运行:
npx expo install --fix
4. 使用babel插件自动注入polyfill
安装babel插件并配置:
npm install babel-plugin-polyfill-setimmediate --save-dev
创建或修改babel.config.js:
{ "presets": ["module:metro-react-native-babel-preset"], "plugins": ["polyfill-setimmediate"] }
内容的提问来源于stack exchange,提问作者J Guerrero
相关产品推荐
相关产品推荐

