Commit No Bug
Published on

Switching from React Native to React/Next.js

Authors
Landscape tech illustration showing a migration from React Native (mobile phone UI panel) to React/Next.js (desktop web/SSR panel), with a central transition arrow on a modern dark background.

What React Native actually asks of you

On paper, React Native sounds like a good deal. Write JavaScript, ship to both Android and iOS. One codebase, two platforms.

In practice, it is messier than that. Both platforms mean both sets of bugs. A permission that works on one Android version breaks on another higher Android version. This is exactly what happened with my Voice Timer app, where background execution couldn't be started from the background on Android 14, while it worked on Android 13. You end up writing platform-specific code anyway with native modules when JavaScript can not reach far enough.

Again, there are multiple cases where I had to write native code. One of them is to understand when a microphone is wanted by another app, so that my Voice Timer app doesn't crash. Another one is to accept phone calls (One of my favorite features :)). The third one is to understand whether the app window is minimized only or fully closed. And there are other cases too.

What you are actually giving up

Not as much as you think.

React Native made sense in an era when mobile apps needed native capabilities and PWAs were not a real option. That era is mostly over.

A Progressive Web App today covers most of what a consumer app actually needs: installable from the browser, works offline with a service worker, can send push notifications on Android, has access to the camera, geolocation, clipboard, and storage. It loads fast, updates silently, and does not require an app store submission.

Most of what your app needs is covered. Push notifications work on Android, and most common app features are covered. iOS gives you less. If your app needs deep device access, you still need to go native - whether that is pure Kotlin and Swift, or React Native with native modules.

But most apps do not need deep device access. Most apps are UI over an API. For those, a well-built Next.js app with a PWA manifest does the job, and you built it once for every platform at once. My Sea Battle game is a PWA app.

The other side of the switch

React and Next.js are not without friction. The mental model for server vs client components takes adjustment. Caching behavior changed enough between versions that you need to relearn it.

But the tooling is better. The community is larger. The deployment story is simpler - push to Vercel or any static host, and it is done. And there are other benefits.

Conclusion

If your app needs Bluetooth, NFC, USB, or tightly integrated background processing - stay native or use React Native.

If you are already deep in React Native and it is working, there is no reason to switch just to switch.

But if you are starting something new or reconsidering your stack, and your app is UI over an API with maybe some offline support? Built it in Next.js, a manifest and a service worker, and ship it everywhere at once.

The bridge was never the fun part anyway. Writing Kotlin/Java to expose a native API, debugging across two layers, and hoping the JavaScript side gets the right value back - that is the part nobody misses.

Found this helpful? Please share it with someone who also might find it helpful. Would you like more posts from me? Subscribe to the newsletter. Got questions? Send an email to commitnobug@outlook.com.