True native development is, indeed, much better. But a small team will be hard-pressed for doing good work on both platforms, especially once you start fiddling with more important APIs. Configuration and getting your system to compile things to properly is almost a job in itself. Sigh.
KMM, Flutter, and MAUI are all promising, but with different trade-offs.
So we’re stuck with RN/Expo… At least Expo promises some stability between upgrades, by handling the package compatibility checks for you. Well, when it works.
“Make a progressive web app”: yes, that might be the way to go; provided you can get the users to ‘install’ it on their devices. For some companies that’s not optional due to different pressures (e.g. teachers would expect students to have our app installed on their phones).
Neither of these 2 solutions is that simple. There are trade-offs involved, and each team must compromise where they can/are weaker. All in all, if you MUST do RN, at least Expo saves you a lot of headaches with config/build/compatibility. It’s mediocre, but worlds better than pure RN (at least for me).
Sounded like a preferable approach to dealing with the complexity and limitations of RN and multi-platform. I wonder why more teams haven’t gone with this type of approach…
https://standardnotes.com/blog/react-native-is-not-the-futur...
Assuming you're talking about the not-well-known process of adding PWAs to the Home screen, it's worth noting that you can package web apps for app store distribution as well. https://capacitorjs.com/
Thanks for the tip tho :)
I wish things were different. It would have saved our company almost a year's worth of development on a pwa.
The story on iOS is much worse, naturally. But if you can get past getting users to actually install the app the rest of the experience is acceptable.
If PWAs were actually used by the mass markets, I'd go with that option, but the fact is they're not, and you can't expect to force your users to learn a new behaviour like that.
Maybe I'm too optimistic but as a web developer I loved being given the opportunity to learn some Swift and Kotlin. Compared to Objective C and Java they are really very approachable for JS devs and with not all that much work you'll end up with a deeper bench of developers more satisfied with their jobs.
Almost all of the best apps made with Expo also have a small amount of custom native code. And I find it's just generally good to understand the abstraction layer above and the abstraction layer below the one you're working at to bring the two together the best you can.
[development-builds]: https://docs.expo.dev/develop/development-builds/introductio... [expo-modules]: https://docs.expo.dev/modules/overview/
The best Android app for a product I've used is the AnonAddy app. It's stylish Material You while feeling very custom and tailored.
For instance, navigation is one of the more complicated parts of an app's UX. The navigator UI has many subtle behaviors and animations that have been built over the course of several years, like how the back button and screen headers transition in and out. The gestures often have invisible hit boxes that are hard to replicate without using the system UI components. The screen transitions use specific animation curves users expect. And there's non-visual behavior like supporting universal deep links that take the user to a specific screen, which tends to require quite a bit of work to implement.
Expo uses the system UI components and the behaviors described above are present. The goal is for Expo UI to be native UI. And in some aspects, Expo can already provide a better default user experience like with universal links. Every screen gets a URL with Expo Router since URLs are a first-class concept, like they are on the web. This lets us provide deep linking (navigate from URL to a screen) and universal linking (HTTPS links work across web and native) as default features.
Sometimes the way we talk about Expo is that it brings together the best of native and web, and a lot of that is the user experience of native applications with the developer experience of the web.
My advice these days is to go in one of two directions:
- make a progressive web app. No, it’s not a native experience. But if your priority is cross platform then this is cross platform. Service Workers etc make it a ton more paletable than it was back in the day.
- make native UI and code your business logic in some kind of shared layer (Rust, Go, Kotlin Multiplatform). Native UI has come a long way too, as someone who speaks webdev I find SwiftUI and Jetpack Compose to be very grokkable compared to their predecessors, a lot like React if you squint a little.