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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:58:14