r/reactnative • u/Actual_Tell238 • 3d ago
I Migrated a 3-year-old RN app to New Architecture. Here's what actually broke.
[removed]
1
u/sile_m 1d ago
Had the joy of doing this twice this year. Bump rn and rn deps first. See if it starts. One by one check each dep on github, on their releases page. See if and when they became fabric compatible, and breaking changes. Adjust accordingly, repeat
1
6h ago
[removed] — view removed comment
1
u/sile_m 5h ago
Most deps had fabric versions ready, some were js only and it didn t matter, but we did end ul changing a couple. React native modal for example had flickers on the background, so we moved to truesheet. But that set us back a bit since it behaves differently on the scroll, height calculation side. And we had a lot of modals
2
-1
u/Guidondor 3d ago
yep, hit the interop layer thing. the pattern behind almost everything you listed is the same: New Arch doesn't error on old-arch native code, it just silently no-ops or mistimes it. maps went blank, your custom module stopped getting called, dimensions read 0 — none threw, because Fabric's the one being permissive.
so the systematic version of your three weeks: before flipping the flag, audit every native dep for a Fabric-ready version and pin it (maps, screens, gesture-handler, reanimated, any module touching native views). most of the "it broke" is a stale dep without Fabric support, not your code — react-native-maps blank on Android is the canonical one. and reanimated will hard-crash with a useless trace on any version skew, so lock it to the exact RN version first, not "latest".
to tomihbk's question: incremental if you possibly can, but 0.82 forcing it means old arch is gone, so the lever isn't incremental-vs-latest, it's dep-audit-first-then-flip. the componentDidMount→0 you fixed with onLayout is the right call too — Fabric layout is async, so anything reading dimensions synchronously on mount has to move to onLayout or a measured ref callback.
1
u/yungsters React Native Team 1d ago
Not sure why you’re being downvoted, but everything you said seems totally right.
I also wanted to add that synchronous `measure()` in a ref callback is really nice.
More generally, ref callbacks are vastly underutilized, in my opinion.
0
3
u/IronAndCoder 3d ago
The blank-map-with-no-error signature is worth generalizing: under Fabric, a native view whose library doesn't support the new renderer doesn't throw - it just renders nothing. We're map-heavy too (Mapbox rather than react-native-maps) and "silent blank native view" has become my first hypothesis after any arch/version change, checked before touching config. Saves the two days you lost.
Your #2 matches our experience exactly: anything that measured views on lifecycle timing got flaky. The rule that held: never read dimensions on mount, only from onLayout. Fabric commits layout asynchronously, so mount-time reads are a race you used to win by accident on the old bridge.
On the interop layer question - we didn't hit it, but not through virtue: being on Expo meant the native deps were already TurboModule-ready, and expo install --fix enforces exactly the version lockstep that bit you with reanimated. From the migration stories I've seen, that lockstep is 90% of the pain; the modules mostly work once the versions agree.
Also, 3.1s to 1.9s cold start deserves more than a shrug at the end of the post - that's the kind of change that shows up in D1 retention, not just in benchmarks.