【问题标题】:How to update environment variables without rebuilding the React app image如何在不重建 React 应用映像的情况下更新环境变量
【发布时间】:2022-07-26 04:09:40
【问题描述】:

我正在构建一个 dockerized React 应用程序,需要为 API URL 定义一些环境变量。然而,React 在构建阶段注入了这些变量,所以每次环境变化时我都需要重建整个图像。这会减慢我的流程,因为我无法将同一个应用映像重复用于认证和生产。

我已经搜索了一些模式,现在我正在使用一个 JS 配置文件来动态注入环境,但它看起来并不是很简单。有人知道处理这个问题的更好方法吗?

【问题讨论】:

  • 如果您使用 env vars 进行构建时配置,则不能。此外,您在不同环境中使用不同图像而不是推广一种资产这一事实大大降低了您在其中进行的任何测试的价值。参见例如blog.jonrshar.pe/2020/Sep/19/spa-config.html.
  • 非常感谢,我正好在找这样的文章,但是找不到

标签: javascript reactjs docker environment-variables


【解决方案1】:

我最近遇到了同样的问题,然后我发布了一些包:@import-meta-env/*到npm来解决问题。

这个插件在一个特殊的 import.meta.env 对象上公开环境变量(深受 Vite 的启发)。

在生产期间,它将被静态地替换为占位符,而不是当前的环境变量。

因此,我们可以在任何地方运行脚本来使用系统中的环境变量填充文件。

您可以在https://iendeavor.github.io/import-meta-env/ 看到更多信息。

我还创建了一个 Docker 示例:https://github.com/iendeavor/import-meta-env/tree/main/packages/examples/docker-starter-example

希望这对需要它的人有所帮助。

【讨论】:

  • 这真的很有趣,我一定会在测试项目中尝试一下。谢谢!
  • 太棒了!如果它解决了您的问题,请随时接受答案:)
【解决方案2】:

您想要完成的是将“一次构建,多次部署”的原则应用于 ReactJS 应用程序。

以下文章介绍了执行此操作的一些可用选项: https://profinit.eu/en/blog/build-once-deploy-many-in-react-dynamic-configuration-properties/

一次构建,多次部署是软件的基本原则 发展。主要思想是对所有人使用相同的捆绑包 环境,从测试到生产。这种方法可以轻松 部署和可测试性,被认为是基本原则 的持续交付。它也是十二因子的一部分 方法。尽管它很重要,但它并没有收到显着的 在前端开发领域的支持,而 React 不是 例外。

文章提供的最简单的解决方案是基于外部配置文件。

外部配置文件:

// public/config.js
// provided by the customer as a resource in the public folder, after compilation

const apiUrl = "http://api.myservice.com";
const env = "TST";

网站根目录(index.html):

<script src="%PUBLIC_URL%/config.js"></script>
<script>
  window.config = { apiUrl, env };
</script>

换句话说,您的捆绑(构建/编译)应用应导入外部config.js 文件,并使用window 对象使其全局可用。

本文继续提供一些更高级和更精致的选项,但以上内容对于简单的用例应该足够了。

【讨论】:

    【解决方案3】:

    是的,这确实是环境变量的问题。您想要实现的目标可以通过通常称为“远程配置”或“配置即服务 - CaaS”的服务来完成。此服务通知您的应用程序某些外部数据已更改。我强烈推荐LaunchDarklyFirebase,但你总是可以选择自己构建它(虽然不是一个快速的解决方案)。 避免多个环境构建的唯一方法是在 CaaS 上应用规则并根据谁请求(例如,基于请求的“Origin”标头)修改响应

    【讨论】:

    • “你无法避免多个环境构建。这是事实” - 你可以(并且可能应该 i>,与为每个部署环境都构建新版本相比,推广单个工件是一种更安全的模式),所以事实并非如此。这也不是功能标记的用途。
    • 只要您必须使用环境变量,那么您就需要不同的构建。您不能只将所有与环境相关的数据添加到一个文件中并在所有环境中提供它
    • OP 明确提到“需要为 API URL 定义一些环境变量”。
    • 啊,我明白你的意思了——是的,如果你在构建时进行配置(使用环境变量或其他方式),那么重新配置意味着重新构建。但是您可以将所有与环境相关的数据提取到一个文件中并在环境之间交换它,例如,OP 的当前“需要”定义环境变量实际上可能不是硬性要求。
    • 是的,我正在使用这种方法(将 env 提取到文件中)。它工作得很好,但在我的 POV 中并不是很简单。无论如何,考虑到当今前端的工作方式,这似乎是最好的解决方案哈哈
    猜你喜欢
    • 2019-09-17
    • 2016-04-16
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 2019-08-06
    相关资源
    最近更新 更多