😩 RN 踩坑实录(2025)

294 阅读4分钟

我踩过的 RN 开发大坑(2025 版)

写给和我一样,在 React Native(RN)世界里一路踩坑、一路成长的开发者。

我从 2023 年开始接触 RN,一路走到现在,做过几个完整项目,期间踩的坑比写的组件还多。
这篇总结不是纯教程,而是我真实开发中遇到的 血泪坑 + 解决方案,希望能让后来人少走弯路。


一、环境配置:地狱开局

RN 的环境配置简直是“劝退第一关”。
尤其是 Mac + iOS + Android 三端同时开发的时候,问题多到想退圈。

坑 1:npx react-native run-ios 启动不了模拟器

  • 报错Command PhaseScriptExecution failed with a nonzero exit code

  • 原因:Xcode 版本和 RN 版本不兼容,或者 Pod 没装全。

  • 解决

    cd ios
    pod install --repo-update
    cd ..
    npx react-native run-ios
    

    如果还不行,清缓存:

    npx react-native-clean-project
    

坑 2:Android 构建报错 Could not find com.android.tools.build:gradle

  • 原因gradle 版本和 Android Gradle Plugin 不匹配。

  • 解决

    • 打开 android/build.gradle

    • 对照 官方兼容表,更新版本:

      dependencies {
          classpath("com.android.tools.build:gradle:8.2.2")
      }
      
    • 然后在 gradle-wrapper.properties 同步更新:

      distributionUrl=https://services.gradle.org/distributions/gradle-8.5-bin.zip
      

小提示:每次 React Native 升级,都可能带崩 Android 构建。升级前先 git commit


二、依赖冲突:RN 的“隐形杀手”

RN 项目里依赖多、版本杂,一不小心就能踩爆。

坑 3:Unable to load script from assets 'index.android.bundle'

  • 原因:构建时 JS bundle 没打进去。

  • 解决

    cd android
    ./gradlew clean
    cd ..
    npx react-native run-android
    

    或者手动打包:

    npx react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res
    

坑 4:第三方库版本地狱

比如装了 react-native-reanimatedreact-navigationreact-native-gesture-handler 等后疯狂报错。

经验总结

  1. 版本锁死,不要随意 npm install 最新版。

  2. 查看兼容矩阵,比如:

  3. 升级时用:

    npx expo-doctor
    npx react-native doctor
    

三、iOS 构建 & Xcode 踩坑

坑 5:Undefined symbol: _swift_getFunctionReplacement

  • 原因:Swift 版本不匹配。

  • 解决

    • Xcode → 项目 → Build Settings → Swift Language Version 改为最新
    • 清理缓存重新编译

坑 6:No bundle URL present

  • 原因:RN 的 JS 打包服务没启动。

  • 解决

    npx react-native start
    

    或者用 Xcode 运行时,先点开 Terminal 启动 Metro,再点 Run。


四、性能坑:别让 RN 卡成 PPT

RN 性能问题主要集中在两个地方:

  • 列表渲染卡顿(FlatList)
  • 频繁的状态更新(useState/useEffect)

坑 7:FlatList 一滑就卡

  • 原因:未加 key、renderItem 未 memo 化、item 组件太重。

  • 解决

    <FlatList
      data={data}
      keyExtractor={(item) => item.id.toString()}
      renderItem={renderItem}
      windowSize={10}
      initialNumToRender={10}
      maxToRenderPerBatch={10}
      removeClippedSubviews
    />
    

    并用 React.memo() 优化子组件。


坑 8:频繁 setState 导致掉帧

解决方案

  • 用 useMemo / useCallback 缓存函数和对象。
  • 把状态下放到子组件,减少父组件刷新。
  • 使用 react-native-reanimated 做动画而不是 JS 动画。

五、真机调试与发布坑

坑 9:iOS 真机无法连接 Metro

  • 原因:局域网 IP 不通 / 防火墙 / 网络隔离

  • 解决

    • Mac 和 iPhone 保证在同一个 Wi-Fi

    • 在 AppDelegate.m 中确认 JS Bundle 的 IP:

      jsCodeLocation = [[RCTBundleURLProvider sharedSettings]
        jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
      
    • 如果仍不行,关掉 VPN 或代理。


坑 10:App 打 release 包后白屏

  • 原因:打包时没带上 JS bundle 或图片资源。

  • 解决

    npx react-native bundle --platform ios --dev false --entry-file index.js --bundle-output ios/main.jsbundle --assets-dest ios
    

    然后再 Archive


六、RN 升级:最痛但必须经历

每次升级 RN,就像换引擎的手术。
升级前一定要备份。

升级命令:

npx react-native upgrade

建议使用 react-native-upgrade-helper 对比变更,一行一行改。
别图快。


七、我现在的开发习惯(血泪换来的)

  1. 所有依赖版本写死,不用 ^
  2. 每次 npm install 前 git commit 一次
  3. Android/iOS 构建都打一次 release 测试
  4. 用 TypeScript,早点上,越早越省心
  5. 保持 RN 最新小版本(比如 0.76.x),但不追大版本首发

写在最后

RN 不是完美的框架,它的魅力和痛苦是并存的。
它让我能用一套代码跑两端,但也让我无数次怀疑人生。

不过,当我最终看到自己的 App 在两端都顺利运行时,那种成就感确实值了。


 互动区:
你在 RN 开发中踩过哪些离谱的坑?
比如我之前打包时发现“按钮文字竟然变成乱码”,差点崩溃 😂
欢迎评论分享,你的坑也可能救别人一命。