← 返回博客 Mot

Mot

Node.js 20.6.0 内置支持 .env 文件

Node v20.6.0+ 版本添加了对加载 .env 文件的原生支持。

node --env-file=.env index.js

哇,酷!

dotenv 死了 吗? 停止使用它? 没那么快。 不要马上放弃 dotenv。在使用之前,你应该了解一些注意事项。

首先,我要说,看到 NodeJS 团队为开发者采用了一流的 .env 支持,真是太棒了。作为 dotenv 的先驱之一,我感到很荣幸。dotenv 被 GitHub 上超过 1400万 个开源仓库依赖,每周下载量超过 3500万 次。 dotenv 已被证明是全球数百万开发者的可靠伙伴。

无论如何,让我们来看看这种内置支持是如何工作的(或 跳到注意事项 部分)。

可以在 GitHub 上找到这篇博文的完整 代码示例

工作原理

使用 nvm 安装 Node v20.6.0 或更高版本。

nvm install 20.6.0
nvm use 20.6.0
node -v
v20.6.0

创建你的 .env 文件。

HELLO="World"

创建你的 node 脚本以利用它。

// index.js
console.log(`Hello ${process.env.HELLO}`)

使用 --env-file 标志运行它。

node --env-file=.env index.js
Hello World

就这样!

想要在生产环境中运行它吗? 只需将它指向一个 .env.production 文件即可。

# .env.production
HELLO="production"
node --env-file=.env.production index.js

注意事项

目前最大的 注意事项 是,这仍然是一个实验性功能。这意味着它会附带 错误 以及 缺少功能支持hn 上的热门评论 很好地概括了这一点,尽管有点不耐烦。

我还想强调 目前 这个词,因为这一切仍在积极开发中。这些事情需要时间。当你读到这篇文章的时候,其中一些注意事项可能就不存在了。

缺少多行支持

当前的实现不支持多行环境变量。如果你尝试包含一个多行环境变量,它将是 undefined。例如

# .env.multiline
HELLO="This
is
a
multiline"
// index.js
console.log(`Hello ${process.env.HELLO}`)
node --env-file=.env.multiline index.js
Hello undefined

注意:多行支持正在积极讨论中,并且可能会在不久的将来被添加。

缺少覆盖选项

你无法使用 .env 文件覆盖系统环境变量。没有这种选项。

# .env
HELLO="World"
// index.js
console.log(`Hello ${process.env.HELLO}`)
export HELLO="System"
node --env-file=.env index.js
Hello System

它会打印 Hello System 而不是 Hello World。没有覆盖系统变量的选项。

如果你需要这样做,则继续使用 带有覆盖选项的 dotenv

缺少变量扩展

dotenv 的变量扩展支持存在于一个单独的库 dotenv-expand 中。但是,它每周被 1300万次下载 使用,因此实际上被认为是 dotenv 的一部分。

截至撰写本文时,Node 不支持变量扩展。相反,它会将变量作为字符串输出。

# .env
PASSWORD="password123"
SECRET=$PASSWORD
// index.js
console.log(`The secret is ${process.env.SECRET}`)
node --env-file=.env index.js
The secret is $PASSWORD

因此,如果你需要变量扩展,你应该继续使用 dotenvdotenv-expand

缺少 .env.vault 支持

.env.vault 文件是 .env 文件的精神继承者。它们比 .env 文件具有多项安全优势,你可以在 此处了解相关信息

它们相当 ,但也非常适合生产环境和 CI,并且正在被多个社区采用,例如 nodepythonrust 等等。

但作为一项新技术,它们不太可能被 Node 原生采用,除非它们像 .env 文件一样获得广泛使用。因此,如果你打算使用它们,请继续使用 dotenv

#/-------------------.env.vault---------------------/
#/         cloud-agnostic vaulting standard         /
#/   [how it works](https://dotenv.org/env-vault)   /
#/--------------------------------------------------/
# development
DOTENV_VAULT_DEVELOPMENT="AtEC33ZfFJQMSE6C+EBX8nzTyQzfC+xhsIfGjyWr47jiHsUi07PHzX2/RmCB0PIi"
# production
DOTENV_VAULT_PRODUCTION="t9van8HefnTIHVlK3vQ6WYLtWEOvPunEnOphV3Hw3aBTBDuwLq22yU0Tdl5fAnk="

总结

总而言之,对 .env 文件的内置支持(即使当前是实验性的)是 Node 的一个巨大且受欢迎的进步。非常感谢 Yagiz Nizipli 让这一切成为现实。 在 GitHub 上赞助他。他为 Node 做出了非凡的贡献。

但是,目前还有一些注意事项,我建议你现在不要为生产应用程序执行 npm uninstall-ing dotenv。等到它不再是实验性功能,并且添加了对上述缺少功能的支持之后再做。


使用新的 --env-file 标志?

dotenv-vault 是完美的伴侣。使用它来同步你的 .env 文件,并轻松地在不同环境之间切换。 创建你的 Dotenv 帐户 并立即试用。

https://dotenv.org/signup

通过 RSS 订阅 或关注我们 @dotenvx 𝕏