发布网站

编辑页面

了解如何将 Expo 网站部署到生产环境。


For the complete documentation index, see llms.txt. Use this Use this file to discover all available pages.

Expo Web 应用可以在本地提供服务以测试生产环境下的行为,也可以部署到托管服务。我们建议部署到 EAS Hosting,以获得最佳的功能支持。你也可以自行托管,或者使用第三方服务。

使用 EAS 立即部署

EAS Hosting 是部署 Web 应用的最佳方式,支持自定义域名、SSL 等更多功能。

对于 SDK 49 及更早版本,你可能需要参考 webpack 构建发布指南

输出目标

可以在 应用配置 中配置 web.output 目标,以设置 Web 应用的导出方式:

app.json
{ "expo": { "web": { "output": "server", "bundler": "metro" } } }

Expo Router 支持 Web 应用的三种输出目标。

输出Expo RouterAPI Routes描述
single(默认)输出一个单页应用(SPA),在输出目录中只有一个 index.html,并且没有可静态索引的 HTML。
server创建 clientserver 目录。客户端文件会作为独立的 HTML 文件输出。API 路由会作为独立的 JavaScript 文件输出,用于配合自定义 Node.js 服务器托管。
staticapp 目录中的每条路由输出独立的 HTML 文件。
注意:对于 staticserver 输出模式,你可以通过 expo-router 插件配置适用于所有路由响应的 全局 HTTP 头

创建构建

为项目创建构建是发布 Web 应用的第一步。无论你是想在本地提供服务还是部署到托管服务,都需要导出项目的所有 JavaScript 和资源文件。这称为静态 bundle。可以通过运行以下命令进行导出:

运行通用导出命令以编译 Web 项目:

Terminal
npx expo export -p web

生成的项目文件位于 dist 目录中。public 目录中的任何文件也会被复制到 dist 目录。

某些路径(例如 /assets)会被 Metro 保留。避免将文件放在 public/assets/ 或其他保留路径中。完整列表请参见 保留路径

在本地提供服务

使用 npx expo serve 可以快速在本地测试你的网站在生产环境中的托管效果。运行以下命令以提供静态 bundle 服务:

Terminal
npx expo serve

打开 http://localhost:8081 查看项目运行效果。这是仅限 HTTP,因此权限、相机、位置以及许多其他安全功能可能无法按预期工作。

使用 EAS 托管

当你准备上线时,可以使用 EAS CLI 立即部署你的网站。

使用 EAS 立即部署

EAS Hosting 是部署 Web 应用的最佳方式,支持自定义域名、SSL 等更多功能。

使用第三方服务托管

Netlify

Netlify 是一个对部署 Web 应用几乎不施加预设限制的平台。它对 Expo Web 应用具有最高兼容性,因为它对框架的假设很少。

使用 Netlify CDN 手动部署

1

通过运行以下命令安装 Netlify CLI:

Terminal
npm install -g netlify-cli

2

为单页应用配置重定向。

如果你的应用使用 静态渲染,那么可以跳过此步骤。

expo.web.output: 'single' 会生成一个单页应用。这意味着只有一个 dist/index.html 文件,所有请求都必须重定向到它。在 Netlify 中可以通过创建 ./public/_redirects 文件,并将所有请求重定向到 /index.html 来实现。

