Edit this page
Different ways to publish the Expo web app with third-party services.
In SDK 50 and above,metro
is the default bundler for web apps. The previous guide for publishing withwebpack
is available here.
A web app created using Expo can be served locally for testing out the production behavior. Once the testing phase checks out, you can choose from a variety of third-party services to host it.
The web.output
target can be configured in the app config to set the export method for the web app:
{
"expo": {
"web": {
"output": "server",
"bundler": "metro"
}
}
}
Expo Router supports three output targets for web apps.
Output | Expo Router | API Routes | Description |
---|---|---|---|
single (default) | Outputs a Single Page Application (SPA) with a single index.html in the output folder and has no statically indexable HTML. | ||
server | Creates client and server directories. Client files are output as separate HTML files. API routes as separate JavaScript files for hosting with a custom Node.js server. | ||
static | Outputs separate HTML files for every route in the app directory. |
Creating a build of the project is the first step to publishing a web app. Whether you want to serve it locally or host it on a third-party service, you'll need to export all JavaScript and assets of a project. This is known as a static bundle. It can be exported by running the following command:
Run the universal export command to compile the project for web:
-
npx expo export -p web
The resulting project files are located in the dist directory. Any files inside the public directory are also copied to the dist directory.
Use Serve CLI to quickly test locally how your website will be hosted in production. Run the following command to serve the static bundle:
-
npx serve dist --single
Open http://localhost:5000
to see your project in action. This method is HTTP only, so permissions, camera, location, and many other secure features will not work.
You need to create a custom server to host the websites with API routes. Learn more about serving locally with Express.
-
npx serve dist
Open http://localhost:5000
to see your project in action. This method is HTTP only, so permissions, camera, location, and many other secure features will not work.
Netlify is a mostly-unopinionated platform for deploying web apps. This has the highest compatibility with Expo web apps as it makes few assumptions about the framework.
1
Install the Netlify CLI by running the following command:
-
npm install -g netlify-cli
2
Configure redirects for single-page applications.
If your app uses static rendering, then you can skip this step.
expo.web.output: 'single'
generates a single-page application. It means there's only one dist/index.html file to which all requests must be redirected. This can be done in Netlify by creating a ./public/_redirects file and redirecting all requests to /index.html.
/* /index.html 200
If you modify this file, you must rebuild your project with npx expo export -p web
to have it safely copied into the dist directory.
3
Deploy the web build folder by running the following command:
-
netlify deploy --dir dist
You'll see a URL that you can use to view your project online.
Netlify can also build and deploy when you push to git or open a new pull request:
Vercel has a single-command deployment flow.
1
Install the Vercel CLI.
-
npm install -g vercel@latest
2
Configure redirects for single-page applications.
Create a vercel.json file at the root of your app and add the following configuration:
{
"buildCommand": "expo export -p web",
"outputDirectory": "dist",
"devCommand": "expo",
"cleanUrls": true,
"framework": null,
"rewrites": [
{
"source": "/:path*",
"destination": "/"
}
]
}
If your app uses static rendering, then you may want to add additional dynamic route configuration.
3
Deploy the website.
-
vercel
You'll now see a URL that you can use to view your project online. Paste that URL into your browser when the build is complete, and you'll see your deployed app.
The AWS Amplify Console provides a Git-based workflow for continuously deploying and hosting full-stack serverless web apps. Amplify deploys your PWA from a repository instead of from your computer. In this guide, we'll use a GitHub repository. Before starting, create a new repo on GitHub.
1
Add the amplify-explicit.yml file to the root of your repository. Ensure you have removed the generated dist directory from the .gitignore file and committed those changes.
2
Push your local Expo project to a GitHub repository. If you haven't pushed to GitHub yet, follow GitHub's guide to add an existing project to GitHub.
3
Login to the Amplify Console and select an existing app or create a new app. Grant Amplify permission to read from your GitHub account or the organization that owns your repo.
4
Add your repo, select the branch, and select Connecting a monorepo? to enter the path to your app's dist directory and choose Next.
The Amplify Console will detect the amplify.yml file in your project. Select Allow AWS Amplify to automatically deploy all files hosted in your project root directory and choose Next.
5
Review your settings and choose Save and deploy. Your app will now be deployed to a https://branchname.xxxxxx.amplifyapp.com
URL. You can now visit your web app, deploy another branch, or add a unified backend environment across your Expo mobile and web apps.
Follow the steps in the Learn how to get the most out of Amplify Hosting drop-down to Add a custom domain with a free SSL certificate and more information.
Firebase Hosting is production-grade web content hosting for web projects.
1
Create a firebase project with the Firebase Console and install the Firebase CLI by following these instructions.
2
Using the CLI, login to your Firebase account by running the command:
-
firebase login
3
Then, initialize your firebase project to host by running the command:
-
firebase init
The settings will depend on how you built your Expo website:
web.output: "single"
(default). Otherwise, select No.4
In the existing scripts
property of package.json, add predeploy
and deploy
properties. Each has the following values:
"scripts": {
%%placeholder-start%%... %%placeholder-end%%
"predeploy": "expo export -p web",
"deploy-hosting": "npm run predeploy && firebase deploy --only hosting",
}
5
To deploy, run the following command:
-
npm run deploy-hosting
Open the URL from the console output to check your deployment, for example: https://project-name.firebaseapp.com
.
In case you want to change the header for hosting add the following config for hosting
section in firebase.json:
"hosting": [
{
%%placeholder-start%%... %%placeholder-end%%
"headers": [
{
"source": "/**",
"headers": [
{
"key": "Cache-Control",
"value": "no-cache, no-store, must-revalidate"
}
]
},
{
"source": "**/*.@(jpg|jpeg|gif|png|svg|webp|js|css|eot|otf|ttf|ttc|woff|woff2|font.css)",
"headers": [
{
"key": "Cache-Control",
"value": "max-age=604800"
}
]
}
],
}
]
GitHub Pages allows you to publish a website directly from a GitHub repository.
GitHub Pages deployment requires Expo SDK 50 or higher, and uses experimentalbaseUrl
functionality that may not work as intended.
1
Start by initializing a new git repository in your project and configuring it to push to a GitHub repository. If you are already syncing your changes with a GitHub repository, skip this step.
Create a repository on the GitHub website. Then, run the following commands in your project's root directory:
-
git init
-
git remote add origin https://github.com/username/expo-gh-pages.git
The above commands initialize a new Git repository and configure it to push your source code to the specified GitHub repository.
2
Install the gh-pages
package as a development dependency in your project:
-
npm install --save-dev gh-pages
-
yarn add -D gh-pages
3
To deploy the project, configure it to a subdomain with the baseUrl
property in app config. Set its value to the string /repo-name
.
For example, if the GitHub repository is expo-gh-pages
, the following will be the value of the experimental baseUrl
property:
{
"expo": {
"experiments": {
"baseUrl": "/expo-gh-pages"
}
}
}
4
Modify the scripts
in the package.json file by adding predeploy
and deploy
scripts. Each has its own value:
"scripts": {
%%placeholder-start%%... %%placeholder-end%%
"deploy": "gh-pages --nojekyll -d dist",
"predeploy": "expo export -p web"
}
Since Expo uses underscores in generated files, you need to disable Jekyll with the --nojekyll
flag.
5
To generate a production build of the web app and deploy it to GitHub Pages, run the following command:
-
npm run deploy
-
yarn deploy
This publishes a build of the web app to the gh-pages
branch of your GitHub repository. This branch only contains build artifacts from the dist directory, plus the .nojekyll file generated by gh-pages
. It does not include development source code.
6
Now that the web app is published to the gh-pages
branch, configure GitHub Pages to serve the app from that branch.
7
Once the web app is published and the GitHub Pages configuration is set, a GitHub action will deploy your website. You can monitor its progress by navigating to your repository's Actions tab. Upon completion, your web app will be available at the URL http://username-on-github.github.io/repo-name
.
For subsequent deployments and updates, run the deploy
command and the GitHub action will start automatically to update your web app.