I think React Native solves an organizational bandwidth issue. Building true native applications per platform will always outshine any results you get from React Native, both in performance and capability. However, if you have just a few developers, I think React Native is a practicable compromise.
Companies like Airbnb have the engineering bandwidth to develop bespoke platform specific applications, it's up to you and/or the company you work for to know what compromises can be made.
You will still have to invest a lot to make a truly drop dead experience, but you have to do that anyway even in SwiftUI, which I found to be not so easy to just snap your fingers and have nice UX. There are many performance pitfalls there, and having to write your app 2-3 times means you have a lot less to invest into it.
The thing is, though, browser-based APIs let you do all of that now, in a way that is usually a lot simpler to access. In these cases it's often a lot easier to just build a Progressive Web App for Android (Google let's you put PWAs directly in the Play Store), and wrap that with a thin native wrapper for iOS.
One of the big "aha" moments I had was a couple years ago when I was trying out Stripe's Identity product, which lets you take a selfie and a picture of your ID for identity verification purposes. It's pretty amazing how Stripe was able to do the full image analysis (i.e. edge detection when you take a picture of your ID) solely with browser APIs.
With the big exception of games, there are a vanishingly small number of apps that really require native functionality these days, given what you can do in the browser.
In other words, these browser-tech-based apps show up in the app stores like any other app.
If you really do need the "slickness" of native apps, I wholeheartedly agree, go native, and use the native frameworks to do so.
The reason I don't like React Native much is that it occupies a "weird middle ground" - if you need the benefits of native, it's usually easier with less headaches to just go native (and big companies have announced ditching React Native due to this reason), but if you want to go cross-platform, there are other technologies that work better IMO.
I can point to a ton of RN apps that have incredible UX and surprisingly nice animations/interactivity, with what I'd argue is much easier to work with codebases. Maybe I'm biased, but the Uniswap app is really nicely done with all sorts of native views. They shipped the Android version of their app in just a few months, sharing 95% of the code with iOS.
It's a shame a duopoly controls one of the most important functions of modern society. Controls it, taxes it, prevents you from having a direct relationship with your customers ...
Egregious anti-trust.
I Androidland I mostly see websites pushing user to use apps, and users not using the apps because they're functionally identical to the website except they ceaselessly spam you with irrelevant notifications. Like the google app store feels cheap like a bargain bin, I don't think anyone expects to find anything serious in there.
Do you have any details on that Stripe app? I've found the browser camera handling lacking on mobile if you want to overlay it with a "position the subject here" rectangle, or display instructions alongside, or detect QR codes as well as other subjects. I'd like this to be an out-of-date view. I've been considering React Native for the next version, using https://github.com/mrousavy/react-native-vision-camera as it seems much more feature complete.
A surprising amount of apps on the app store were built like that.
Wouldn't it be simpler to just write everything in Flutter? The react + base swift modules looks like a maintainability nightmare, and especially consultants would never touch if the employee who wrote it ever left the company.
Even if flutter is good (and I don’t believe it’s all that great), you’re still taking a massive gamble adopting it, and that’s a huge leap that a significant portion of developers are not going to take.
Googles reputation for randomly ending the life of stuff makes flutter an impossible choice.
I get the point of reusing front-end expertise to develop other frontend code like desktop and mobile applications, but I struggle to understand the selling point of React Native. If I recall correctly React Native started as a personal project, and that's perfectly fine, but I don't understand who in their right mind would base their product on a convoluted and heterogeneous Jenga stack of technologies when all they need to do is just use the native frameworks.
1. If you truly need all the advantages of native performance and integration, just go native. Yes, you'll need to "write it twice", but you'll find that it's actually easier to hire top notch iOS or Android devs in the first place (in my experience they tend to be partisans) with high productivity.
2. I think the biggest thing that has changed since React Native first came on the scene is that the browser-based cross-platform toolkits, things like the Capacitor framework (and starting with Progressive Web Apps in the first place), have gotten much better, and browser tech now gives loads of access to underlying devices and sensors (accelerometer, cameras, biometrics, etc.) React Native really came out with the idea of "I've got all these web devs, can I make them productive on native mobile?" I think things like Capacitor and their ilk are a much better option for this issue now.
So in my opinion, if you really need native, use the native frameworks, but if your app doesn't need that and you can do cross-platform, use one of the web-view-based cross-platform frameworks.
You don't think there's a lot of companies in that boat?
I was able to make a react-native app, targeting web first. Took a little under a year.
Took 1 month to get it working and deployed on both app stores to replace the apps our iOS and Android team used to work on natively.
I now maintain web, iOS, and Android, solely, with one codebase, 95% code shared.
We used to have at least two devs on each native platform. That saves about $600k/yr.
(browser-based cross-platform toolkits are a joke, they are not flexible, and are hard to extend)
I would have agreed with you say 5 or more years ago, but completely disagree now. I certainly don't think the better web-view-based frameworks have any more issues than React Native, and on the contrary I've seen React Native usually have more.
A webview-based framework has way too many limitations even to this day for us.
React Native has been able to provide a native-like experience for us with no issues.
If someone would make reasonably priced modules like this for CapacitorJS it'd be a good ecosystem, but instead we've got dying open source libraries, and extortionately priced addons (4 figure+) from the likes of Ionic.
If you try to make something real/production grade in Ionic, it will quickly disappoint.
Evan Bacon does some tweets on it, but it’s one of the most popular libraries when you filter for top 100 apps in almost any category in the App Store.
If you want an active community and a bootstrap repo that is very robust, check out Tamagui (my project) which makes building universal native and web apps a breeze.
This isn't coming from the usual "JavaScript is bad" crowd, but from someone who is generally quite favourable to JavaScript in general (while also recognizing its downsides). Overall, the experience is far from perfect, but I imagine you could make wonderful apps when you get the stack to work.
(In general, if there's one thing I can't stand, it's debugging toolchains and build systems. Extremely boring, frustrating and tedious.)
Libraries have always been a unique problem to React Native. A lot of the time not maintained, and can be low quality too - like half baked re-implementations of existing native components, skipping the whole ‘native’ part
There’s not really another cross platform mobile framework in the same league. Flutter exists, and has its positives, but will never be an amazing experience on iOS. They don’t use native components, and the native components can access OS stuff not accessible by people other than Apple
- Most of that work is just maintaining fidelity between the platforms
- Forever
- Likely unpaid
- The primary beneficiaries of your work are two of the biggest companies in the world
- Not be appreciated anyways
Takes a very specific kind of person to do it.
As React Native matured in the past few years, the community developed improved solutions to common problems, and many older stop-gaps were rendered obsolete. Perhaps that's what you're seeing.
The only major competitor to React Native that I'm aware of is Flutter, but it has several drawbacks that make me hesitate to recommend it.
The jank issue has been fairly minimized with Impeller, so performance-wide, it's fairly on par with RN. The only 2 issues I seem to find are the core Flutter team leaving Google, and Flutter web being unstable (and honestly I just wish they stopped developing for web and focusing on mobile). Another issue is learning a new language, but Dart being strongly typed makes it much easier to work with than Javascript.
In either case, RN and Flutter should be used only for the MVP stage, and once you can, you have to immediately switch to building on native at the right time.
At least with RN, there are thousands of React devs out there.
Of course, most companies hiring mobile devs do it wrong. Flutter hasn't been around long enough the same way React has, so years of experience is a meaningless metric here.
But these people can easily switch jobs and it’s doubtful most are ok to hitch their wagon to Flutter - a nascent framework with basically no crossover to web development and a big company behind it, known for killing its toys on a whim.
Much easier to just go do RN elsewhere.
Flutter did not come from nowhere, Dart is heavily inspired by Javascript and the rendering model is close to React.
The issue will rather be that they won't want to work on it due to their career than the pure tech capabilities.
The iOS issue is a minimal issue with the new Impeller API (not sure if you're updated on that). There is still a bit of jank, but between putting out an MVP vs another month for a native app, I'd say go with Flutter for the MVP. Then switch to native if your app takes off.
nb: RN, or Flutter are still more competitive than Maui however.
Part of the reason you see abandoned repos is because the community has adopted libraries like Reanimated, React Native Gesture Handler, and React Navigation, which offer a lot of leverage to implement ambitious animations and native experiences in JS/TS.
React Native is mature enough to build big apps, and the community is active. It's still necessary to reach into Swift/Kotlin to implement some things, but for large apps that's not an unexpected lift. For cross platform JS/TS apps, no alternative offers the code sharing and delivery flexibility advantages of RN. I expect it'll remain relevant due to it's unique advantages and the community library stack will continue to mature.
[1] https://discord.com/blog/android-react-native-framework-upda...
It's the same thing with the Flutter ecosystem. Half of the libraries I use in my existing projects haven't been updated in a year (they were active when I picked them). They still work, but considering Flutter (and Dart) move so fast, it gives me the heebie-jeebies.
If you're comfortable with JS, go for it (React Native). But before you commit, think ahead of the must-have UIUX features for your app and build a PoC. Don't be surprised when you can use built-in/stock camera access in less than an hour, but you need hundreds of hours to make a custom camera screen.
It's a large skillset people want - you need to know Javascript, then probably some HTML and CSS, then the React framework. Enough to get you a job as a React JS programmer - but then you should know React Native as well. Plus, RN does not cover every case, so know the Android ecosystem (Kotlin and Android SDK, plus maybe some Java) and the iOS ecosystem (Swift and iOS SDK, plus maybe some Objective C). Most large companies tend to have a separate Android and iOS app, although not all (Discord is React Native IIRC).
It makes some sense in a startup possibly - have a few RN programmers and have one or two dive into RN and do Android and iOS apps for your product, some of it using your existing codebase. From all I have heard, it does not scale, although maybe companies like Discord make it work for their use case. Once a Series A or series B kicks in, engineering has to stop and look whether they want to continue adding on to this rickety future, or get a small Android and iOS team together and do native apps.
My reasoning for wanting to use React Native is primarily because I think the iOS ecosystem is a real mess right now. SwiftUI is not mature, and UIKit is antiquated compared to the needs of today. If you’re just starting out, the force multiplier you get from RN is almost too difficult to ignore.
1) Even in the last couple years, React Native has gotten much better. The performance gap is not noticeable anymore. In fact, in some cases I think it has been easier get better performance in RN than using native.
2) It does feel like there was a wave where tons of libraries were created and then abandoned. But overall there are lots of libraries which are good and well maintained.
3) Native is still better if you need really tight experiences, but this gap is also closing. Since you can easily drop down to native, this issue shouldn’t be a big deal.
I make around $200k + equity as a Staff Engineer, fully remote, though as my company is also private, equity === 0. I would say I am moderately underpaid in the current market but I'm happy with that tradeoff since my company is fully remote, great work life balance, and I work with great people.
I have heard people recommend Flutter recently, but I have even less knowledge about that than the anecdata I have about React Native.
Flutter is sort of dying, it works for games or Android only apps, but anything with web or iOS will feel incredibly strange, slow and non native.
Do you have a citation or data to back that up? We've recently launched several cross-platform app rewrites in Flutter and from our perspective it seems like Flutter is really hitting its stride.
- https://news.ycombinator.com/item?id=38401242
- https://ln.hixie.ch/?start=1700627532&count=1 (this is one of the main Flutter contributors which has left google, which might be indicative that the project might lose funding)
We deploy a Flutter app to Android and iOS with a lot of native parts and it works flawlessly, fast and with native-feeling UI on both platforms. Even porting to Windows and Mac OS was relatively easy and provides a very fluent, albeit mobile-y application.
As someone who has tried most of the options for streaming realtime mobile app, I landed on RN/EXPO for the sole reason of community size and ease of use. Basically everything is possible!
Typical recommendation has been to build MVPs in RN and then switch to native after your raise funds, but strongly advise against it unless the nature of your app demands native implementation. You can stick with RN all the way to FB/Instagram scale!
Recently I started working on an mobile application as a personal project. It involves scraping web pages and generating ebooks from them with an inbuilt reader with visual controls.
I’d never worked with Swift or UIKit previously and I’ve worked professionally with React for a few years so I considered using React Native.
100s of abandoned repos, janky build tooling, a and a weird split with something called expo caused me to avoid React Native altogether and I’ve been happily learning SwiftUI and UIKit.
It’s not the worst thing in the world, but React Native makes your entire app feel kind of janky and clunky. It’s frustrating when something as simple as a push transition looks and works 1000X better with a few lines of SwiftUI.
Same can also be true of RN (or native!) of course, and I’m sure with enough work the apps in question could be made slicker and it probably wasn’t a priority; but they’re both developed by large companies and to me as an iOS user, feel pretty bad compared to their previous native implementation, so Flutter is definitely not a magic bullet.
MAUI has just gone through a rough migration from Xamarin and has some maturing to do, and developers are feeling neglected by Microsoft.
Cordova is Electron for phones - just do a PWA.
Kotlin multiplatform is good, but the Compose multiplatform has only Alpha support for iOS.
But — to my disbelief — I must admit that Flutter didn't just try, it actually nailed it. I can't tell the difference between a Flutter app and a native app in terms of look and feel.
Compose multiplatform uses Skia, so it suffers from the same shader compilation issues in iOS that Flutter has been suffering from all these years.
Better is subjective, faster - in my opinion - is no longer as much of a factor with even cheap modern phones unless you're doing something like AR. Not sure how you can build two native apps for cheaper though.
Jank... I agree there a little. I would say most of it can easily be avoided though if you've got developers who have native experience and know what they're looking at.
https://www.jetbrains.com/lp/compose-multiplatform/
I think it's new, and I haven't tried it myself.
If you're just getting started I highly recommend expo. I wrote an article on building a game using it over say unity not too long ago https://parrisneeds.coffee/posts/making-a-game-in-react-nati...
A lot of SaaS providers offer React Native components that are ready to go, even newish startups. The ecosystem feels strong and it's way more economical than writing two separate apps.
You want a primarily information-oriented software, without lots of manipulation/interaction, then go with Webview based solutions (capacitor + react).
You want performant manipulation/interactive software, go native.
https://devblogs.microsoft.com/react-native/2023-09-08-rneu-...
The expo approach to generating the native projects is just better than the OOB react-native stuff which makes upgrades extremely tedious.