Deploying a React Native app to netlify
For a school project Iām working on, I needed a web version of my application which can be used to pair with the mobile application. Since I didnāt want to build two seperate applications, I researched a way that I could have only one codebase that would run on IOS, Android and web platforms. The front-end will fetch an API, so if I wanted, I could use two seperate applications for mobile & web-platforms, but itās so much easier managing all code at once.
My exact setup will be te following:
- React Native front-end
- Back-end will be RESTful, so doesnāt really matter what you use
- Github for version-control
- Travis CI to build, test and deploy
- Netlify to host the application
Starting a React Native application using Expo
Starting a new React Native app using Expo isnāt that hard and is even guided through on the official documentation.
Firstly, install the expo-cli
so we can run expo commands:
yarn -g add expo-cli
To then bootstrap a new application we can just simply use
expo init yourProject
Now you have a basic template to get you started, just build your app like you would normally do. Except you have an extra layer upon React Native (which weāll need to publish for the web).
Building a CI/CD system
If you donāt want automatic deploys to you hosting service and donāt need to test your code, you can skip this step. expo-cli
can also be run locally, then you can deploy the web-build
folder manually using something like netlify-cli
.
Since the project uses expo-cli
to build the project, we canāt really use the built-in Netlify CI (although there are workarounds like configuring a seperate build/deploy script in your package.json
). In this example I use Travis CI. I really like the UI and the accessibility of the website, but use Jenkins, Github Actions or any CI/CD system you like. As long as it works for you.
The configuration
The configuration for Travis isnāt really too hard to understand, still Iāll explain what happens here.
Basically, we tell Travis to set up 3 build containers. The first two will install Node.js, NPM and the expo-cli
. Then weāll tell it to install the NPM/Yarn packages and keep the node_modules
folder in the cache. If those are done, a new job will start that actually builds and deploys the application to the web. We run yarn just to be sure, but since it has the node_modules
in cache, itāll finish right away and tell you itās up to date. Next, the expo build:web
command is triggered, which will build our application for web platforms and puts the output in the web-build
folder which is then published to Netlify. The deploying command also expects two secrets which should be configured as environment variables. $NETLIFY_ID
is the specific ID of the website youāre publishing to on Netlify and $NETLIFY_AUTH
is the deploy key you generate from the Netlify website which tells Netlify you are authorized to publish to the website mentioned in the $NETLIFY_ID
. In this example I also tell Travis to only trigger the deploy job on the main branch, but modify that to your liking.
# .travis.yml
language: node_js
node_js:
- node
- lts/*
cache:
directories:
- ~/.npm
- node_modules
before_script:
- npm install -g npm@latest
- npm install -g yarn
- npm install -g expo-cli
script:
- yarn
jobs:
include:
- stage: deploy website
script:
- yarn
- expo build:web
deploy:
provider: netlify
site: $NETLIFY_ID
auth: $NETLIFY_AUTH
dir: "web-build"
prod: true
edge: true
on:
branch: main
Deploying to Netlify
In this example I used Netlify to deploy the application, but any static hosting service (like Github pages or Vercel) can be used since Expo will generate a static build of your site. I wonāt go further here on how you can set up Netlify, since I wrote a blogpost about that before.