本文档适用于 9.4 和更高版本的 Next.js。如果你使用的是较旧版本的 Next.js,请参阅 next.config.js 中的环境变量。
示例
- 环境变量
Next.js 内置了对环境变量的支持,让你可以执行以下操作:
- 使用
.env.local加载环境变量 - 将环境变量暴露给浏览器
加载环境变量
Next.js 内置支持将环境变量从 .env.local 加载到 process.env 中。
一个 .env.local 文件示例:
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 中:
// pages/index.js
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 将在构建时将
process.env.*替换为相应的值。 这就意味着process.env不是标准的 JavaScript 对象,因此你不能对其 使用 object 解构(destructuring)。 环境变量应当以process.env.NEXT_PUBLIC_PUBLISHABLE_KEY方式使用,而 不能const { NEXT_PUBLIC_PUBLISHABLE_KEY } = process.env。
注意: Next.js 会在 .env* 文件中自动扩展变量(例如 $VAR)。 这允许你访问其它的密钥类信息,如下所示:
# .env
HOSTNAME=localhost
PORT=8080
HOST=http://$HOSTNAME:$PORT
如果你尝试使用实际值中带有 $ 符号的变量,则需要像这样 \$ 对其进行转义。
例如:
# .env
A=abc
# 扩展为 "preabc"
WRONG=pre$A
# 扩展为 "pre$A"
CORRECT=pre\$A
将环境变量暴露给浏览器
默认情况下,所有通过 .env.local 加载的环境变量仅在 Node.js 环境中可用,这意味着它们不会暴露到浏览器端。
为了向浏览器暴露环境变量,你必须在变量前添加 NEXT_PUBLIC_ 前缀。例如:
NEXT_PUBLIC_ANALYTICS_ID=abcdefghijk
这将自动将 process.env.NEXT_PUBLIC_ANALYTICS_ID 加载到 Node.js 环境中,从而允许你在代码的任何地方使用它。带有前缀 NEXT_PUBLIC_ 的变量将被内联到发送给浏览器的 JavaScript 代码中。由于这种内联发生在构建时,因此在构建项目时需要设置好各个 NEXT_PUBLIC_ 前缀的环境变量。
// 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_
setupAnalyticsService(process.env.NEXT_PUBLIC_ANALYTICS_ID)
function HomePage() {
return <h1>Hello World</h1>
}
export default HomePage默认环境变量
通常只需要一个 .env.local 文件就够了。但是,有时你可能希望分别为 development (next dev) 或 production (next start) 环境添加一些默认设置。
Next.js允许你在 .env (所有环境下)、.env.development (development 环境)和 .env.production (production 环境) 中设置默认值。
.env.local 始终覆盖默认设置。
注意: 由于
.env、.env.development和.env.production文件定义了默认设置,因此应该提交到源码仓库中。应当将.env*.local添加到.gitignore中,因为这类文件需要被忽略。.env.local被用来存储密钥类信息。
Vercel上的环境变量
将Next.js应用程序部署到Vercel时,可以在“项目设置”中配置环境变量。
应在此处配置所有类型的环境变量。甚至是开发中使用的环境变量-以后都可以下载到本地设备上。
如果您已经配置了开发环境变量,则可以.env.local使用以下命令将它们放入a以便在本地计算机上使用:
vercel env pull .env.local
使用Vercel CLI进行部署时,请确保添加了一个.vercelignore包含不应上传的文件的文件,通常这些文件与中包含的文件相同.gitignore。
测试环境变量
除了 development 和 production 环境,还有第三个环境: test。与为 development 和 production 环境设置默认值类似,你可以使用 .env.test 为 test 环境设置变量(尽管此文件并不如前两个文件常见)。
当使用 jest 或 cypress 之类的工具运行测试用例时,此功能将非常有用,你只需要为测试目的而设置特定的环境变量即可。如果 NODE_ENV 被设置为 test,则加载相应的默认值,因为测试工具会为你自动加载,因此通常不需要手动执行此操作。
test 环境与 development 和 production 环境之间存在细微的差别:.env.local 不会被加载,因为你的预期是没跟人运行测试用例都会有相同的结果。因此,通过忽略.env.local(旨在覆盖默认设置),每个测试在执行时都将使用相同的默认值。
注意: 与默认环境变量类似,
.env.test文件应提交到源码仓库中,但.env.test.local就不需要了,因为.env*.local是需要通过.gitignore来忽略的文件。
作者:terry,如若转载,请注明出处:https://www.web176.com/nextjs/2469.html
支付宝
微信