在 package.json 中使用 `"homepage"`,不会弄乱本地主机的路径

IT技术 reactjs create-react-app
2021-03-27 02:07:10

这个问题实际上是直接从我如下的回答对前一个问题。

我添加了一个"homepage"package.json因为它是我在 Github Pages 上托管的 React 应用程序。输出npm run build/build现在可以部署目录,并且假设项目托管在/project_name/.

但是在 localhost 上,该项目没有托管在/project_name/,因此为 js 和 css 请求的路径混乱(寻找/project_name/static/...而不是/static/...)并且应用程序损坏。

如何在 package.json 中拥有 homepage 字段,以便他们可以部署到 Github Pages(例如),同时仍然使用可运行的应用程序在本地开发?

5个回答

文档create-react-app解释了如何从不同的相对路径服务相同的构建。

如果你把主页作为

"homepage": ".",

资产将相对于index.html. 然后,您可以将您的应用从移动http://mywebsite.comhttp://mywebsite.com/relativepath甚至http://mywebsite.com/relative/path无需重建。

出于开发目的,服务使用yarn startnpm start就足够了。应用程序将在本地主机中可用

@NadeemJamali 在他们提到正式发布此功能github.com/facebook/create-react-app/issues/...之后的一些评论,但请注意,它不适用于客户端路由。
2021-05-25 02:07:10
反应家伙不推荐这样做... github.com/facebook/create-react-app/issues/ ...
2021-05-31 02:07:10
答案与问题不符。
2021-06-05 02:07:10
看起来这篇文章让主页与客户端路由一起工作:medium.com/@svinkle/...
2021-06-05 02:07:10
@Rohmer,你说得对。他们确实有一个拉取请求。我不确定 CRA 的客户端路由。这对我来说一直是一种痛苦。
2021-06-08 02:07:10

您可以使用PUBLIC_URL环境变量来覆盖特定构建的主页。更好的是在你的 package.json 中设置它,例如:

{
  // ...
  "scripts": {
    "build": "react-scripts build",
    "build-localhost": "PUBLIC_URL=/ react-scripts build"
    // ...
  }
  // ...
}
这对我有用!gh-pages 需要 package.json 中的 homepage 值,所以它破坏其他东西有点烦人,但这有效!
2021-06-05 02:07:10
我一直在尝试这个,虽然它似乎在某种程度上起作用(应用程序现在托管在“/”),但在我的代码中引用 %PUBLIC_URL% 或 process.env.PUBLIC_URL 的任何地方仍然获得在“主页”属性在 package.json 中。但是,如果我在 .env 文件中更改它,它会更改这些变量。知道我做错了什么吗?
2021-06-06 02:07:10
在我的 Windows 设置中,PUBLIC_URL=/ 被转换为 %2520,所以我只写了 PUBLIC_URL=(空白)并且它可以工作
2021-06-07 02:07:10
工作正常。当我 npm start 时,浏览器打开指向这个变量。谢谢!
2021-06-19 02:07:10

例如,问题可能是因为“index.html”文件指向“/static/js/...js”,如果我们在根文件夹中发布应用程序,这将起作用,但是如果您在根文件夹中有各种静态开发使用同一台 Apache 服务器的同一台机器你有问题。

使用以下命令配置 Package.json:

"homepage": "."

这将使用相对路径,而不是在当前文件夹中使用绝对路径。即“./static/js/...js” 进行此更改时最常见的错误是插入“./”而不是“.”

此外,如果您没有使用 react-router,即没有客户端路由,那么没有这个 hack 应该是安全的。

这是对sudo bangbang 此处发布的较旧答案的重复答案
2021-06-14 02:07:10

您可以使用 dev shell 环境覆盖主页设置:

$ export PUBLIC_URL=http://localhost:3000/ 
$ yarn start 

或者,如果您愿意,请在为生产构建之前删除您的主页设置并配置您的 env:

$ export PUBLIC_URL=http://example.com/subdir 
$ yarn build
在 package.json 中设置主页对我来说从来没有用过,但确实如此。
2021-05-31 02:07:10
“ export PUBLIC_URL= localhost:3000 ”这个命令对我有用多谢。
2021-06-19 02:07:10

对于来这里寻找一体式答案的人来说,该答案涵盖了 react-router-dom:

  1. 添加package.json['homepage']为您的生产网址。需要注意的是,CRA 构建步骤删除了 url 的域部分,只留下索引路径。

  2. 为本地主机构建时,请执行 PUBLIC_URL=/ npm run build

  3. 按照本文的建议添加<base href="%PUBLIC_URL%" />到您的public/index.html页面中它将提供对资产(img、css)的支持,并将公开以供以后重用。%PUBLIC_URL%

  4. 在创建 BrowserRouter (通常是 App.js 或 main.js)的组件中,添加:

    const basename = document.querySelector('base')?.getAttribute('href') ?? '/'    
    
  5. 用于: <BrowserRouter basename={basename} />