跳至主要内容

部署

npm run build 创建一个包含你的应用生产版本的 build 目录。设置你喜欢的 HTTP 服务器,以便访问你网站的访客可以访问 index.html,并且对静态路径(如 /static/js/main.<hash>.js)的请求将使用 /static/js/main.<hash>.js 文件的内容进行服务。有关更多信息,请参阅 生产版本 部分。

静态服务器

对于使用 Node 的环境,最简单的方法是安装 serve 并让它处理其余工作

npm install -g serve
serve -s build

上面显示的最后一个命令将在端口 3000 上提供你的静态网站。与 serve 的许多内部设置一样,可以使用 -l--listen 标志调整端口

serve -s build -l 4000

运行此命令以获取可用选项的完整列表

serve -h

其他解决方案

您不需要静态服务器来运行生产环境中的 Create React App 项目。它也可以很好地集成到现有的服务器端应用程序中。

以下是一个使用 NodeExpress 的编程示例。

const express = require('express');
const path = require('path');
const app = express();

app.use(express.static(path.join(__dirname, 'build')));

app.get('/', function (req, res) {
res.sendFile(path.join(__dirname, 'build', 'index.html'));
});

app.listen(9000);

您的服务器软件的选择也不重要。由于 Create React App 完全与平台无关,因此无需显式使用 Node。

包含静态资产的 build 文件夹是 Create React App 生成的唯一输出。

但是,如果您使用客户端路由,这还不够。如果您想在单页应用程序中支持像 /todos/42 这样的 URL,请阅读下一节。

使用客户端路由的应用程序服务

如果您使用在幕后使用 HTML5 pushState 历史记录 API 的路由器(例如,使用 browserHistoryReact Router),许多静态文件服务器将无法正常工作。例如,如果您使用 React Router 为 /todos/42 设置路由,开发服务器将正确响应 localhost:3000/todos/42,但如上所述,提供生产构建的 Express 不会。

这是因为当对 /todos/42 进行新的页面加载时,服务器会查找 build/todos/42 文件,但找不到它。服务器需要配置为通过提供 index.html 来响应对 /todos/42 的请求。例如,我们可以修改上面的 Express 示例,以便为任何未知路径提供 index.html

 app.use(express.static(path.join(__dirname, 'build')));

