Next.js 内置了对环境变量的支持,允许您执行以下操作:
警告: 默认的
create-next-app模板确保所有.env文件都已添加到您的.gitignore中。您几乎不应该将这些文件提交到您的仓库。
Next.js 内置支持从 .env* 文件将环境变量加载到 process.env 中。
DB_HOST=localhost
DB_USER=myuser
DB_PASS=mypassword这会自动将 process.env.DB_HOST、process.env.DB_USER 和 process.env.DB_PASS 加载到 Node.js 环境中,使您可以在 Next.js 数据获取方法和 API 路由中使用它们。
例如,使用 getStaticProps:
export async function getStaticProps() {
const db = await myDB.connect({
host: process.env.DB_HOST,
username: process.env.DB_USER,
password: process.env.DB_PASS,
})
// ...
}注意:Next.js 也支持在
.env*文件中使用多行变量:bash# .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/envimport { loadEnvConfig } from '@next/env'
const projectDir = process.cwd()
loadEnvConfig(projectDir)import { loadEnvConfig } from '@next/env'
const projectDir = process.cwd()
loadEnvConfig(projectDir)然后,您可以在需要的地方导入配置。例如:
import './envConfig.ts'
export default defineConfig({
dbCredentials: {
connectionString: process.env.DATABASE_URL!,
},
})import './envConfig.js'
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 环境中,用您运行 next build 时所处环境中的值替换所有对 process.env.NEXT_PUBLIC_ANALYTICS_ID 的引用,从而允许您在代码的任何地方使用它。它将被内联到发送到浏览器的任何 JavaScript 中。
注意:构建后,您的应用程序将不再响应这些环境变量的更改。例如,如果您使用 Heroku 管道将在一个环境中构建的 slug 推广到另一个环境,或者如果您构建单个 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 包中。
要读取运行时环境变量,我们建议使用 getServerSideProps 或逐步采用 App Router。
您可以在动态渲染期间安全地在服务器上读取环境变量:
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
// ...
}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 函数在服务器启动时运行代码。除了 development 和 production 环境之外,还有一个第三个选项可用:test。您可以通过 .env.test 文件为 testing 环境设置默认值,就像为 development 或 production 环境设置默认值一样(尽管这种方式不如前两种常见)。在 testing 环境中,Next.js 不会从 .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 相同的方式加载环境变量。
// 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_ 的支持。 |