Environment Variables
示例
Next.js 内置支持环境变量,让你能够:
加载环境变量
Next.js 内置支持将 .env*
文件中的环境变量加载到 process.env
中。
这会自动将 process.env.DB_HOST
、process.env.DB_USER
和 process.env.DB_PASS
加载到 Node.js 环境中,让你可以在 Next.js 数据获取方法 和 API 路由 中使用它们。
例如,使用 getStaticProps
:
使用 @next/env
加载环境变量
如果你需要在 Next.js 运行时之外加载环境变量,比如在 ORM 或测试运行器的根配置文件中,你可以使用 @next/env
包。
Next.js 内部使用这个包从 .env*
文件加载环境变量。
要使用它,安装该包并使用 loadEnvConfig
函数来加载环境变量:
然后,你可以在需要的地方导入配置。例如:
引用其他变量
Next.js 会自动展开使用 $
引用其他变量的变量,例如 .env*
文件中的 $VARIABLE
。这允许你引用其他密钥。例如:
在上面的示例中,process.env.TWITTER_URL
将被设置为 https://x.com/nextjs
。
值得注意的是:如果你需要在实际值中使用带
$
的变量,需要使用转义字符,例如\$
。
将环境变量打包到浏览器中
非 NEXT_PUBLIC_
环境变量只在 Node.js 环境中可用,这意味着浏览器无法访问它们(因为客户端在不同的环境中运行)。
为了使环境变量的值在浏览器中可访问,Next.js 可以在构建时将值"内联"到传递给客户端的 js 包中,用硬编码值替换所有对 process.env.[variable]
的引用。要实现这一点,你只需要在变量前加上 NEXT_PUBLIC_
前缀。例如:
这将告诉 Next.js 用你运行 next build
时环境中的值替换 Node.js 环境中所有对 process.env.NEXT_PUBLIC_ANALYTICS_ID
的引用,允许你在代码的任何地方使用它。它将被内联到发送到浏览器的任何 JavaScript 中。
注意:构建后,你的应用将不再响应这些环境变量的更改。例如,如果你使用 Heroku 管道将在一个环境中构建的 slug 提升到另一个环境,或者如果你构建并将单个 Docker 镜像部署到多个环境,所有
NEXT_PUBLIC_
变量都将被冻结为构建时评估的值,因此这些值需要在项目构建时适当设置。如果你需要访问运行时环境值,你需要设置自己的 API 来向客户端提供它们(可以按需或在初始化期间)。
注意,动态查找将_不会_被内联,比如:
运行时环境变量
Next.js 可以同时支持构建时和运行时环境变量。
默认情况下,环境变量只在服务器端可用。要将环境变量暴露给浏览器,必须以 NEXT_PUBLIC_
为前缀。但是,这些公共环境变量将在 next build
期间被内联到 JavaScript 包中。
要读取运行时环境变量,我们建议使用 getServerSideProps
或逐步采用 App Router。
这允许你使用单个 Docker 镜像,可以在具有不同值的多个环境中使用。
值得注意的是:
- 你可以使用
register
函数 在服务器启动时运行代码。 - 我们不推荐使用 runtimeConfig 选项,因为它不适用于独立输出模式。相反,我们建议逐步采用 App Router。
默认环境变量
通常,只需要 .env*
文件。但是,有时你可能想为 development
(next dev
)或 production
(next start
)环境添加一些默认值。
Next.js 允许你在 .env
(所有环境)、.env.development
(开发环境)和 .env.production
(生产环境)中设置默认值。
值得注意的是:
.env
、.env.development
和.env.production
文件应该包含在你的代码库中,因为它们定义了默认值。所有.env
文件默认都在.gitignore
中被排除,允许你选择将这些值提交到代码库中。
Vercel 上的环境变量
在将 Next.js 应用程序部署到 Vercel 时,可以在项目设置中配置环境变量。
所有类型的环境变量都应该在那里配置。即使是在开发中使用的环境变量也是如此——这些变量随后可以下载到本地设备。
如果你已经配置了开发环境变量,你可以使用以下命令将它们拉取到 .env.local
中以在本地机器上使用:
值得注意的是:当将 Next.js 应用程序部署到 Vercel 时,
.env*
文件中的环境变量将不会对 Edge Runtime 可用,除非它们的名称以NEXT_PUBLIC_
为前缀。我们强烈建议在项目设置中管理环境变量,在那里所有环境变量都是可用的。
测试环境变量
除了 development
和 production
环境外,还有第三个选项:test
。与设置开发或生产环境的默认值的方式相同,你也可以通过 .env.test
文件为 testing
环境设置默认值(尽管这种情况不如前两种常见)。Next.js 在 testing
环境中不会从 .env.development
或 .env.production
加载环境变量。
在使用 jest
或 cypress
等工具运行测试时,这个选项很有用,因为你需要仅为测试目的设置特定的环境变量。如果 NODE_ENV
设置为 test
,测试默认值将被加载,尽管你通常不需要手动执行此操作,因为测试工具会为你处理。
test
环境与 development
和 production
环境之间有一个小区别需要注意:.env.local
不会被加载,因为你希望测试对每个人产生相同的结果。这样,通过忽略你的 .env.local
(它旨在覆盖默认设置),每次测试执行都将在不同的执行之间使用相同的环境默认值。
值得注意的是:与默认环境变量类似,
.env.test
文件应该包含在你的代码库中,但.env.test.local
不应该包含,因为.env*.local
应该通过.gitignore
被忽略。
在运行单元测试时,你可以通过利用 @next/env
包中的 loadEnvConfig
函数,确保以与 Next.js 相同的方式加载环境变量。
环境变量加载顺序
环境变量按以下顺序在以下位置查找,一旦找到变量就停止。
process.env
.env.$(NODE_ENV).local
.env.local
(当NODE_ENV
为test
时不检查).env.$(NODE_ENV)
.env
例如,如果 NODE_ENV
是 development
,并且你在 .env.development.local
和 .env
中都定义了一个变量,那么将使用 .env.development.local
中的值。
值得注意的是:
NODE_ENV
允许的值是production
、development
和test
。
值得注意的事项
- 如果你使用
/src
目录,.env.*
文件应该保留在项目的根目录中。 - 如果环境变量
NODE_ENV
未赋值,Next.js 在运行next dev
命令时会自动分配development
,其他所有命令则分配production
。
版本历史
版本 | 变更 |
---|---|
v9.4.0 | 引入了对 .env 和 NEXT_PUBLIC_ 的支持。 |