.env vs config.json

Pat*_*ykB 14 javascript node.js

我刚刚开始学习JavaScript/ node.js(对后端webdev的温和介绍),因此我在这个主题中完全是绿色的.

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

今天我发现(偶然).env文件,我越了解它,似乎越多人使用它来实际存储密码.

所以.envconfig.json什么时候应该使用,什么时候应该使用?

小智 15

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

任何一种方法都有效,并且您的配置文件是否存储在您的存储库中更多地取决于数据是否需要保密。


Der*_*ard 10

问题

什么时候应该.env使用config.json以及用于什么用途?

答案

这是一个相当困难的答案。一方面,在开发过程中,您仅应真正使用这两种工具中的任何一种。这意味着,在生产或类似产品的环境中,您可以将以下变量直接添加到环境中:

NODE_ENV=development node ./sample.js --mongodb:host "dharma.mongohq.com" --mongodb:port 10065
Run Code Online (Sandbox Code Playgroud)

彼此之间并没有真正明确的赢家,因为它们都以不同的方式提供帮助。您可以使用嵌套数据config.json,但另一方面,您也可以使用来简化数据结构.env

还需要注意的一点是,您永远不想将这些文件提交到源代码管理(git,svc等)。

另一方面,这些工具使初学者非常容易快速入门,而不必担心如何设置环境变量以及Windows环境和Linux环境之间的差异。

总而言之,我要说的完全取决于开发人员。

  • @Movahhedi 好问题 - 我相信你的评估是正确的;但我自己运行了一些测试,似乎对于性能来说差异实际上可以忽略不计(我在我们的产品应用程序上进行了测试,大约有一百万行代码) (2认同)

Joh*_*ore 9

这在很大程度上取决于个人偏好和您使用的框架的约定。它们只是用于存储相同类型信息的不同格式。

一些示例配置文件格式:

  • .env
  • *.yml (YAML 文件)
  • *.ini (通常仅适用于 Windows)
  • *.json

归根结底,它们都完成相同的目的:为您的应用程序提供特定于环境的信息(凭据、文件路径、连接字符串等)。选择最适合您选择的框架的格式。


dux*_*x-- 9

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

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


The*_*978 8

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

在撰写本文时,dotenv是一个小得多的包,但支持更多(实际贡献者除外,仅通过剩余问题的数量和巨大的受欢迎程度推断)。它也更新了 2.5 年,如果大张旗鼓对你很重要,那么它的星星数是它的两倍。

在此处输入图片说明

  • 大多数人不使用配置包,而只是使用 require 或 fs 和 json parse 将其加载到目录中 (13认同)

小智 5

如果您的目标是在 Docker 中部署应用程序,那么.env100% 就是正确的选择。使用嵌套数据的能力非常棒,但是当您需要将该数据迁移到 a以使 Docker 部署正常工作config.json时,您将需要查看一些 PITA 。两者都被设计为本地使用,所以如果您从它开始,那么它将有助于顺利地“Docker化”您的应用程序。.envdocker builddocker-compose.env

我目前正在移植一个应用程序以在 Docker 中运行,该应用程序是在没有这样的深思熟虑的情况下编写的,这是相当痛苦的......大量重构,并且针对嵌套的东西。基本key:value属性很容易迁移到.env

~$ cat config.json
{
  "PROTOCOL": "https",
  "HOST": "example.com",
  "PORT": 443
}
...

Run Code Online (Sandbox Code Playgroud)
~$ cat .env
PROTOCOL="https"
HOST="example.com"
PORT=443
Run Code Online (Sandbox Code Playgroud)