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 已被证明是全球数百万开发者的可靠伙伴。
无论如何,让我们来看看这种内置支持是如何工作的(或 跳到注意事项 部分)。
工作原理
使用 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
因此,如果你需要变量扩展,你应该继续使用 dotenv 和 dotenv-expand。
缺少 .env.vault
支持
.env.vault
文件是 .env
文件的精神继承者。它们比 .env
文件具有多项安全优势,你可以在 此处了解相关信息。
它们相当 新,但也非常适合生产环境和 CI,并且正在被多个社区采用,例如 node,python,rust 等等。
但作为一项新技术,它们不太可能被 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 帐户 并立即试用。