环境变量
示例
Next.js 内置支持环境变量,允许您执行以下操作
加载环境变量
Next.js 内置支持从 .env*
文件加载环境变量到 process.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_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/env
加载环境变量
如果您需要在 Next.js 运行时之外加载环境变量,例如在 ORM 或测试运行程序的根配置文件中,可以使用 @next/env
包。
Next.js 内部使用此包从 .env*
文件加载环境变量。
要使用它,请安装该包并使用 loadEnvConfig
函数加载环境变量
npm install @next/env
import { loadEnvConfig } from '@next/env'
const projectDir = process.cwd()
loadEnvConfig(projectDir)
然后,您可以在需要的地方导入配置。例如
import './envConfig.ts'
export default defineConfig({
dbCredentials: {
connectionString: process.env.DATABASE_URL!,
},
})
引用其他变量
Next.js 会自动扩展使用 $
引用其他变量(例如 .env*
文件中的 $VARIABLE
)的变量。这允许您引用其他机密信息。例如
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 来将其提供给客户端(按需或在初始化期间)。
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 包中。
您可以在动态渲染期间安全地读取服务器上的环境变量
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*
文件。但是,有时您可能希望为 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
以在本地机器上使用
vercel env pull
了解一下:将您的 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 默认值。
了解一下:与默认环境变量类似,
.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)
}
环境变量加载顺序
环境变量按以下位置顺序查找,一旦找到变量,查找过程就会停止。
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_ 。 |
这有帮助吗?