.env与config.json的区别

50

我刚开始学习 JavaScript / node.js(一个温和的后端网络开发入门),因此我在这个主题上完全没有经验。

几天前,我正在阅读一篇教程,从中学会了将我的机密数据(如密码)保存在 config.json 文件中。

今天我偶然发现了 .env 文件,越了解它,似乎就越有人使用它实际上存储密码。

那么我应该什么时候使用 .env,什么时候使用 config.json

7个回答

37

问题

在什么情况下应该使用.env而不是config.json

答案

这是一个相当困难的问题。一方面,你只应该在开发时真正使用这些工具。这意味着在生产或类似生产的环境中,你应该直接将这些变量添加到环境中:

NODE_ENV=development node ./sample.js --mongodb:host "dharma.mongohq.com" --mongodb:port 10065

就本身而言,两者都有其独特的用处,没有真正的胜者。你可以使用config.json进行嵌套数据,但另一方面,.env可以提供更清晰的数据结构。

需要注意的是,这些文件不应该提交到源代码控制(git、svc等)中。

另一方面,这些工具使初学者能够很容易地开始编程,无需担心如何设置环境变量以及Windows环境和Linux环境之间的差异。

总的来说,我认为这取决于开发者。


1
有性能差异吗?乍一看,.env 需要一个 Node 包来读取,但 JSON 不需要。你有什么想法吗? - Movahhedi
1
@Movahhedi 很好的问题 - 我认为你的评估是正确的;但是我自己运行了一些测试,似乎差异对性能来说微不足道(我在我们的生产应用程序上进行了测试,该应用程序大约有一百万行代码)。 - Derek Pollard
1
我也在考虑性能方面的权衡,但所有这些成本都是构建时间成本。就用户体验和总体构建时间性能而言,读取这些文件所添加的JavaScript总行数似乎微不足道。 - ProLoser

28

.env 文件通常用于存储与特定部署环境相关的信息,而 config.json 文件可能用于存储整个应用程序特定的数据。

两种方法都可以,您的配置文件是否存储在存储库中更多取决于数据是否需要保密。


1
请问您能否添加一个示例,展示一下这个是什么样子的? - Eggcellentos

11
这主要取决于个人偏好和你正在使用的框架的惯例。它们只是存储相同类型信息的不同格式。
一些示例配置文件格式:
  • .env
  • *.yml(YAML 文件)
  • *.ini(通常仅限 Windows)
  • *.json
最终,它们都能实现相同的目的:为应用程序提供特定于环境的信息(凭据、文件路径、连接字符串等)。选择最适合你所选框架的格式即可。

11

我认为这完全取决于您,重要的是要记住使用这种方法的原因。这个想法是将敏感数据保存在一个不会被推送到源代码控制或任何其他地方而只存在于您本地环境的文件中-这样可以保证数据更加安全。然后,当你准备好部署到远程服务器时,你需要手动将这些值插入到该环境中。

通常我使用.env文件,因为从.env文件中获取数据的语法在许多远程环境中都有支持-比如heroku。当我将应用部署到heroku时,我可以进入应用的设置,并使用heroku dashboard UI输入环境变量-我不需要手动创建json文件等(也许有其他解决方法)。变量放置好后,我只需使用process.env.variableName来访问数据。


1
此外,许多远程环境提供命令行实用程序,以将 .env 文件添加到这些环境中。 - Urchboy

9

统计比较这两个NPM包(以及其他类似的解决方案)可能是自己做决定的最佳方式。

在撰写本文时,dotenv 是一个更小的包,但具有更好的支持(除了实际贡献者之外,仅通过剩余问题的数量和巨大的流行度得出)。它也比另一个新约2.5年,如果对你来说声望很重要,它有两倍的星星数。

enter image description here


12
大多数人不使用config包,而是使用require或fs加载目录,并使用JSON解析。 - Harry Kruger

5
如果您的应用程序目标部署在Docker中,那么.env绝对是最佳选择。在config.json中使用嵌套数据的能力非常棒,但当您需要将该数据迁移到.env以使其与Docker配合工作时,您将会遇到一些麻烦。docker builddocker-compose都是原生设计为使用.env,因此如果您从这里开始,它将为“Dockerizing”您的应用程序提供平滑的路径。
我正在将一个没有这种预见性的应用程序移植到Docker中,这是相当痛苦的...需要大量重构,只为了处理嵌套内容。基本的key:value属性很容易迁移到.env中:
~$ cat config.json
{
  "PROTOCOL": "https",
  "HOST": "example.com",
  "PORT": 443
}
...


~$ cat .env
PROTOCOL="https"
HOST="example.com"
PORT=443

2

我更喜欢使用JSON,因为TypeScript可以从中推断出类型,而在环境文件中则不行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接