public/_redirects
/* /index.html 200

如果你修改了此文件,必须使用 npx expo export -p web 重新构建项目,才能安全地将其复制到 dist 目录。

3

通过运行以下命令部署 Web 构建目录:

Terminal
netlify deploy --dir dist

你会看到一个 URL,可用于在线查看你的项目。

持续交付

Netlify 也可以在你推送到 git 或打开新的拉取请求时自动构建并部署:

Vercel

Vercel 提供单命令部署流程。

1

安装 Vercel CLI

Terminal
npm install -g vercel@latest

2

为单页应用配置重定向。

在你的应用根目录下创建一个 vercel.json 文件,并添加以下配置:

vercel.json
{ "buildCommand": "expo export -p web", "outputDirectory": "dist", "devCommand": "expo", "cleanUrls": true, "framework": null, "rewrites": [ { "source": "/:path*", "destination": "/" } ] }

如果你的应用使用 静态渲染,你可能还需要添加额外的 动态路由配置

3

部署网站。

Terminal
vercel

现在你会看到一个 URL,可用于在线查看你的项目。构建完成后,将该 URL 粘贴到浏览器中,你就会看到已部署的应用。

AWS Amplify Console

AWS Amplify Console 提供基于 Git 的工作流,用于持续部署和托管全栈无服务器 Web 应用。Amplify 会从仓库而不是从你的电脑部署你的 PWA。在本指南中,我们将使用 GitHub 仓库。开始之前,请先在 GitHub 上创建一个新仓库

1

amplify-explicit.yml 文件添加到仓库根目录。确保你已从 .gitignore 文件中移除了生成的 dist 目录,并提交了这些更改。

2

将你的本地 Expo 项目推送到 GitHub 仓库。如果你还没有推送到 GitHub,请参考 GitHub 关于将现有项目添加到 GitHub 的指南

3

登录 Amplify Console,选择一个现有应用或创建一个新应用。授予 Amplify 读取你 GitHub 账号或拥有该仓库的组织的权限。

4

添加你的仓库,选择分支,并勾选 Connecting a monorepo?,以输入你的应用 dist 目录路径,然后选择 Next

Amplify Console 会检测你项目中的 amplify.yml 文件。选择 Allow AWS Amplify to automatically deploy all files hosted in your project root directory,然后选择 Next

5

检查你的设置并选择 Save and deploy。你的应用现在将部署到一个 https://branchname.xxxxxx.amplifyapp.com URL。你现在可以访问你的 Web 应用、部署另一个分支,或在 Expo 移动端和 Web 应用之间添加统一的后端环境。

按照 Learn how to get the most out of Amplify Hosting 下拉菜单中的步骤,进行 Add a custom domain with a free SSL certificate 等更多配置。

Firebase 托管

Firebase Hosting 是适用于 Web 项目的生产级 Web 内容托管服务。

1

使用 Firebase Console 创建一个 Firebase 项目,并按照这些说明安装 Firebase CLI。

2

使用 CLI,通过运行以下命令登录你的 Firebase 账号:

Terminal
firebase login

3

然后,通过运行以下命令初始化你的 Firebase 托管项目:

Terminal
firebase init

具体设置取决于你如何构建 Expo 网站:

  1. 当询问公共路径时,请确保指定 dist 目录。
  2. 当提示 Configure as a single-page app (rewrite all urls to /index.html) 时,只有在你使用了 web.output: "single"(默认)时才选择 Yes。否则请选择 No

4

package.json 的现有 scripts 属性中,添加 predeploydeploy 属性。它们的值如下:

package.json
"scripts": { %%placeholder-start%%... %%placeholder-end%% "predeploy": "expo export -p web", "deploy-hosting": "npm run predeploy && firebase deploy --only hosting", }

5

要进行部署,请运行以下命令:

Terminal
npm run deploy-hosting

打开控制台输出中的 URL 以检查你的部署,例如:https://project-name.firebaseapp.com

如果你想更改托管的 header,请在 firebase.json 中为 hosting 部分添加以下配置:

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

GitHub Pages 允许你直接从 GitHub 仓库发布网站。

1

首先在你的项目中初始化一个新的 git 仓库,并配置将其推送到 GitHub 仓库。如果你已经在与 GitHub 仓库同步更改,可以跳过此步骤。

在 GitHub 网站上创建一个仓库。然后,在你的项目根目录中运行以下命令:

Terminal
git init

git remote add origin https://github.com/username/expo-gh-pages.git

上述命令会初始化一个新的 Git 仓库,并配置将你的源代码推送到指定的 GitHub 仓库。

2

gh-pages 包作为开发依赖安装到你的项目中:

Terminal
npm install --save-dev gh-pages

3

要部署项目,请在 应用配置 中使用 baseUrl 属性将其配置到一个子域。将其值设为字符串 /repo-name

例如,如果 GitHub 仓库是 expo-gh-pages,那么下面将是 实验性 baseUrl 属性 的值:

app.json
{ "expo": { "experiments": { "baseUrl": "/expo-gh-pages" } } }

4

通过在 package.json 文件中添加 predeploydeploy 脚本来修改 scripts。每个脚本都有自己的值:

package.json
"scripts": { %%placeholder-start%%... %%placeholder-end%% "deploy": "gh-pages --nojekyll -d dist", "predeploy": "expo export -p web" }

由于 Expo 在生成的文件中使用下划线,你需要使用 --nojekyll 标志来禁用 Jekyll。

5

要生成 Web 应用的生产构建并将其部署到 GitHub Pages,请运行以下命令:

Terminal
npm run deploy

这会将 Web 应用的构建发布到 GitHub 仓库的 gh-pages 分支。该分支只包含 dist 目录中的构建产物,以及 gh-pages 生成的 .nojekyll 文件。不包含开发源代码。

6

现在 Web 应用已经发布到 gh-pages 分支,请将 GitHub Pages 配置为从该分支提供应用服务。

  • 进入 GitHub 仓库的 Settings 选项卡。
  • 向下滚动到 Pages 部分。
  • 确保 Source 设置为 Deploy from a branch
  • Branch 部分,选择 gh-pagesroot 目录。
  • 点击 Save

7

一旦 Web 应用发布完成并设置好 GitHub Pages 配置,GitHub Action 将会部署你的网站。你可以通过进入仓库的 Actions 选项卡来监控进度。完成后,你的 Web 应用将可通过 URL http://username-on-github.github.io/repo-name 访问。

对于后续部署和更新,运行 deploy 命令,GitHub Action 会自动启动以更新你的 Web 应用。