-app.get('/', function (req, res) {
+app.get('/*', function (req, res) {
res.sendFile(path.join(__dirname, 'build', 'index.html'));
});

如果您使用的是 Apache HTTP Server,您需要在 public 文件夹中创建一个名为 .htaccess 的文件,内容如下

    Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.html [QSA,L]

当您运行 npm run build 时,它将被复制到 build 文件夹中。

如果您使用的是 Apache Tomcat,您需要按照 这个 Stack Overflow 答案 进行操作。

现在,对 /todos/42 的请求将在开发和生产环境中得到正确处理。

在生产构建中,以及在您 选择加入 后,一个 服务工作者 将自动处理所有导航请求,例如 /todos/42,通过提供您 index.html 的缓存副本。此服务工作者导航路由可以通过 eject 进行配置或禁用,然后修改 navigateFallbacknavigateFallbackWhitelistSWPrecachePlugin 配置选项。

当用户将您的应用程序安装到其设备的主屏幕时,默认配置将创建一个指向 /index.html 的快捷方式。这可能不适用于期望应用程序从 / 提供服务的客户端路由器。编辑 public/manifest.json 中的 Web 应用程序清单,并将 start_url 更改为匹配所需的 URL 方案,例如

  "start_url": ".",

为相对路径构建

默认情况下,Create React App 会生成一个构建,假设您的应用程序托管在服务器根目录下。

要覆盖此设置,请在 package.json 中指定 homepage,例如

  "homepage": "http://mywebsite.com/relativepath",

这将使 Create React App 正确推断在生成的 HTML 文件中使用的根路径。

注意:如果您使用的是 react-router@^4,则可以使用任何 <Router> 上的 basename 属性来根 <Link>

更多信息 在此

例如

<BrowserRouter basename="/calendar"/>
<Link to="/today"/> // renders <a href="/calendar/today">

从不同路径提供相同的构建

注意:此功能适用于 [email protected] 及更高版本。

如果您没有使用 HTML5 的 pushState 历史记录 API 或根本没有使用客户端路由,则无需指定应用程序将从中提供的 URL。相反,您可以在 package.json 中添加以下内容。

  "homepage": ".",

这将确保所有资产路径相对于 index.html。然后,您可以将应用程序从 http://mywebsite.com 移动到 http://mywebsite.com/relativepath 甚至 http://mywebsite.com/relative/path,而无需重新构建它。

为任意构建环境自定义环境变量

您可以通过创建自定义 .env 文件并使用 env-cmd 加载它来创建任意构建环境。

例如,要为暂存环境创建构建环境

  1. 创建一个名为 .env.staging 的文件
  2. 设置环境变量,就像您设置任何其他 .env 文件一样(例如 REACT_APP_API_URL=http://api-staging.example.com
  3. 安装 env-cmd
    $ npm install env-cmd --save
    $ # or
    $ yarn add env-cmd
  4. 在您的 package.json 中添加一个新的脚本,使用您的新环境进行构建
    {
    "scripts": {
    "build:staging": "env-cmd -f .env.staging npm run build"
    }
    }

现在,您可以运行 npm run build:staging 来使用暂存环境配置进行构建。您可以以相同的方式指定其他环境。

.env.production 中的变量将用作回退,因为 NODE_ENV 将始终设置为构建的 production

AWS Amplify

AWS Amplify 控制台为现代 Web 应用程序(单页应用程序和静态站点生成器)提供持续部署和托管,并提供无服务器后端。Amplify 控制台提供全球可用的 CDN、自定义域设置、功能分支部署和密码保护。

  1. 登录 Amplify 控制台 此处
  2. 连接您的 Create React App 存储库并选择一个分支。如果您正在寻找 Create React App+Amplify 启动器,请尝试 create-react-app-auth-amplify 启动器,它演示了如何在 10 分钟内使用 Create React App 设置身份验证。
  3. Amplify 控制台会自动检测构建设置。选择下一步。
  4. 选择保存并部署

如果构建成功,应用程序将部署并托管在具有 amplifyapp.com 域的全球 CDN 上。您现在可以持续部署对前端或后端的更改。持续部署允许开发人员在每次将其代码提交到其 Git 存储库时,将其前端和后端的更新部署到生产环境中。

Azure

Azure 静态 Web 应用为您的 React 应用创建了一个由 GitHub Actions 提供支持的自动化构建和部署管道。应用程序默认情况下是地理分布式的,具有多个访问点。PR 会自动构建以用于预发布环境预览。

  1. 创建一个新的静态 Web 应用 在这里
  2. 添加详细信息并连接到您的 GitHub 仓库。
  3. 确保在“构建”选项卡上正确设置构建文件夹,然后创建资源。

Azure 静态 Web 应用将自动在您的仓库中配置一个 GitHub Action 并开始部署。

有关路由、API、身份验证和授权、自定义域等的更多信息,请参阅 Azure 静态 Web 应用文档

Firebase

如果您还没有安装 Firebase CLI,请运行 npm install -g firebase-tools。注册一个 Firebase 帐户 并创建一个新项目。运行 firebase login 并使用您之前创建的 Firebase 帐户登录。

然后从您的项目根目录运行 firebase init 命令。您需要选择 **托管:配置和部署 Firebase 托管站点**,并选择您在上一步中创建的 Firebase 项目。您需要同意创建 database.rules.json,选择 build 作为公共目录,并同意 **配置为单页应用程序**,方法是回复 y

    === Project Setup

First, let's associate this project directory with a Firebase project.
You can create multiple project aliases by running firebase use --add,
but for now we'll set up a default project.

? What Firebase project do you want to associate as default? Example app (example-app-fd690)

=== Database Setup

Firebase Realtime Database Rules allow you to define how your data should be
structured and when your data can be read from and written to.

? What file should be used for Database Rules? database.rules.json
✔ Database Rules for example-app-fd690 have been downloaded to database.rules.json.
Future modifications to database.rules.json will update Database Rules when you run
firebase deploy.

=== Hosting Setup

Your public directory is the folder (relative to your project directory) that
will contain Hosting assets to uploaded with firebase deploy. If you
have a build process for your assets, use your build's output directory.

? What do you want to use as your public directory? build
? Configure as a single-page app (rewrite all urls to /index.html)? Yes
✔ Wrote build/index.html

i Writing configuration info to firebase.json...
i Writing project information to .firebaserc...

✔ Firebase initialization complete!

重要:您需要在 firebase.json 文件中为 service-worker.js 文件设置正确的 HTTP 缓存头,否则您将无法在第一次部署后看到更改 (问题 #2440)。它应该添加到 "hosting" 键中,如下所示

{
"hosting": {
...
"headers": [
{"source": "/service-worker.js", "headers": [{"key": "Cache-Control", "value": "no-cache"}]}
]
...

现在,在使用 npm run build 创建生产构建后,您可以通过运行 firebase deploy 来部署它。

    === Deploying to 'example-app-fd690'...

i deploying database, hosting
✔ database: rules ready to deploy.
i hosting: preparing build directory for upload...
Uploading: [============================== ] 75%✔ hosting: build folder uploaded successfully
✔ hosting: 8 files uploaded successfully
i starting release process (may take several minutes)...

✔ Deploy complete!

Project Console: https://console.firebase.google.com/project/example-app-fd690/overview
Hosting URL: https://example-app-fd690.firebaseapp.com

有关更多信息,请参阅 Firebase 托管

GitHub Pages

注意:此功能在 [email protected] 及更高版本中可用。

步骤 1:将 homepage 添加到 package.json

以下步骤很重要!

如果您跳过它,您的应用程序将无法正确部署。

打开您的 package.json 并为您的项目添加一个 homepage 字段

  "homepage": "https://myusername.github.io/my-app",

或用于 GitHub 用户页面

  "homepage": "https://myusername.github.io",

或用于自定义域页面

  "homepage": "https://mywebsite.com",

Create React App 使用 homepage 字段来确定构建的 HTML 文件中的根 URL。

步骤 2:安装 gh-pages 并将 deploy 添加到 package.json 中的 scripts

现在,每当您运行 npm run build 时,您将看到一张备忘单,其中包含有关如何部署到 GitHub Pages 的说明。

要将其发布到 https://myusername.github.io/my-app,请运行

npm install --save gh-pages

或者,您可以使用 yarn

yarn add gh-pages

在您的 package.json 中添加以下脚本

  "scripts": {
+ "predeploy": "npm run build",
+ "deploy": "gh-pages -d build",
"start": "react-scripts start",
"build": "react-scripts build",

predeploy 脚本将在运行 deploy 之前自动运行。

如果您要部署到 GitHub 用户页面而不是项目页面,则需要进行一项额外的修改

  1. 调整您的 package.json 脚本以将部署推送到 master
  "scripts": {
"predeploy": "npm run build",
- "deploy": "gh-pages -d build",
+ "deploy": "gh-pages -b master -d build",

步骤 3:通过运行 npm run deploy 部署站点

然后运行

npm run deploy

步骤 4:对于项目页面,请确保您的项目设置使用 gh-pages

最后,确保 GitHub 项目设置中的 GitHub Pages 选项设置为使用 gh-pages 分支

gh-pages branch setting

步骤 5:可选地配置域

您可以通过将 CNAME 文件添加到 public/ 文件夹来配置 GitHub Pages 的自定义域。

您的 CNAME 文件应如下所示

mywebsite.com

有关客户端路由的说明

GitHub Pages 不支持使用 HTML5 `pushState` 历史 API 的路由器(例如,使用 `browserHistory` 的 React Router)。这是因为当像 `http://user.github.io/todomvc/todos/42` 这样的 URL 发生新的页面加载时,其中 `todos/42` 是前端路由,GitHub Pages 服务器会返回 404,因为它不知道 `todos/42`。如果你想在托管在 GitHub Pages 上的项目中添加路由器,这里有一些解决方案。

  • 你可以从使用 HTML5 历史 API 切换到使用哈希进行路由。如果你使用 React Router,你可以切换到 `hashHistory` 来实现这个效果,但 URL 会更长,更冗长(例如,`http://user.github.io/todomvc/#/todos/42?_k=yknaj`)。阅读更多 关于 React Router 中不同的历史实现。
  • 或者,你可以使用一个技巧来教 GitHub Pages 如何处理 404 错误,方法是将页面重定向到你的 `index.html` 页面,并使用自定义重定向参数。你需要在部署项目之前将包含重定向代码的 `404.html` 文件添加到 `build` 文件夹中,并且你需要在 `index.html` 中添加处理重定向参数的代码。你可以在这个指南 中找到对此技术的详细解释。

故障排除

"/dev/tty: No such a device or address"

如果在部署时出现 `"/dev/tty: No such a device or address"` 或类似错误,请尝试以下操作

  1. 创建一个新的个人访问令牌
  2. git remote set-url origin https://<user>:<token>@github.com/<user>/<repo> .
  3. 再次尝试 `npm run deploy`

"Cannot read property 'email' of null"

如果在部署时出现 `Cannot read property 'email' of null`,请尝试以下操作

  1. git config --global user.name '<your_name>'
  2. git config --global user.email '<your_email>'
  3. 再次尝试 `npm run deploy`

Heroku

使用Heroku Buildpack for Create React App.

你可以在Deploying React with Zero Configuration 中找到说明。

解决 Heroku 部署错误

有时 npm run build 在本地运行正常,但在通过 Heroku 部署时会失败。以下是最常见的情况。

"模块未找到:错误:无法解析 '文件' 或 '目录'"

如果你遇到类似这样的错误

remote: Failed to create a production build. Reason:
remote: Module not found: Error: Cannot resolve 'file' or 'directory'
MyDirectory in /tmp/build_1234/src

这意味着你需要确保你 import 的文件或目录的字母大小写与你在文件系统或 GitHub 上看到的字母大小写一致。

这一点很重要,因为 Linux(Heroku 使用的操作系统)区分大小写。因此,MyDirectorymydirectory 是两个不同的目录,因此,即使项目在本地构建成功,大小写上的差异也会在 Heroku 远程服务器上导致 import 语句失败。

"找不到必需的文件。"

如果你从包中排除或忽略了必要的文件,你会看到类似这样的错误

remote: Could not find a required file.
remote: Name: `index.html`
remote: Searched in: /tmp/build_a2875fc163b209225122d68916f1d4df/public
remote:
remote: npm ERR! Linux 3.13.0-105-generic
remote: npm ERR! argv "/tmp/build_a2875fc163b209225122d68916f1d4df/.heroku/node/bin/node" "/tmp/build_a2875fc163b209225122d68916f1d4df/.heroku/node/bin/npm" "run" "build"

在这种情况下,请确保该文件存在,字母大小写正确,并且没有被你的本地 .gitignore~/.gitignore_global 忽略。

Netlify

要手动部署到 Netlify 的 CDN

npm install netlify-cli -g
netlify deploy

选择 build 作为部署路径。

要设置持续交付

通过这种设置,Netlify 会在你推送到 Git 或打开拉取请求时构建和部署。

  1. 创建一个新的 Netlify 项目
  2. 选择你的 Git 托管服务并选择你的仓库
  3. 点击 构建你的网站

支持客户端路由

要支持 pushState,请确保创建一个 public/_redirects 文件,其中包含以下重写规则

/*  /index.html  200

当你构建项目时,Create React App 会将 public 文件夹的内容放置到构建输出中。

Vercel

Vercel 是一个云平台,使开发人员能够托管 Jamstack 网站和 Web 服务,这些服务可以立即部署、自动扩展,并且无需任何监督,所有这些都无需配置。他们提供了一个全球边缘网络、SSL 加密、资产压缩、缓存失效等等。

步骤 1:将您的 React 项目部署到 Vercel

要使用 Vercel for Git 集成 部署您的 React 项目,请确保它已推送到 Git 存储库。

使用 导入流程 将项目导入 Vercel。在导入过程中,您会发现所有相关的 选项 已为您预先配置,您可以根据需要进行更改。

项目导入后,所有后续推送到分支的操作都会生成 预览部署,对 生产分支(通常为“master”或“main”)所做的所有更改都会导致 生产部署

部署后,您将获得一个 URL 来查看您的应用程序,例如以下 URL:https://create-react-app-example.vercel.app/

步骤 2(可选):使用自定义域名

如果您想在 Vercel 部署中使用自定义域名,您可以通过 Vercel 帐户域名设置 添加转移您的域名。

要将您的域名添加到项目,请从 Vercel 仪表板导航到您的 项目。选择您的项目后,单击“设置”选项卡,然后选择域名菜单项。在项目的域名页面上,输入您要添加到项目的域名。

域名添加后,您将看到不同的配置方法。

部署新的 React 项目

您可以使用以下部署按钮部署一个新的 React 项目,并为您设置一个 Git 存储库

Deploy with Vercel

Vercel 参考:

Render

Render 提供免费的 静态网站 托管,包含完全托管的 SSL、全球 CDN 和来自 GitHub 的持续自动部署。

按照 Create React App 部署指南,只需几分钟即可部署您的应用程序。

使用邀请码 cra 注册或使用 此链接

S3CloudFront

查看此 博客文章,了解如何将您的 React 应用程序部署到 Amazon Web Services S3 和 CloudFront。如果您想添加自定义域名、HTTPS 和持续部署,请查看此 博客文章

Surge

如果您还没有安装 Surge CLI,请运行 npm install -g surge。运行 surge 命令并登录或创建一个新帐户。

当询问项目路径时,请确保指定 build 文件夹,例如

       project path: /path/to/project/build

请注意,为了支持使用 HTML5 pushState API 的路由器,您可能需要在部署到 Surge 之前将 build 文件夹中的 index.html 重命名为 200.html。这 确保每个 URL 都回退到该文件

将组件发布到 npm

Create React App 没有提供任何内置功能来将组件发布到 npm。如果您准备从项目中提取一个组件以便其他人可以使用它,我们建议将其移动到项目外部的单独目录,然后使用像 nwb 这样的工具来准备发布。