React-native-mapbox Draw Features? - react-native

I want to add react native mapbox a draw features. Like here https://codesandbox.io/s/xenodochial-tu-pwly8?file=/src/index.js:0-978
Is something like this possible ?

MapBox has it's React Native SDK (react-native-mapbox-gl). they're actively maintaining the repo with bugFixes and feature implementations.
Current Version: React Native MapBox GL Release 6.1.1.
Expo Support: Feature request open with Expo if you want to see it get in show your support https://expo.canny.io/feature-requests/p/add-mapbox-gl-support
Deprecation Notice: (Just moved to active community driven repository)
This repository is no longer actively maintained. Continued
development of react-native-mapbox-gl may be found in the community
driven repository at https://github.com/react-native-mapbox-gl/maps.
This new repository uses the latest versions of the MapBox SDKs for
iOS and Android, and contains a long range of improvements over the
current one. We recommend you review the change log for the new
repository and transition to it. This repository will only accept PR's
containing bug fixes. Any new feature development will happen in the
new repository.
For more information, check out Getting Started section
https://github.com/nitaliano/react-native-mapbox-gl/tree/master/example

Related

What is the difference between Expo CLI and React Native CLI? [duplicate]

From the Expo website
Expo lets web developers build truly native apps that work across both iOS and Android by writing them once in just JavaScript.
Isn't this what React Native does? What's the difference?
When you write code in Expo you are writing React Native code. Expo has
two main pieces:
Expo CLI (expo-cli): a developer tool for creating projects, viewing logs, opening on your device, publishing, etc.
Expo client: an app on your phone that lets you open your projects
while you're working on them, without needing to go through XCode or Android Studio, and also lets other people view them too! And if you publish it through expo-cli, people can access it at any time through the Expo client on Android or on iOS if signed in to the same account it was published with. Lastly, we also make it possible to build standalone apps so people don't have to use the Expo client to open it, and you can distribute to the app store and play store if you like.
So Expo is a set of tools built on top of React Native. These tools depend on one key belief held at Expo: it's possible to build most apps without ever needing to write native code, provided that you have a comprehensive set of APIs exposed to JavaScript.
This is important because with React Native you can always drop down to native code. This is incredibly helpful sometimes but it comes at a cost: you need to send people your binaries if you want them to test them, someone on the other side of the world can't just tap a link to open it while you're working on it and you can't just publish it with one click for someone to access it similar to how you would in a browser.
With Expo, we suggest that try to avoid dropping down to native code, if you can. As I mentioned above, we think that with a comprehensive set of APIs available to JavaScript, this shouldn't be necessary for most apps. So, we aim to provide this comprehensive set of APIs, and then build all of the awesome tooling that can exist in a world where the native runtime is shared.
However, if you must find that you want to drop down to native, you can use eject and continue using the native APIs that Expo gives you while having the same level of control as you would in any native project.
Read more about ejecting
A summary of the documentation and answers from Expo employees:
React Native init:
Advantages
You can add native modules written in Java or Objective-C (probably the only but the strongest one)
Disadvantages
Needs Android Studio and Xcode to run the projects
You can't develop for iOS without having a Mac
Device has to be connected via USB to use it for testing
Fonts need to be imported manually in Xcode
If you want to share the app you need to send the whole .apk / .ipa file
Does not provide JavaScript APIs out of the box, e.g., Push-Notifications, Asset Manager, they need to be manually installed and linked with npm for example
Setting up a working project properly (including device configuration) is rather complicated and can take time
Expo
Advantages
Setting up a project is easy and can be done in minutes
You (and other people) can open the project while you're working on it
Sharing the app is easy (via a QR code or link), you don't have to send the whole .apk or .ipa file
No build necessary to run the app
Integrates some basic libraries in a standard project (Push Notifications, Asset Manager, etc.)
You can eject it to ExpoKit and integrate native code continuing using some of the Expo features, but not all of them
Expo can build .apk and .ipa files (distribution to stores possible with Expo)
Disadvantages
You can't add native modules (probably a game changer for some)
You can't use libraries that use native code in Objective-C/Java
The standard Hello World app is about 25MB big (because of the integrated libraries)
If you want to use: FaceDetector, ARKit, or Payments you need to eject it to ExpoKit
Ejecting it to ExpoKit has a trade-off of features of Expo, e.g. you cannot share via a QR code
When ejecting to ExpoKit you are limited to the react-native version that is supported by ExpoKit then
Debugging in ExpoKit (with native modules) is a lot more complicated, since it mixes two languages and different libraries (no official Expo support any more)
Sources:
Detaching Expo Apps to ExpoKit: Concepts
Difference between react-native-init and create-react-native-app #516
Ejecting to ExpoKit
The answer of Brent Vatne is fine, but I'd like to add some details.
Expo expands the API surface of React Native
React Native does not give you all the JavaScript APIs you need out of the box, but only most primitive features. React Native developers are expected to use Android Studio or Xcode to link additional native libraries.
Expo aims to enhance React Native and provide all the JavaScript APIs you need for the most common needs. It is basically a set of well-defined quality native libs already packaged for you in a single lib: ExpoKit. Sometimes these libraries are actually already existing in the React Native world, and integrated into ExpoKit.
It is also important to notice that the Expo team can't include every library out there into ExpoKit (which may create some frustration) because the Hello, World! app size would grow, as it would ship a lot of API's that wouldn't be used in most apps.
Expo provides over-the-air JavaScript updates
Like other systems (CodePush, etc.), Expo provides a system to update your app over the air. This means you upload your JavaScript bundle on a CDN and the mobile apps will automatically download and use the new JavaScript code on next startup (without requesting a publication/review from the stores).
Expo provides a CLI tool to upload/manage the JavaScript bundles on their CDN. For development you can also choose to become the CDN and host the JavaScript bundle on localhost. And Expo XDE is just a visual wrapper on the CLI.
Expo provides a generic client
The Expo client is a generic client that permits to load any app that is compatible with Expo. All the Expo apps do share the exact same native runtime (React Native + ExpoKit). The only difference is the JavaScript code that we give them. The Expo apps you publish to the app stores have your JavaScript bundle URL hardcoded in it. The Expo client is build in a specific way so that you can choose from which URL to load the JS, by scanning a QR code or providing a URL.
Note that this client can also load JavaScript bundles from localhost, and make your development experience easier: There isn't any need for Xcode or Android Studio, and it gets much faster to get your first Hello, World! app running on the phone (from hours to minutes). You can actually develop on an iPhone without a Mac and the setup takes two minutes.
Actually, as the Expo SDK can be upgraded, the Expo client includes a compatibility layer so that it is able to run the last five SDK versions.
Expo provides a build service
As all the Expo apps share the same native code, Expo is able to easily build these apps for you. They have created a cloud build service.
The major thing that differentiate two apps built by Expo is just the hardcoded URL to which the app is supposed to download the JavaScript bundle to run.
Expo does some other things for you, like providing a declarative way to setup app icons, orientations, permissions, API keys, helping you setup push notifications, provisioning profiles... many settings have to be hardcoded at build time in the app and can't be changed over the air.
Expo is to React Native what PhoneGap is to Cordova
React Native is similar Cordova. It is not the same view technology (native vs webview), but both allow you to control native features from JavaScript, and both offer a plugin system so that developers can easily add new JavaScript and native bindings.
PhoneGap is similar to Expo. They both try to enrich the raw API of the underlying platform they are built on with a predefined set of additional native plugins. PhoneGap also offers a build service and has a generic client that work as long as you use the approved plugins.
Conclusion
As you can see, Expo is a set of tools. At the end, it permits to easily develop, share and publish to the stores your mobile projects. It is quite similar to the PhoneGap experience (but a lot better and less confusing).
I will definitively recommend Expo for any new React Native greenfield project, except these two cases:
You already know you need API's that are not available in Expo and won't be anytime soon
You care a lot about your app size (Hello, World! is more than 25 MB due to the large size of ExpoKit, but after that it does not increase much as it is just JavaScript)
It is explained in the official Expo documentation
What is the difference between Expo and React Native?
Expo is kind of like Rails for React Native. Lots of things are set up for you, so it’s quicker to get started and on the right path.
With Expo, you don’t need Xcode or Android Studio. You just write JavaScript using whatever text editor you are comfortable with (Atom, vim, emacs, Sublime, VS Code, whatever you like). You can run XDE (our desktop software) on Mac, Windows, and Linux.
Here are some of the things Expo gives you out of the box that work right away:
Support for iOS and Android
You can use apps written in Expo on both iOS and Android right out of the box. You don’t need to go through a separate build process for each one. Just open any Expo app in the Expo Client app from the App Store on either iOS or Android (or in a simulator or emulator on your computer).
Push Notifications
Push notifications work right out of the box across both iOS and Android, using a single, unified API. You don’t have to set up APNS and GCM/FCM or configure ZeroPush or anything like that. We think we’ve made this as easy as it can be right now.
Facebook Login
This can take a long time to get set up properly yourself, but you should be able to get it working in 10 minutes or less on Expo.
Instant Updating
All Expo apps can be updated in seconds by just clicking Publish in XDE. You don’t have to set anything up; it just works this way. If you aren’t using Expo, you’d either use Microsoft Code Push or roll your own solution for this problem
Asset Management
Images, videos, fonts, etc. are all distributed dynamically over the Internet with Expo. This means they work with instant updating and can be changed on the fly. The asset management system built-in to Expo takes care of uploading all the assets in your repo to a CDN so they’ll load quickly for anyone.
Without Expo, the normal thing to do is to bundle your assets into your app which means you can’t change them. Or you’d have to manage putting your assets on a CDN or similar yourself.
Easier Updating To New React Native Releases
We do new releases of Expo every few weeks. You can stay on an old version of React Native if you like, or upgrade to a new one, without worrying about rebuilding your app binary. You can worry about upgrading the JavaScript on your own time.
But no native modules…
The most limiting thing about Expo is that you can’t add in your own native modules without detaching and using ExpoKit.
Expo CLI
Pros:
No need to install Android Studio or Xcode to start building.
Not a lot of configuration required.
Mobile UI to easily view on both Android and iPhone using barcode scanning. Also easier to view with online iPhone and Android simulators.
Faster setup and development.
Cons:
Native dependencies cannot be added.
Creating .apk and .ipa files is difficult.
Size of apk/ipa is huge.
React Native CLI
Pros:
Easily add native dependencies.
Creating .apk and .ipa files is much easier than with Expo
Note: React Native CLI is the framework to use to work directly with the React Native framework.
Cons:
High level of configuration required.
Basic knowledge of Android and iOS folder structure required.
As you can see, both approaches have their pros and cons; you should always decide which to use based on your needs for the project.
The answers about advantages and disadvantages of Expo and React Native CLI are complete. I want to mention another point as my personal experience.
Expo contains many modules by default in the project and it makes easier to work with it. But it has a big problem in the production phase, because the built Android and iOS versions have such a great size. For example, if you have a single page with a 'Hello, World!', the APK file size would be about 19 MB. Having a same project in React Native CLI will result in an app with the size of 6 MB.
So personally I do not recommend using Expo if you want to develop a commercial app.
I would make a note here that Expo is using an older version of React, 16.5, which would prohibit you from using the new hooks feature.
If you decide to go with Expo, be mindful to watch your version controls. Older versions of, say, react-navigation will need to be used with the 16.5 version if you are getting weird errors.
Expo is a wrapper of React Native CLI, which does things under the hood for the ease of developers. The most common problem that Expo solves is that the developer doesn't have to worry about the linking issues of the libraries that often occur in React Native CLI. Expo comes up with tons of libraries now that are extremely helpful for robust development. One of the benefits of Expo is you can develop an app for Android and iOS without having a Mac through Expo mobile application.
As it has tons of benefits, there are some cons of using Expo:
App size increases like hell. A simple Hello, World! app size is more than 30 MB
At times when you need to implement some native functionality into your app, you will need to eject from Expo and go back to React Native CLI. And you can never revert it back to Expo CLI.
I've experienced more than a year that works with Expo.
If the size of the app is not important for you, use Expo because it's easy to implement Map and Push easier than React-native, but at the end of the project, if you want to publish app in Google Play or another store, you have a challenge removing some permissions in your APK.
In React Native you can change everything, but for importing some library, such as push notification or the map, it needs some challenges too, because you have to add these libraries manually to Android and iOS projects.
A summary of the documentation and answers from Expo employees:
React Native init:
Advantages
You can add native modules written in Java or Objective-C (probably the only but the strongest one)
Disadvantages
Needs Android Studio and Xcode to run the projects
You can't develop for iOS without having a Mac
Device has to be connected via USB to use it for testing
Fonts need to be imported manually in Xcode
If you want to share the app you need to send the whole .apk / .ipa file
Does not provide JavaScript APIs out of the box, e.g., Push-Notifications, Asset Manager, they need to be manually installed and linked with npm for example
Setting up a working project properly (including device configuration) is rather complicated and can take time
Expo
Advantages
Setting up a project is easy and can be done in minutes
You (and other people) can open the project while you're working on it
Sharing the app is easy (via a QR code or link), you don't have to send the whole .apk or .ipa file
No build necessary to run the app
Integrates some basic libraries in a standard project (Push Notifications, Asset Manager, etc.)
You can eject it to ExpoKit and integrate native code continuing using some of the Expo features, but not all of them
Expo can build .apk and .ipa files (distribution to stores possible with Expo)
Disadvantages
You can't add native modules (probably a game changer for some)
You can't use libraries that use native code in Objective-C/Java
The standard Hello World app is about 25MB big (because of the integrated libraries)
If you want to use: FaceDetector, ARKit, or Payments you need to eject it to ExpoKit
Ejecting it to ExpoKit has a trade-off of features of Expo, e.g. you cannot share via a QR code
When ejecting to ExpoKit you are limited to the react-native version that is supported by ExpoKit then
Debugging in ExpoKit (with native modules) is a lot more complicated, since it mixes two languages and different libraries (no official Expo support any more)
Expo and React Native are two popular tools for building mobile apps, but they have some differences. Expo is a free and open-source platform that allows developers to quickly build apps with JavaScript and React Native. It provides a set of tools, libraries, and services that make it easier to get started with building a mobile app. React Native, on the other hand, is a framework for building mobile apps using React. React Native provides a more direct way to access native APIs and components, and allows for more customization and control over the app development process. In summary, Expo provides a faster and easier way to get started with building a mobile app, while React Native provides more control and customization.
Another difference between Expo and React Native is the deployment process. With Expo, you can publish your app directly to the app stores with just a few clicks. You can also take advantage of other services that Expo provides, such as push notifications and authentication. On the other hand, when building a React Native app, you'll need to use tools like Xcode or Android Studio to compile and package the app for deployment. Additionally, you'll have to handle the distribution process yourself, which can be time-consuming and complex.
In terms of performance, React Native generally has better performance compared to Expo as it has a direct access to native APIs and components, whereas Expo relies on its SDK. However, the performance difference may not be significant in many cases.
In conclusion, both Expo and React Native have their own pros and cons, and the choice between them depends on the specific requirements and goals of your project. If you're just starting out with mobile app development and want a fast and easy way to get started, Expo is a great option. However, if you want more control and customization, React Native might be the better choice.

