跳至内容

环境变量

示例

Next.js 内置支持环境变量,允许您执行以下操作

加载环境变量

Next.js 内置支持从 .env* 文件加载环境变量到 process.env 中。

.env
DB_HOST=localhost
DB_USER=myuser
DB_PASS=mypassword

注意:Next.js 还支持 .env* 文件中的多行变量

# .env
 
# you can write with line breaks
PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----
...
Kh9NV...
...
-----END DSA PRIVATE KEY-----"
 
# or with `\n` inside double quotes
PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nKh9NV...\n-----END DSA PRIVATE KEY-----\n"

注意:如果您使用的是 /src 文件夹,请注意 Next.js 将**仅**从父文件夹加载 .env 文件,**不会**从 /src 文件夹加载。这会将 process.env.DB_HOSTprocess.env.DB_USERprocess.env.DB_PASS 自动加载到 Node.js 环境中,允许您在路由处理器中使用它们。

例如

app/api/route.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/env 加载环境变量

如果您需要在 Next.js 运行时之外加载环境变量,例如在 ORM 或测试运行程序的根配置文件中,可以使用 @next/env 包。

Next.js 内部使用此包从 .env* 文件加载环境变量。

要使用它,请安装该包并使用 loadEnvConfig 函数加载环境变量

npm install @next/env
envConfig.ts
import { loadEnvConfig } from '@next/env'
 
const projectDir = process.cwd()
loadEnvConfig(projectDir)

然后,您可以在需要的地方导入配置。例如

orm.config.ts
import './envConfig.ts'
 
export default defineConfig({
  dbCredentials: {
    connectionString: process.env.DATABASE_URL!,
  },
})

引用其他变量

Next.js 会自动扩展使用 $ 引用其他变量(例如 .env* 文件中的 $VARIABLE)的变量。这允许您引用其他机密信息。例如

.env
TWITTER_USER=nextjs
TWITTER_URL=https://x.com/$TWITTER_USER

在上面的示例中,process.env.TWITTER_URL 将被设置为 https://x.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 Pipeline 将在一个环境中构建的代码段提升到另一个环境,或者将单个 Docker 镜像构建并部署到多个环境,所有 NEXT_PUBLIC_ 变量都将被冻结,其值为构建时计算的值,因此在构建项目时需要适当地设置这些值。如果您需要访问运行时环境值,则必须设置自己的 API 来将其提供给客户端(按需或在初始化期间)。

pages/index.js
import setupAnalyticsService from '../lib/my-analytics-service'
 
// 'NEXT_PUBLIC_ANALYTICS_ID' can be used here as it's prefixed by 'NEXT_PUBLIC_'.
// It will be transformed at build time to `setupAnalyticsService('abcdefghijk')`.
setupAnalyticsService(process.env.NEXT_PUBLIC_ANALYTICS_ID)
 
function HomePage() {
  return <h1>Hello World</h1>
}
 
export default HomePage

请注意,动态查找将不会内联,例如

// This will NOT be inlined, because it uses a variable
const varName = 'NEXT_PUBLIC_ANALYTICS_ID'
setupAnalyticsService(process.env[varName])
 
// This will NOT be inlined, because it uses a variable
const env = process.env
setupAnalyticsService(env.NEXT_PUBLIC_ANALYTICS_ID)

运行时环境变量

Next.js 可以支持构建时和运行时环境变量。

默认情况下,环境变量仅在服务器端可用。要将环境变量公开给浏览器,必须以 NEXT_PUBLIC_ 为前缀。但是,这些公共环境变量将在 next build 期间内联到 JavaScript 包中。

您可以在动态渲染期间安全地读取服务器上的环境变量

app/page.ts
import { connection } from 'next/server'
 
export default async function Component() {
  await connection()
  // cookies, headers, and other Dynamic APIs
  // will also opt into dynamic rendering, meaning
  // this env variable is evaluated at runtime
  const value = process.env.MY_VALUE
  // ...
}

