I remember the first time I opened a React Native project. I thought, I already know React, how different can this be?
Pretty different, it turns out.
Here's what I wish someone had told me before I wasted time figuring it out myself.
The bridge is not free
Early on I treated React Native like a browser. I passed big objects around, called native modules constantly, didn't think twice about it. Then I started noticing janky animations and sluggish interactions.
The JavaScript thread and the native thread are separate. Every time they talk to each other there's a cost. The more you understand that, the better decisions you make about where logic lives and how often you cross that bridge.
StyleSheet.create is not just for organization
I was using inline styles everywhere when I started because it felt easier. Turns out StyleSheet.create isn't just a pattern for keeping things tidy. It validates styles at compile time and optimizes them so they don't get recreated on every render.
Small thing but it adds up across a whole app.
FlatList will bite you if you ignore it
I made the mistake of rendering long lists with a plain ScrollView early on. It works, until it doesn't. FlatList exists for a reason. It only renders what's on screen. Once your list grows past a certain point, the difference is night and day.
Also, always set keyExtractor. Don't let React Native guess.
Navigation state is its own beast
Coming from web, I assumed routing would feel familiar. It doesn't, not really. React Navigation has its own mental model and the stack, tab, and drawer navigators each behave differently. I spent way too long fighting navigation bugs that were actually me misunderstanding how the navigator was managing state.
Read the docs properly before you build. It saves you a lot of pain later.
Test on a real device early
The simulator is convenient but it lies to you. Performance feels fine in the simulator and then you run it on a mid-range Android and everything falls apart. I learned to keep a physical device nearby from day one.
Also, Android and iOS behave differently more often than you'd expect. Don't assume something works on both just because it works on one.
Expo is not cheating
There was a phase where I thought using Expo meant I wasn't doing it properly. That's nonsense. Expo managed workflow is legitimate and handles a lot of the setup and tooling pain so you can focus on actually building. When you need bare metal access you can eject. But start simple until you have a reason not to.
The ecosystem moves fast
Libraries you depend on today might be unmaintained in a year. React Native itself ships breaking changes. I learned to be intentional about what I pull in and to keep an eye on the health of dependencies before committing to them in a production app.
React Native is genuinely great once you understand how it works under the hood. Most of the frustration early on comes from treating it like the web when it isn't. The sooner you accept that, the faster things click.
Top comments (0)