I need help uploading something to expo

I want to create my own podcast app.
I found this pre-written code online (github.com/diego3g/rocketcasts) and want to tweak it in order to create my own app.
How do I upload this code into expo?
Unfortunately that React-Native app was not built using Expo. You can tell because it has ios and android folders in its root directory.
Digging deeper you can see that it uses react-native-config as a dependency. This dependency requires access to native code, which Expo does not allow. You would have to go through and remove any dependency that requires native code if you wish to use Expo. This may remove functionality and could take some time to resolve issues.
Also this application was built using react-native: 0.47.2. Currently the most recent version of react-native is 0.57.8 with 0.58.0 just around the corner. That is quite a jump to make if you plan on upgrading the react-native version. Upgrading RN is not as simple as just changing a version code.
Similarly the repos last commit was over a year ago. That means that the majority of dependencies will be out of date and will need upgraded. Again, some dependencies aren’t a simple upgrade you would need to check every single one to make sure that it doesn’t cause unforeseen problems. You would also need to check their compatibility with Expo.
Personally I wouldn’t copy the project. I would look at how they have implemented the functionality and then in a new react-native project I would re-implement the functionality. That way all dependencies would be up to date and you would know that it would work.
Going down the path of editing an existing project like this one may be quite a challenge.
Either way good luck.
You can find more information about Expo here https://docs.expo.io/
And you can find a good explanation of the differences between Expo and react-native init here What is the difference between Expo and React Native?
The standard way to tweak an existing GitHub repository you don't own is to:
fork the repo (that is a GitHub operation, creating a copy of the repo in your account)
clone it and modify it: you can then push back to your GitHub fork.

