无法使用自定义 PUBLIC_URL 构建 create-react-app 项目

IT技术 javascript reactjs create-react-app
2021-04-04 23:01:21

我正在努力

PUBLIC_URL=http://example.com npm run build

使用最新的 create-react-script 构建的项目。

但是,出现的%PUBLIC_URL%inpublic/index.html被替换为空字符串,而不是预期值PUBLIC_URL

public/index.html 包含类似的代码

<script src="%PUBLIC_URL%/static/js/jarvis.widget.min.js"></script>

数小时的互联网搜索和堆栈溢出表明,关于PUBLIC_URL. 我从GitHub上克隆了create-react-app,一直在浏览代码,但尚未开悟。

有没有人对我做错了什么有任何建议?

6个回答

如果其他的答案不为你工作,还有一个homepage在外地package.json运行后,npm run build您应该收到如下消息:

The project was built assuming it is hosted at the server root.
To override this, specify the homepage in your package.json.
For example, add this to build it for GitHub Pages:

  "homepage" : "http://myname.github.io/myapp",

您只需将其添加为 中的根字段之一package.json,例如

{
  // ...
  "scripts": {
    // ...
  },
  "homepage": "https://example.com"
}

成功设置后,通过homepagePUBLIC_URL,您应该收到如下消息:

The project was built assuming it is hosted at https://example.com.
You can control this with the homepage field in your package.json.
据我所知,设置homepage似乎覆盖了PUBLIC_URL
2021-06-05 23:01:21
目前实际上有一个错误阻止它按预期工作:github.com/facebook/create-react-app/issues/8813
2021-06-06 23:01:21
当我回到 react-scripts 3.3.0 时,这对我有用。
2021-06-16 23:01:21

像我这样的人在构建中寻找这样的东西:

<script type="text/javascript" src="https://dsomething.cloudfront.net/static/js/main.ec7f8972.js">

然后设置https://dsomething.cloudfront.nethomepageinpackage.json将不起作用。

1. 快速解决方案

像这样构建你的项目:
(windows)

set PUBLIC_URL=https://dsomething.cloudfront.net&&npm run build

(Linux/Mac)

PUBLIC_URL=https://dsomething.cloudfront.net npm run build

你会得到

<script type="text/javascript" src="https://dsomething.cloudfront.net/static/js/main.ec7f8972.js">

在您构建的 index.html 中

2. 永久推荐方案

创建一个.env在项目根目录下调用的文件(package.json 所在的位置)。
在这个文件中写下这个(网址周围没有引号):

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">

3.奇怪的解决方案(在最新的react-scripts版本中不起作用)

将此添加到您的 package.json
“主页”:“http://dsomething.cloudfront.net”,

然后 index.html 将生成:

<script type="text/javascript" src="//dsomething.cloudfront.net/static/js/main.ec7f8972.js">

这与以下内容基本相同:

<script type="text/javascript" src="https://dsomething.cloudfront.net/static/js/main.ec7f8972.js">

在我的理解中。

Github 问题 Github 评论

@Vaibhav 嗨!我面临着不同的问题。我想将/static/js路径更改/static/dashboard/js/. 但我无法在互联网上找到有关如何执行此操作的任何解决方案。任何的想法?我什至也问过一个问题。在此处查看stackoverflow.com/questions/66655025/...
2021-05-25 23:01:21
它不适用于最新的 react 脚本版本,请使用 .env 方法。
2021-06-08 23:01:21
这个答案是github.com/facebook/create-react-app/issues/8813 中描述的反应错误的解决方案对此,我怎么感谢你都不为过。
2021-06-12 23:01:21
我不太确定他们为什么关闭这个问题。唯一对我有用的解决方案是您建议的第三个解决方案,这确实看起来很奇怪。因此我仍然认为这是一个错误。或者有人可以向我解释在问题关闭之前最后一条评论的含义吗?
2021-06-18 23:01:21

这不是 PUBLIC_URL 变量的使用方式。根据文档,您可以在 HTML 中使用 PUBLIC_URL:

<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">

或者在你的 JavaScript 中:

render() {
  // Note: this is an escape hatch and should be used sparingly!
  // Normally we recommend using `import` for getting asset URLs
  // as described in “Adding Images and Fonts” above this section.
  return <img src={process.env.PUBLIC_URL + '/img/logo.png'} />;
}

PUBLIC_URL 不是您设置为您选择的值的东西,它是一种在 Webpack 构建系统之外的部署中存储文件的方法。

要查看此内容,请运行您的 CRA 应用程序并将其添加到src/index.js文件中:

console.log('public url: ', process.env.PUBLIC_URL)

你会看到 URL 已经存在。

CRA 文档中阅读更多内容

实际上,不同操作系统之间设置环境变量的方式是不同的。

Windows (cmd.exe)

set PUBLIC_URL=http://xxxx.com&&npm start

(注意:缺少空格是有意的。)

Linux、macOS (Bash)

 PUBLIC_URL=http://xxxx.com npm start

受到推崇的: cross-env

{
  "scripts": {
    "serve": "cross-env PUBLIC_URL=http://xxxx.com npm start"
  }
}

参考:create-react-app/README.md#adding-temporary-environment-variables-in-your-shell at master · facebookincubator/create-react-app

为什么你npm startbuild脚本?
2021-06-17 23:01:21
{“脚本”:{“开始”:“npm运行服务”}}
2021-06-18 23:01:21

查看文档你可以有一个 .env 文件来获取 PUBLIC_URL

虽然你应该记住它的用途 -

您可以使用此变量强制将资产逐字引用到您提供的 url(包括主机名)。这在使用 CDN 托管您的应用程序时特别有用。