10

在项目上运行npm run build命令react-create-app会在所有文件(如地图文件)中创建一个构建文件夹和一些默认路径:

{"version":3,"sources":["../static/js/main.500cb0d9.js" ...

我可以更改构建文件夹中的所有路径以匹配我的 BE,例如

{"version":3,"sources":["mywebsite/web/static/js/main.500cb0d9.js" ...

包.json:

{
  "name": "reactTest",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "jquery": "^3.3.1",
    "moment": "^2.22.1",
    "react": "^16.4.1",
    "react-datepicker": "^1.5.0",
    "react-dom": "^16.4.1",
    "react-month-picker": "^1.3.7",
    "react-scripts": "1.1.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  }
}
4

3 回答 3

18

您可以使用以下两种方法之一设置根路径,以便在生产环境中为您的 React 应用程序提供服务:

1. 通过在package.json文件中设置主页属性

注意第 5 行:

{
  "name": "reactTest",
  "version": "0.1.0",
  "private": true,
  "homepage": "mywebsite/web",
  "dependencies": {
    "jquery": "^3.3.1",
    "moment": "^2.22.1",
    "react": "^16.4.1",
    "react-datepicker": "^1.5.0",
    "react-dom": "^16.4.1",
    "react-month-picker": "^1.3.7",
    "react-scripts": "1.1.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  }
}

见文档

2. 使用 PUBLIC_URL 环境变量

运行构建作业时,在其前面添加 env var,如下所示:

PUBLIC_URL=mywebsite/web npm run build

见文档

它有什么作用?

这些方法不会更改源映射文件中的路径,它们始终是相对的,但它可以让您使用您选择的绝对路径将 React 应用程序部署到 Web 服务器。

根据您设置的值,它将导致在生成的index.html中包含 JavaScript 和 CSS 包的路径是绝对的:

<!doctype html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
    <meta name="theme-color" content="#000000">
    <link rel="manifest" href="mywebsite/web/manifest.json">
    <link rel="shortcut icon" href="mywebsite/web/favicon.ico">
    <title>React App</title>
    <link href="mywebsite/web/static/css/main.c17080f1.css" rel="stylesheet">
</head>

<body>
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root"></div>
    <script type="text/javascript" src="mywebsite/web/static/js/main.dbfd0e89.js"></script>
</body>

</html>
于 2018-08-05T11:21:47.753 回答
1

查看这个帖子的永久解决方案,我相信这是最方便的方法:

https://github.com/facebook/create-react-app/issues/2575#issuecomment-452295290

为了您的方便,我在这里复制并粘贴了:

在您的项目根目录(与 package.json 所在的位置相同)创建一个名为 .env 的文件。在这个文件中写下这个(在 url 周围没有引号):

PUBLIC_URL=https://dsomething.cloudfront.net

像往常一样构建你的项目(npm run build)这也将生成 index.html :

<script type="text/javascript" src="https://dsomething.cloudfront.net/static/js/main.ec7f8972.js">
于 2020-04-20T15:12:30.647 回答
0

随着文档位置的移动,跟进@patrick hund,似乎一些步骤已经改变。您可以在此处阅读并进行相应解释: CRA 中的高级部署

您可以在此页面中找到大量有用的信息,这些信息可以为您的下一个项目提供各种想法。这是我阅读页面后最喜欢的小技巧:

如果您不使用 HTML5 pushState 历史 API 或根本不使用客户端路由,则无需指定将提供应用程序的 URL。相反,您可以将它放在您的 package.json 中: "homepage": ".", 这将确保所有资产路径都相对于 index.html。然后,您将能够将您的应用程序从http://mywebsite.com移动到http://mywebsite.com/relativepath甚至http://mywebsite.com/relative/path,而无需重新构建它。

于 2020-11-19T16:11:47.453 回答