react-native code push: allowable code change?

I'm using react-native-code-push for my app.
I had released several versions that change only a few of js bugs, which worked fine.
Recently I realized that if a code pushed release involves any change of native code other than javascript, the app crashes while updating. I added several react native packages that need manual linking such as react-native-maps, and released update to some targeted versions hoping them to take those, but no luck.
Then what if an update only involves adding light libraries (using npm install) which don't require native linking? I wonder to what extent exactly the code push allows client-side code updating.
Basically, when you want to add some native code involving link you will have to rebuild your apk / ipa and re-upload it to the stores. If you want to add a new plugin without link there should not be any problem
One advice I could give is to only push bug fixes to your production app. You should not push new features with codepush since apple review (almost) all the applications.

React Native Bundle Compatibility

React Native seems to be a great platform to create apps that run under both iOS and Android. It's great that I can push a new bundle to my clients without having to submit a new native version for review.
One thing that worries me is new React Native versions. On GitHub I see an average of three new versions per month. New native versions often include important bug fixes, but my question is will they break compatibility with my javascript bundle (the actual React app)?
People sometimes take a while in updating the native app. So will that mean that I will have to maintain a spider-web of bundle versions that match their native app versions?
Something like this will quickly become a mess:
bundle 1.0 for native app 1.0 (with React Native 0.37)
bundle 1.1 for native app 1.0 (with React Native 0.37)
bundle 1.2 for native app 1.0 (with React Native 0.37)
bundle 1.0 for native app 1.1 (with React Native 0.37.1)
bundle 1.1 for native app 1.1 (with React Native 0.37.1)
bundle 1.2 for native app 1.1 (with React Native 0.37.1)
bundle 1.1 for native app 1.2 (with React Native 0.38)
bundle 1.2 for native app 1.2 (with React Native 0.38)
New versions are common, but they aren't commonly interface breaking. In software development API breaking changes are only normally permitted in major version releases, not minor versions.
Additionally, things aren't just removed. If an api-breaking change is made it will often be marked as "deprecated" and not be REALLY removed until several versions later. This gives you time to make changes to your application in the event of some breaking change.
In short, yes React-native is rapidly getting new releases, but no the interface should not be changed so often that it will be as severe a problem as in your example.
Disclaimer: I'm not a developer on React-native nor a contributor, so I cannot say how strict they are with their versioning policies. I will link to several documents from react-native and react as a source, though.
You can also keep track of the react-native changelog on their github releases page.
React's official documentation links here in reference to their versioning semantics. You can see it linked, and more contribution guidelines here. It follows that react-native will follow similar policies.
Edit: I found react-native's contribution document and it seems that they are in fact a bit less strict about versioning semantics than React itself is. There isn't any link or specific section about versioning, but there is this quote
We will do our best to communicate these changes and version appropriately so you can lock into a specific version if need be
So I think it can be safely assumed that they will (mostly) follow the same guidelines as React itself, especially given that most contributors are from facebook itself.

