【问题标题】:Get React root url path获取 React 根 url 路径
【发布时间】:2019-07-25 22:09:29
【问题描述】:

我正在使用 create-react-app 和 react-router 创建一个反应应用程序。 我想获取我的 react 应用程序的根 URL 路径,因为它可以在不同的位置提供:

  • 生产中:example.com/interface/
  • 在本地:localhost/

不同页面的链接不受这种差异的影响,因为 react-router 根据 react 根路径处理 to-location。 实际上,我的图像存储在公共路径中,因此,我可以在基本位置访问它:/<page>

<img src={images/example.png}>

但如果我在子页面中,或者只是 URL 以“/”结尾,例如 /&lt;page&gt;/

<img src={images/example.png}>

无法正常工作,因为浏览器在 /&lt;page&gt;/images/example.png 而不是 /images/example.png 搜索图像。 此外,如果我将图像 src 设置为 /images/example.png 它仅适用于 localhost 但不适用于生产,因为在生产中,浏览器会在 example.com/images/example.png 而不是 example.com/interface/images/example.png 搜索图像

这就是为什么我需要获取反应根 URL 路径。例如,它允许我在 localhost 中获取“/”,在生产中获取“/interface/”

感谢您的帮助

【问题讨论】:

  • 在您的 &lt;head&gt; 部分尝试使用 &lt;base href="http://localhost/" /&gt;

标签: reactjs url path react-router location


【解决方案1】:

我找到了解决方案:Webpack 在环境变量PUBLIC_URL 中获取react root URL

解决办法是改变图片src:

<img src=`${process.env.PUBLIC_URL}/images/example.png`

它适用于生产、开发和所有其他环境。 谢谢你的帮助

【讨论】:

  • 无意冒犯,虽然这可能有效,但它完全违背了 webpack 资产管道的概念,并且会在某些时候给您带来问题。与其试图为不存在的问题寻找解决方法,我强烈建议你以正确的方式去做,特别是如果你是 React 新手。 ;)
【解决方案2】:

这可以通过在package.json 中设置homepage 属性来完成。
在构建项目时,您会看到一条解释它的消息:

该项目是在假设它托管在服务器根目录的情况下构建的。到 覆盖它,在你的 package.json 中指定主页。例如, 添加这个为 GitHub Pages 构建它:

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

查看文档:Deployment: Building for relative paths

如果您这样做,它在您的本地开发环境中工作时也应该在生产环境中工作。

在您的情况下,设置 "homepage": "https://example.com/interface/" 以使其在生产中工作。您不需要额外的代码。

请记住,您可能必须正确导入图像路径,以便由 webpack 处理逻辑。 您的组件中不应该有真正的 Web 路径,只需从您在开发环境中的路径中导入内容,然后魔法就会起作用。

import example from 'images/example.png';
[...]
<img src={example} />

Adding Images, Fonts and StylesUsing the public folder: When to use the public folder

【讨论】:

  • 用Webpack导入图片,不能存入public文件夹吗?我必须将图像存储在 src 文件夹中吗?
  • 是的。如果此图像与组件的逻辑相关(例如,Logo 组件有一个徽标图像要显示,ProfilePicture 组件有一个默认图像来显示现在图像是否由用户设置)存储该图像是有意义的与组件一起。根据导入图像的大小,webpack 会将其作为 base64 包含到 JavaScript 中(对于保存请求的小图标有意义)或使用唯一 ID 将其部署到 /static/media/。应用图像是资产,当您的应用更新时,您希望确保用户看到新图像。 Webpack 处理这个。
  • @Aurélien 了解更多详情,请参阅此处Adding Images, Fonts, and Files
【解决方案3】:

如果我正确理解您的问题,您希望能够根据您的开发环境和生产环境设置不同的根路径。

幸运的是,create-react-app 允许您使用 .env 文件创建环境变量。

您需要在本地和生产环境中使用这些文件之一。请注意,您不得将这些文件添加到版本控制中,因为它们通常包含密钥,即使它们不包含密钥也是一种好的做法。

创建.env 文件后,您需要为所有环境变量添加前缀REACT_APP&lt;environment variable&gt;,因此在本例中为REACT_APP_ROOT_PATH。 然后,您需要按如下方式进行设置;

REACT_APP_ROOT_PATH=localhost/ 用于您的本地环境,并且

REACT_APP_ROOT_PATH=example.com/interface/ 用于您的本地环境。

有关此功能的更高级用法,这里有一些文档:https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables#expanding-environment-variables-in-env

我希望这会有所帮助。

【讨论】:

  • @Aurélien Here 你会看到PUBLIC_URL 的描述。这不是你想要的。 REACT_APP_ROOT_PATH 甚至没有记录在那里。你应该关注Deployment: Building for relative pahts
  • @Frébo 未记录的原因是因为它是用户定义的自定义变量。只要你在env 变量前加上REACT_APP_,create-react-app 就会选择它们并且你可以在你的代码中使用它们。这是记录在here
猜你喜欢
  • 1970-01-01
  • 2017-01-09
  • 2021-07-23
  • 2021-04-12
  • 1970-01-01
  • 2011-05-28
  • 2014-09-15
  • 2020-12-11
  • 2017-06-08
相关资源
最近更新 更多