环境变量
示例
Next.js 内置了对环境变量的支持,允许您实现以下功能:
加载环境变量
Next.js 内置了从 .env.local 加载环境变量到 process.env 的功能。
DB_HOST=localhost
DB_USER=myuser
DB_PASS=mypassword注意:Next.js 还支持在
.env*文件中使用多行变量:# .env.local # 可以换行书写 PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY----- ... Kh9NV... ... -----END DSA PRIVATE KEY-----" # 或在双引号内使用 `\n` PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nKh9NV...\n-----END DSA PRIVATE KEY-----\n"
注意:如果您使用
/src文件夹,请注意 Next.js 只会从父文件夹加载 .env 文件,而不会从/src文件夹加载。 这会自动将process.env.DB_HOST、process.env.DB_USER和process.env.DB_PASS加载到 Node.js 环境中,您可以在 路由处理器 中使用它们。
例如:
export async function GET() {
const db = await myDB.connect({
host: process.env.DB_HOST,
username: process.env.DB_USER,
password: process.env.DB_PASS,
})
// ...
}引用其他变量
Next.js 会自动扩展在 .env* 文件中使用 $ 引用其他变量的变量,例如 $VARIABLE。这允许您引用其他密钥。例如:
TWITTER_USER=nextjs
TWITTER_URL=https://twitter.com/$TWITTER_USER在上面的例子中,process.env.TWITTER_URL 将被设置为 https://twitter.com/nextjs。
须知:如果需要在值中使用
$,必须进行转义,例如\$。
为浏览器打包环境变量
非 NEXT_PUBLIC_ 前缀的环境变量仅在 Node.js 环境中可用,这意味着它们无法在浏览器中访问(客户端运行在不同的 环境 中)。
为了使环境变量的值在浏览器中可访问,Next.js 可以在构建时将值 "内联" 到交付给客户端的 js 包中,将所有对 process.env.[variable] 的引用替换为硬编码的值。要实现这一点,只需在变量前添加 NEXT_PUBLIC_ 前缀。例如:
NEXT_PUBLIC_ANALYTICS_ID=abcdefghijk这将告诉 Next.js 在 Node.js 环境中将所有对 process.env.NEXT_PUBLIC_ANALYTICS_ID 的引用替换为运行 next build 时的环境值,允许您在代码中的任何位置使用它。它将被内联到发送给浏览器的任何 JavaScript 中。
注意:构建完成后,您的应用将不再响应这些环境变量的更改。例如,如果您使用 Heroku 管道将在一个环境中构建的 slug 提升到另一个环境,或者如果您构建并部署单个 Docker 镜像到多个环境,所有
NEXT_PUBLIC_变量将被冻结为构建时评估的值,因此这些值需要在项目构建时适当设置。如果需要访问运行时环境值,您必须设置自己的 API 来提供给客户端(按需或在初始化期间)。
import setupAnalyticsService from '../lib/my-analytics-service'
// 这里可以使用 'NEXT_PUBLIC_ANALYTICS_ID',因为它以 'NEXT_PUBLIC_' 为前缀。
// 它将在构建时转换为 `setupAnalyticsService('abcdefghijk')`。
setupAnalyticsService(process.env.NEXT_PUBLIC_ANALYTICS_ID)
function HomePage() {
return <h1>Hello World</h1>
}
export default HomePage请注意,动态查找 不会 被内联,例如:
// 这不会被内联,因为它使用了变量
const varName = 'NEXT_PUBLIC_ANALYTICS_ID'
setupAnalyticsService(process.env[varName])
// 这不会被内联,因为它使用了变量
const env = process.env
setupAnalyticsService(env.NEXT_PUBLIC_ANALYTICS_ID)运行时环境变量
Next.js 可以同时支持构建时和运行时环境变量。
默认情况下,环境变量仅在服务器端可用。要将环境变量暴露给浏览器,必须添加 NEXT_PUBLIC_ 前缀。然而,这些公共环境变量将在 next build 期间被内联到 JavaScript 包中。
要读取运行时环境变量,我们建议使用 getServerSideProps 或 逐步采用应用路由。通过应用路由,我们可以在动态渲染期间安全地在服务器上读取环境变量。这允许您使用一个单一的 Docker 镜像,可以在多个环境中推广使用不同的值。
import { unstable_noStore as noStore } from 'next/cache'
export default function Component() {
noStore()
// cookies()、headers() 和其他动态函数
// 也会选择动态渲染,意味着
// 这个环境变量在运行时评估
const value = process.env.MY_VALUE
// ...
}须知:
- 您可以使用
register函数 在服务器启动时运行代码。 - 我们不建议使用 runtimeConfig 选项,因为它不适用于独立输出模式。相反,我们建议 逐步采用 应用路由。
默认环境变量
通常只需要一个 .env.local 文件。但有时您可能希望为 development (next dev) 或 production (next start) 环境添加一些默认值。
Next.js 允许您在 .env(所有环境)、.env.development(开发环境)和 .env.production(生产环境)中设置默认值。
.env.local 始终会覆盖设置的默认值。
须知:
.env、.env.development和.env.production文件应包含在您的仓库中,因为它们定义了默认值。.env*.local应添加到.gitignore,因为这些文件旨在被忽略。.env.local是存储密钥的地方。
Vercel 上的环境变量
将 Next.js 应用部署到 Vercel 时,可以在 项目设置 中配置环境变量。
所有类型的环境变量都应在此配置。甚至包括开发中使用的环境变量——可以 下载到本地设备 后使用。
如果您配置了 开发环境变量,可以使用以下命令将它们拉取到 .env.local 中以便在本地机器上使用:
vercel env pull .env.local须知:将 Next.js 应用部署到 Vercel 时,
.env*文件中的环境变量不会提供给 Edge 运行时,除非它们的名称以NEXT_PUBLIC_为前缀。我们强烈建议在 项目设置 中管理环境变量,所有环境变量都可以从这里获取。
测试环境变量
除了 development 和 production 环境外,还有第三个选项:test。与为开发或生产环境设置默认值的方式相同,您可以为 testing 环境在 .env.test 文件中设置默认值(尽管这个不如前两个常见)。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 相同的方式加载环境变量。
// 以下代码可以在 Jest 全局设置文件或类似的测试设置中使用
import { loadEnvConfig } from '@next/env'
export default async () => {
const projectDir = process.cwd()
loadEnvConfig(projectDir)
}环境变量加载顺序
环境变量按以下顺序查找,一旦找到变量即停止。
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_。 |