关于:
使用环境变量注入正确的服务器主机和端口
进入您的应用程序。
这既不是代理服务器也不是开发服务器。如果proxy 没有为您提供足够的灵活性(即,如果您需要使用http、https 或ws 以外的协议),这是关于如何处理每个环境的服务器设置的建议。例如,如果您的代码中有一个 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 限制的情况下,所有这些行为都非常容易处理。
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 变量注入端口和主机?”