如何在 Next.js 中使用环境变量
Next.js 内置了对环境变量的支持,允许你执行以下操作:
警告: 默认的
create-next-app
模板确保所有.env
文件都添加到你的.gitignore
中。你几乎从不希望将这些文件提交到你的仓库。
加载环境变量
Next.js 内置支持从 .env*
文件加载环境变量到 process.env
。
DB_HOST=localhost
DB_USER=myuser
DB_PASS=mypassword
注意: Next.js 还支持在你的
.env*
文件中的多行变量:# .env
# 你可以用换行符编写
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/env
加载环境变量
如果你需要在 Next.js 运行时之外加载环境变量,例如在 ORM 或测试运行器的根配置文件中,你可以使用 @next/env
包。
这个包被 Next.js 内部用来从 .env*
文件加载环境变量。
要使用它,安装包并使用 loadEnvConfig
函数来加载环境变量:
npm install @next/env
- TypeScript
- JavaScript
import { loadEnvConfig } from '@next/env'
const projectDir = process.cwd()
loadEnvConfig(projectDir)
import { loadEnvConfig } from '@next/env'
const projectDir = process.cwd()
loadEnvConfig(projectDir)
然后,你可以在需要的地方导入配置。例如:
- TypeScript
- JavaScript
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 用运行 next build
的环境中的值替换 Node.js 环境中对 process.env.NEXT_PUBLIC_ANALYTICS_ID
的所有引用,允许你在代码中的任何地方使用它。它将被内联到发送给浏览器的任何 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)