这允许您使用单个 Docker 镜像,该镜像可以通过多个具有不同值的的环境进行提升。

了解一下

  • 您可以使用 register 函数 在服务器启动时运行代码。
  • 我们不建议使用 runtimeConfig 选项,因为此选项不适用于独立输出模式。相反,我们建议 逐步采用 App Router。

默认环境变量

通常,只需要 .env* 文件。但是,有时您可能希望为 developmentnext dev)或 productionnext start)环境添加一些默认值。

Next.js 允许您在 .env(所有环境)、.env.development(开发环境)和 .env.production(生产环境)中设置默认值。

了解一下.env.env.development.env.production 文件应包含在您的仓库中,因为它们定义了默认值。所有 .env 文件默认情况下都包含在 .gitignore 中,允许您选择将这些值提交到您的仓库。

Vercel 上的环境变量

将您的 Next.js 应用程序部署到 Vercel 时,可以在 项目设置 中配置环境变量。

所有类型的环境变量都应在此处配置。即使是在开发中使用的环境变量——也可以 下载到您的本地设备

如果您已配置 开发环境变量,您可以使用以下命令将其拉取到 .env.local 以在本地机器上使用

终端
vercel env pull

了解一下:将您的 Next.js 应用程序部署到 Vercel 时,.env* 文件中的环境变量将不会提供给 Edge Runtime,除非其名称以 NEXT_PUBLIC_ 为前缀。我们强烈建议您在 项目设置 中管理您的环境变量,所有环境变量都可以在此处使用。

测试环境变量

除了 developmentproduction 环境之外,还可以使用第三个选项:test。与您可以为开发或生产环境设置默认值的方式相同,您也可以使用 .env.test 文件为 testing 环境执行相同的操作(尽管此文件不如前两个常用)。Next.js 不会在 testing 环境中加载 .env.development.env.production 中的环境变量。

当使用 jestcypress 等工具运行测试时,此功能很有用,在这些测试中,您需要仅为测试目的设置特定的环境变量。如果 NODE_ENV 设置为 test,则将加载测试默认值,尽管您通常不需要手动执行此操作,因为测试工具将为您解决此问题。

您需要注意 test 环境与 developmentproduction 之间的一个小区别:.env.local 不会加载,因为您希望测试对每个人都产生相同的结果。这样,每次测试执行都将忽略您的 .env.local(旨在覆盖设置的默认值)并在不同的执行中使用相同的 env 默认值。

了解一下:与默认环境变量类似,.env.test 文件应包含在您的仓库中,但 .env.test.local 不应包含,因为 .env*.local 旨在通过 .gitignore 忽略。

在运行单元测试时,您可以通过利用 @next/env 包中的 loadEnvConfig 函数来确保以与 Next.js 相同的方式加载环境变量。

// The below can be used in a Jest global setup file or similar for your testing set-up
import { loadEnvConfig } from '@next/env'
 
export default async () => {
  const projectDir = process.cwd()
  loadEnvConfig(projectDir)
}

环境变量加载顺序

环境变量按以下位置顺序查找,一旦找到变量,查找过程就会停止。

  1. process.env
  2. .env.$(NODE_ENV).local
  3. .env.local(当 NODE_ENVtest 时不检查。)
  4. .env.$(NODE_ENV)
  5. .env

例如,如果 NODE_ENVdevelopment,并且您在 .env.development.local.env 中都定义了一个变量,则将使用 .env.development.local 中的值。

了解一下NODE_ENV 的允许值为 productiondevelopmenttest

了解一下

  • 如果您使用 /src 目录.env.* 文件应保留在项目的根目录中。
  • 如果环境变量 NODE_ENV 未分配,则 Next.js 在运行 next dev 命令时自动分配 development,或在所有其他命令中分配 production

版本历史

版本更改
v9.4.0支持引入 .envNEXT_PUBLIC_