What is the difference between Expo and React Native?

From the Expo website
Expo lets web developers build truly native apps that work across both iOS and Android by writing them once in just JavaScript.
Isn't this what React Native does? What's the difference?
When you write code in Expo you are writing React Native code. Expo has
two main pieces:
Expo CLI (expo-cli): a developer tool for creating projects, viewing logs, opening on your device, publishing, etc.
Expo client: an app on your phone that lets you open your projects
while you're working on them, without needing to go through XCode or Android Studio, and also lets other people view them too! And if you publish it through expo-cli, people can access it at any time through the Expo client on Android or on iOS if signed in to the same account it was published with. Lastly, we also make it possible to build standalone apps so people don't have to use the Expo client to open it, and you can distribute to the app store and play store if you like.
So Expo is a set of tools built on top of React Native. These tools depend on one key belief held at Expo: it's possible to build most apps without ever needing to write native code, provided that you have a comprehensive set of APIs exposed to JavaScript.
This is important because with React Native you can always drop down to native code. This is incredibly helpful sometimes but it comes at a cost: you need to send people your binaries if you want them to test them, someone on the other side of the world can't just tap a link to open it while you're working on it and you can't just publish it with one click for someone to access it similar to how you would in a browser.
With Expo, we suggest that try to avoid dropping down to native code, if you can. As I mentioned above, we think that with a comprehensive set of APIs available to JavaScript, this shouldn't be necessary for most apps. So, we aim to provide this comprehensive set of APIs, and then build all of the awesome tooling that can exist in a world where the native runtime is shared.
However, if you must find that you want to drop down to native, you can use eject and continue using the native APIs that Expo gives you while having the same level of control as you would in any native project.
Read more about ejecting
A summary of the documentation and answers from Expo employees:
React Native init:
Advantages
You can add native modules written in Java or Objective-C (probably the only but the strongest one)
Disadvantages
Needs Android Studio and Xcode to run the projects
You can't develop for iOS without having a Mac
Device has to be connected via USB to use it for testing
Fonts need to be imported manually in Xcode
If you want to share the app you need to send the whole .apk / .ipa file
Does not provide JavaScript APIs out of the box, e.g., Push-Notifications, Asset Manager, they need to be manually installed and linked with npm for example
Setting up a working project properly (including device configuration) is rather complicated and can take time
Expo
Advantages
Setting up a project is easy and can be done in minutes
You (and other people) can open the project while you're working on it
Sharing the app is easy (via a QR code or link), you don't have to send the whole .apk or .ipa file
No build necessary to run the app
Integrates some basic libraries in a standard project (Push Notifications, Asset Manager, etc.)
You can eject it to ExpoKit and integrate native code continuing using some of the Expo features, but not all of them
Expo can build .apk and .ipa files (distribution to stores possible with Expo)
Disadvantages
You can't add native modules (probably a game changer for some)
You can't use libraries that use native code in Objective-C/Java
The standard Hello World app is about 25MB big (because of the integrated libraries)
If you want to use: FaceDetector, ARKit, or Payments you need to eject it to ExpoKit
Ejecting it to ExpoKit has a trade-off of features of Expo, e.g. you cannot share via a QR code
When ejecting to ExpoKit you are limited to the react-native version that is supported by ExpoKit then
Debugging in ExpoKit (with native modules) is a lot more complicated, since it mixes two languages and different libraries (no official Expo support any more)
Sources:
Detaching Expo Apps to ExpoKit: Concepts
Difference between react-native-init and create-react-native-app #516
Ejecting to ExpoKit
The answer of Brent Vatne is fine, but I'd like to add some details.
Expo expands the API surface of React Native
React Native does not give you all the JavaScript APIs you need out of the box, but only most primitive features. React Native developers are expected to use Android Studio or Xcode to link additional native libraries.
Expo aims to enhance React Native and provide all the JavaScript APIs you need for the most common needs. It is basically a set of well-defined quality native libs already packaged for you in a single lib: ExpoKit. Sometimes these libraries are actually already existing in the React Native world, and integrated into ExpoKit.
It is also important to notice that the Expo team can't include every library out there into ExpoKit (which may create some frustration) because the Hello, World! app size would grow, as it would ship a lot of API's that wouldn't be used in most apps.
Expo provides over-the-air JavaScript updates
Like other systems (CodePush, etc.), Expo provides a system to update your app over the air. This means you upload your JavaScript bundle on a CDN and the mobile apps will automatically download and use the new JavaScript code on next startup (without requesting a publication/review from the stores).
Expo provides a CLI tool to upload/manage the JavaScript bundles on their CDN. For development you can also choose to become the CDN and host the JavaScript bundle on localhost. And Expo XDE is just a visual wrapper on the CLI.
Expo provides a generic client
The Expo client is a generic client that permits to load any app that is compatible with Expo. All the Expo apps do share the exact same native runtime (React Native + ExpoKit). The only difference is the JavaScript code that we give them. The Expo apps you publish to the app stores have your JavaScript bundle URL hardcoded in it. The Expo client is build in a specific way so that you can choose from which URL to load the JS, by scanning a QR code or providing a URL.
Note that this client can also load JavaScript bundles from localhost, and make your development experience easier: There isn't any need for Xcode or Android Studio, and it gets much faster to get your first Hello, World! app running on the phone (from hours to minutes). You can actually develop on an iPhone without a Mac and the setup takes two minutes.
Actually, as the Expo SDK can be upgraded, the Expo client includes a compatibility layer so that it is able to run the last five SDK versions.
Expo provides a build service
As all the Expo apps share the same native code, Expo is able to easily build these apps for you. They have created a cloud build service.
The major thing that differentiate two apps built by Expo is just the hardcoded URL to which the app is supposed to download the JavaScript bundle to run.
Expo does some other things for you, like providing a declarative way to setup app icons, orientations, permissions, API keys, helping you setup push notifications, provisioning profiles... many settings have to be hardcoded at build time in the app and can't be changed over the air.
Expo is to React Native what PhoneGap is to Cordova
React Native is similar Cordova. It is not the same view technology (native vs webview), but both allow you to control native features from JavaScript, and both offer a plugin system so that developers can easily add new JavaScript and native bindings.
PhoneGap is similar to Expo. They both try to enrich the raw API of the underlying platform they are built on with a predefined set of additional native plugins. PhoneGap also offers a build service and has a generic client that work as long as you use the approved plugins.
Conclusion
As you can see, Expo is a set of tools. At the end, it permits to easily develop, share and publish to the stores your mobile projects. It is quite similar to the PhoneGap experience (but a lot better and less confusing).
I will definitively recommend Expo for any new React Native greenfield project, except these two cases:
You already know you need API's that are not available in Expo and won't be anytime soon
You care a lot about your app size (Hello, World! is more than 25 MB due to the large size of ExpoKit, but after that it does not increase much as it is just JavaScript)
It is explained in the official Expo documentation
What is the difference between Expo and React Native?
Expo is kind of like Rails for React Native. Lots of things are set up for you, so it’s quicker to get started and on the right path.
With Expo, you don’t need Xcode or Android Studio. You just write JavaScript using whatever text editor you are comfortable with (Atom, vim, emacs, Sublime, VS Code, whatever you like). You can run XDE (our desktop software) on Mac, Windows, and Linux.
Here are some of the things Expo gives you out of the box that work right away:
Support for iOS and Android
You can use apps written in Expo on both iOS and Android right out of the box. You don’t need to go through a separate build process for each one. Just open any Expo app in the Expo Client app from the App Store on either iOS or Android (or in a simulator or emulator on your computer).
Push Notifications
Push notifications work right out of the box across both iOS and Android, using a single, unified API. You don’t have to set up APNS and GCM/FCM or configure ZeroPush or anything like that. We think we’ve made this as easy as it can be right now.
Facebook Login
This can take a long time to get set up properly yourself, but you should be able to get it working in 10 minutes or less on Expo.
Instant Updating
All Expo apps can be updated in seconds by just clicking Publish in XDE. You don’t have to set anything up; it just works this way. If you aren’t using Expo, you’d either use Microsoft Code Push or roll your own solution for this problem
Asset Management
Images, videos, fonts, etc. are all distributed dynamically over the Internet with Expo. This means they work with instant updating and can be changed on the fly. The asset management system built-in to Expo takes care of uploading all the assets in your repo to a CDN so they’ll load quickly for anyone.
Without Expo, the normal thing to do is to bundle your assets into your app which means you can’t change them. Or you’d have to manage putting your assets on a CDN or similar yourself.
Easier Updating To New React Native Releases
We do new releases of Expo every few weeks. You can stay on an old version of React Native if you like, or upgrade to a new one, without worrying about rebuilding your app binary. You can worry about upgrading the JavaScript on your own time.
But no native modules…
The most limiting thing about Expo is that you can’t add in your own native modules without detaching and using ExpoKit.
Expo CLI
Pros:
No need to install Android Studio or Xcode to start building.
Not a lot of configuration required.
Mobile UI to easily view on both Android and iPhone using barcode scanning. Also easier to view with online iPhone and Android simulators.
Faster setup and development.
Cons:
Native dependencies cannot be added.
Creating .apk and .ipa files is difficult.
Size of apk/ipa is huge.
React Native CLI
Pros:
Easily add native dependencies.
Creating .apk and .ipa files is much easier than with Expo
Note: React Native CLI is the framework to use to work directly with the React Native framework.
Cons:
High level of configuration required.
Basic knowledge of Android and iOS folder structure required.
As you can see, both approaches have their pros and cons; you should always decide which to use based on your needs for the project.
The answers about advantages and disadvantages of Expo and React Native CLI are complete. I want to mention another point as my personal experience.
Expo contains many modules by default in the project and it makes easier to work with it. But it has a big problem in the production phase, because the built Android and iOS versions have such a great size. For example, if you have a single page with a 'Hello, World!', the APK file size would be about 19 MB. Having a same project in React Native CLI will result in an app with the size of 6 MB.
So personally I do not recommend using Expo if you want to develop a commercial app.
I would make a note here that Expo is using an older version of React, 16.5, which would prohibit you from using the new hooks feature.
If you decide to go with Expo, be mindful to watch your version controls. Older versions of, say, react-navigation will need to be used with the 16.5 version if you are getting weird errors.
Expo is a wrapper of React Native CLI, which does things under the hood for the ease of developers. The most common problem that Expo solves is that the developer doesn't have to worry about the linking issues of the libraries that often occur in React Native CLI. Expo comes up with tons of libraries now that are extremely helpful for robust development. One of the benefits of Expo is you can develop an app for Android and iOS without having a Mac through Expo mobile application.
As it has tons of benefits, there are some cons of using Expo:
App size increases like hell. A simple Hello, World! app size is more than 30 MB
At times when you need to implement some native functionality into your app, you will need to eject from Expo and go back to React Native CLI. And you can never revert it back to Expo CLI.
I've experienced more than a year that works with Expo.
If the size of the app is not important for you, use Expo because it's easy to implement Map and Push easier than React-native, but at the end of the project, if you want to publish app in Google Play or another store, you have a challenge removing some permissions in your APK.
In React Native you can change everything, but for importing some library, such as push notification or the map, it needs some challenges too, because you have to add these libraries manually to Android and iOS projects.
A summary of the documentation and answers from Expo employees:
React Native init:
Advantages
You can add native modules written in Java or Objective-C (probably the only but the strongest one)
Disadvantages
Needs Android Studio and Xcode to run the projects
You can't develop for iOS without having a Mac
Device has to be connected via USB to use it for testing
Fonts need to be imported manually in Xcode
If you want to share the app you need to send the whole .apk / .ipa file
Does not provide JavaScript APIs out of the box, e.g., Push-Notifications, Asset Manager, they need to be manually installed and linked with npm for example
Setting up a working project properly (including device configuration) is rather complicated and can take time
Expo
Advantages
Setting up a project is easy and can be done in minutes
You (and other people) can open the project while you're working on it
Sharing the app is easy (via a QR code or link), you don't have to send the whole .apk or .ipa file
No build necessary to run the app
Integrates some basic libraries in a standard project (Push Notifications, Asset Manager, etc.)
You can eject it to ExpoKit and integrate native code continuing using some of the Expo features, but not all of them
Expo can build .apk and .ipa files (distribution to stores possible with Expo)
Disadvantages
You can't add native modules (probably a game changer for some)
You can't use libraries that use native code in Objective-C/Java
The standard Hello World app is about 25MB big (because of the integrated libraries)
If you want to use: FaceDetector, ARKit, or Payments you need to eject it to ExpoKit
Ejecting it to ExpoKit has a trade-off of features of Expo, e.g. you cannot share via a QR code
When ejecting to ExpoKit you are limited to the react-native version that is supported by ExpoKit then
Debugging in ExpoKit (with native modules) is a lot more complicated, since it mixes two languages and different libraries (no official Expo support any more)
Expo and React Native are two popular tools for building mobile apps, but they have some differences. Expo is a free and open-source platform that allows developers to quickly build apps with JavaScript and React Native. It provides a set of tools, libraries, and services that make it easier to get started with building a mobile app. React Native, on the other hand, is a framework for building mobile apps using React. React Native provides a more direct way to access native APIs and components, and allows for more customization and control over the app development process. In summary, Expo provides a faster and easier way to get started with building a mobile app, while React Native provides more control and customization.
Another difference between Expo and React Native is the deployment process. With Expo, you can publish your app directly to the app stores with just a few clicks. You can also take advantage of other services that Expo provides, such as push notifications and authentication. On the other hand, when building a React Native app, you'll need to use tools like Xcode or Android Studio to compile and package the app for deployment. Additionally, you'll have to handle the distribution process yourself, which can be time-consuming and complex.
In terms of performance, React Native generally has better performance compared to Expo as it has a direct access to native APIs and components, whereas Expo relies on its SDK. However, the performance difference may not be significant in many cases.
In conclusion, both Expo and React Native have their own pros and cons, and the choice between them depends on the specific requirements and goals of your project. If you're just starting out with mobile app development and want a fast and easy way to get started, Expo is a great option. However, if you want more control and customization, React Native might be the better choice.