[英]How is it possible to access homepage from package.json in a react app?
我创建了一个将从/example-path
提供服务的 React 应用程序。 我在package.json
中这样定义它:
"homepage":"/example-path"
到目前为止它一直有效,但现在我想用react-router-dom
添加路由,它错误地将/example-path
检测为 URL 的一部分。
这是我的代码:
<Router>
<Switch>
<Route path="/product/:id" children={<DisplayProduct />} />
</Switch>
</Router>
不幸的是react-router-dom
试图匹配完整的 URL /example-path/product/10
。 如何避免这种情况? 是否有可能以某种方式访问homepage
变量?
我可以使用<Router basename="/example-path">
,但那样的话,这个参数是重复的。 我只想在一个地方定义它。
Router
对您的package.json
。 它只是查看浏览器的位置。 如果您使用basename
,则可以设置基本BrowserRouter
:
import {BrowserRouter as Router} from 'react-router';
<Router basename="/example-path">
{/* ... */}
</Router>
假设您使用的是create-react-app
,这实际上非常简单:
将以下内容添加到public/index.html
:
<script>
window.PUBLIC_URL = "%PUBLIC_URL%";
</script>
现在您可以从 JavaScript 引用主页了! 只需通过
const myPublicUrl = window.PUBLIC_URL;
注意:如果homePage
中没有设置package.json
字段,则该变量将为空字符串,因此我们必须对此进行补偿:
<Router basename={window.PUBLIC_URL && window.PUBLIC_URL.length > 0 ? window.PUBLIC_URL : "/"}>
{/* ... */}
</Router>
我们可以使用
PUBLIC_URL
环境变量访问 package.json 的homepage
字段中设置的 URL。
我们有时使用相对的 URL 将应用程序部署在子目录中,例如我们将应用程序部署在https://myhostname.com/example-path
中。 为此,我们可以为应用程序构建设置环境变量PUBLIC_URL=/example-path
或将 package.json 主页属性设置为"/example-path"
。 在您的情况下,您已设置
"homepage": '/example-path/'
那么PUBLIC_URL
将设置为/example-path/
。 现在你可以在你的 react 应用程序的任何地方访问这个环境变量。
<Router basename={process.env.PUBLIC_URL}>
<Switch>
<Route path="/product/:id" children={<DisplayProduct />} />
</Switch>
</Router>
运行npm run build
后,您可以在build/index.html
中检查您使用%PUBLIC_URL
的所有位置都设置为/example-path/
,如下所示;
<script type="text/javascript" src="/example-path/static/js/main.ec7f1972.js">
由于您使用的是create-react-app
package ,因此您可以在package.json
中使用环境变量而不是"homepage":"/example-path"
:
在项目的根目录中创建.env
文件。
将REACT_APP_HOME_PAGE='/example-path/'
添加到.env
文件
现在您可以通过应用程序中的process.env.REACT_APP_HOME_PAGE
访问您的环境变量,如下所示:
<Router basename={process.env.REACT_APP_HOME_PAGE}>
我不知道你的 Router 文件的位置在哪里,但你可以尝试将它作为 json 导入到由create-react-app
cli app 创建的src/index.js
文件中,如下所示;
import myPackageJson from '../package.json';
或者
import { homepage } from '../package.json';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.