【发布时间】:2021-01-26 06:00:38
【问题描述】:
我的目标是找到一种方法,为我的 React 应用程序的各种“轨道”动态提取特定于环境的配置值:开发、登台和生产。最常规定的解决方案涉及使用环境变量,我觉得这不是很好,因为:
- 我的一些配置值是敏感数据,例如 API 密钥、数据库密码等,我理想情况下不会在本地和本地以纯文本形式保存这些数据在 CICD 系统上
- 必须手动设置环境变量容易出错并且不能很好地扩展(这是一个大型项目,需要设置 20 多个与配置相关的键值对)。记录需要设置哪些环境变量也很困难,因此对于多协作团队来说这不是一个方便的解决方案,因为每个人都需要跟踪列表并将值复制粘贴到他们的本地机器中以共享 API 密钥等(或者更糟糕的是,将它们硬编码/检查到源代码中)
我尝试了以下两种通用方法:
- 使用node-config - 它看起来很有前途,因为它轻巧、灵活且可扩展(它允许在
default.js上定义基值并用development.js、staging.js、production.js或自定义环境变量覆盖它们) .最重要的是,我们可以将机密存储在远程服务中(例如 AWS/GCP Secrets Manager、envkey 等)。该解决方案适用于我的 Node 后端,但目前不适用于基于 React 构建的前端应用 - 使用dotenv(或dotenv-safe,以允许在另一个
.env.example中记录.env 文件的结构,该.env.example已签入源代码管理)。对于我们项目需要的每个环境,这不是我喜欢的方法,因为 dotenv discourages using multiple .env files。其次,我可能仍然需要找到另一种方法将环境变量输入我的 CICD 系统。在 [remote] 构建系统上重新定义 env var 感觉就像做两次工作 - 第一次是在用于本地开发的 .env 文件上。
这两种方法都会产生一个熟悉的问题:TypeError: fs.readFileSync is not a function。根据this related question,似乎根本问题是the 'fs' module is not designed to work on the browser(dotenv 和node-config 都是底层使用'fs'的低级模块)。 如果我们不能在客户端使用 fs(或者更确切地说,依赖它的模块):可扩展/生产级 React 项目通常如何以理智的方式管理配置值?我知道hashicorp/vault存在,但它似乎有点矫枉过正,因为我们可能不得不建立自己的基础设施。
我也想知道是否有任何开源工具可以解决这个常见问题......
【问题讨论】:
-
在基本文件的基础上创建多个 .env 文件。像 .env.dev .env.stage .env.prod。当您创建构建或启动它时,传递一个环境变量。指定环境的命令行。然后在构建或启动之前,将该 evn 的相应 env 文件的内容复制到主 .env 文件中。 React 应该正确拾取正确的骨骼 env 弹性
-
@quirimmo 我希望避免在 .env 文件之间复制粘贴。无论如何,我找到了一个基于多普勒的更好的解决方案
标签: javascript reactjs configuration environment-variables dotenv