【问题标题】:How to inject port and host using ENV variable in Create React App Proxy settings?如何在 Create React App Proxy 设置中使用 ENV 变量注入端口和主机?
【发布时间】:2017-10-11 10:54:37
【问题描述】:

是否可以在 CRA 中设置与 package.json 不同的代理设置?例如使用 ENV 变量?

来自 CRA docs 声明

使用环境变量将正确的服务器主机和端口注入您的应用程序。

这句话是关于代理还是开发服务器本身?

根据thisthis,影响代理设置的唯一方法是通过package.json。

【问题讨论】:

  • 我也在寻找类似的东西,你找到解决方案了吗?
  • 很遗憾没有:(

标签: reactjs proxy create-react-app


【解决方案1】:

关于:

使用环境变量注入正确的服务器主机和端口 进入您的应用程序。

这既不是代理服务器也不是开发服务器。如果proxy 没有为您提供足够的灵活性(即,如果您需要使用httphttpsws 以外的协议),这是关于如何处理每个环境的服务器设置的建议。例如,如果您的代码中有一个 api 调用,您可以使用环境变量来执行以下操作:

axios(process.env.REACT_APP_BASE_URL + endpoint, options).then(data=>{ console.dir(data); })

每个环境都有自己的REACT_APP_BASE_URL 定义。


没有package.json

不修改package.json是不可能影响代理设置的。

Configuring the Proxy Manually (CRA docs)

package.json 是唯一记录在案的影响代理设置的方式。

您还可以看到line 96 of CRA's start.js。这种实现完全无法使用 ENV 变量将主机/端口注入 CRA 的代理设置。

说实话,这确实是我讨厌 CRA 的原因之一。在不受 CRA 限制的情况下,所有这些行为都非常容易处理。


You could just eject create react app:

npm run eject

所有这些问题都会立即消失...上面引用的start.js 脚本是一些被弹出的代码。所以你可以很容易地用 ENV vars 替换那些代理设置。

请务必在执行此操作之前为自己创建一个检查点,因为不会恢复弹出。

但是——如果你必须坚持使用 CRA——你CAN很容易使用环境变量修改package.json


如何在构建时将 ENV 变量注入package.json

这基本上就是 CRA 对 REACT_APP_ 环境变量所做的事情(尽管它直接将它们注入到 process.env)。

package.json 只是一个大 JSON 对象,所以您需要做的就是在部署之前在服务器端解析它,将 "proxy" 值更新为 ENV 变量提供的值,保存文件,然后运行您的构建/部署。

这里有一个非常简单的例子来说明如何实现这一点,您只需要在部署之前在您仍然可以访问process.env 的上下文中运行此脚本

const fs = require('fs');

// read/process package.json
const file = './package.json';
let pkg = JSON.parse(fs.readFileSync(file).toString());

// at this point you should have access to your ENV vars
pkg.proxy = `${process.env.HOST}:${process.env.PORT}`;

// the 2 enables pretty-printing and defines the number of spaces to use
fs.writeFileSync(pkg, JSON.stringify(file, null, 2));

我知道这并没有明确回答如何处理“没有 package.json”的问题,但我认为这不是必要的方法。

此外,这确实回答了 title 问题“如何在 Create React App Proxy 设置中使用 ENV 变量注入端口和主机?”

【讨论】:

  • 如何将环境变量传递给包文件?
  • 这是因为您不理解答案而被否决了吗?那是相当不体谅的......你真的应该先评论并要求澄清。这是一个使用 Node.JS 的简单过程。我将很快用一个例子更新我的答案。
  • 很抱歉,您的答案被否决了,没有提供任何解释或评论。但我很高兴您意识到您没有回答问题,或者至少没有提供最佳解决方案。
  • @JonnyAsmar 你的答案现在很清楚了,我看到了你和我的答案之间的区别,谢谢。
  • 这是一个很好的答案,乔尼。对我来说,最有帮助的部分是你的第四部分,所以我会把它移到顶部。我误解了文档中的句子 --- 对我来说,听起来 CRA 会读取像 PROXY_PORT 和 PROXY_HOST 这样的环境变量并使用它而不是 package.json 中的内容。也许最初的问题标题有点模棱两可,但对我来说,我并不是在寻找将环境变量放入 package.json 的解决方法,而是为了了解 CRA 本身是否查看了任何环境变量,如果没有,为什么文档似乎表明确实如此。
【解决方案2】:

注意:此功能适用于 react-scripts@2.0.0 及更高版本。

您现在可以手动配置代理。您需要先安装http-proxy-middleware

npm install http-proxy-middleware --save

然后创建一个文件src/setupProxy.js,内容如下。

const { createProxyMiddleware } = require('http-proxy-middleware');

module.exports = function(app) {
  app.use(
    '/api', // You can pass in an array too eg. ['/api', '/another/path']
    createProxyMiddleware({
      target: process.env.REACT_APP_PROXY_HOST,
      changeOrigin: true,
    })
  );
};

您现在可以在.env 文件中添加代理,记住您需要REACT_APP_ 前缀,以便开发服务器获取环境变量。

REACT_APP_PROXY_HOST=http://localhost:5000

参考:Proxy manually

【讨论】:

  • 就是这样
【解决方案3】:

是否可以在 CRA 中设置与 package.json 不同的代理设置?

没有。这不可能。好吧,至少现在还没有(2017/01/14)。

React 代理功能正在变得有点 complicated,因此,在 "advanced" proxy configuration 的简化完成后,将尽快实现从环境变量在 React 应用程序中设置代理的想法。

这句话是关于代理还是开发服务器本身?

这是关于开发服务器本身的。就目前而言,所有代理配置都在包文件中进行配置。

【讨论】:

  • 感谢您的回答。我认为对于后半部分,这句话实际上既没有引用开发服务器,也没有引用代理服务器,正如@Jonny 所解释的那样
【解决方案4】:

您可以为端口和主机定义环境变量。 REACT_APP_PORT: "PORT of Application", REACT_APP_HOST: "host of application"

要将所有环境注入您的应用程序,您可以使用webpack define plugin

您需要在插件部分添加类似。

const env = require("path to your env file")
//other webpack settings
plugins: {
//plugins
new webpack.DefinePlugin(env)
}

现在,如果您看到 code of create-react-app,它会首先在 env 变量中查找 porthost

另外,请注意

必须创建以REACT_APP_ 开头的自定义环境变量。除了NODE_ENV 之外的任何其他变量都将被忽略,以避免意外暴露机器上可能具有相同名称的私钥

【讨论】:

  • 如何反应知道这些env 变量是否用于代理而不是用于运行应用程序本身?
  • 两者都将使用相同的设置。
  • 如果客户端运行在 3000 端口,服务器运行在 4000 端口怎么办?另外,这不是使用代理吗?发送来自寻求其他服务器资源的客户端的请求?或者让我问一下,为什么要代理在同一服务器和端口中运行的请求?
  • 在这种情况下,我使用 react env 变量,如 REACT_APP_BASE_URL : {server URL} 和我使用的所有 api,如 {REACT_APP_BASE_URL}/api/someapi
  • 如果服务器和客户端都在同一个主机上运行,​​为什么还需要代理?
猜你喜欢
  • 2020-04-02
  • 2017-07-16
  • 2013-02-27
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 2022-08-05
  • 2020-08-07
相关资源
最近更新 更多