Next.js部署到Vercel后环境变量怎么不生效? 东方炳錦 提问于 2026-03-11 14:06:20 阅读 25 框架 我在本地开发时用 .env.local 存放API密钥,一切正常。但推到Vercel后,页面里读不到这些变量,控制台全是undefined。明明在Vercel项目设置里也加了同样的环境变量,命名完全一致,为啥还是不行? 我试过把变量名改成 NEXT_PUBLIC_ 开头,但有些敏感密钥不能暴露给前端啊,难道非得全加前缀? React框架Vercel部署 我来解答 赞 3 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 W″羽墨 Lv1 遇到这种情况确实挺让人头疼的。首先,Next.js 的环境变量处理机制在不同环境下是有区别的,特别是在本地开发和部署到 Vercel 这两种情况下。 具体来说,Next.js 区分了客户端和服务器端的环境变量。如果你想要在服务器端使用的变量(比如 API 密钥),就不能加 NEXT_PUBLIC_ 前缀,因为加了这个前缀的变量会被暴露到客户端,这显然不适合存放敏感信息。 你提到已经在 Vercel 项目设置里添加了环境变量,并且命名是一致的,但仍然读不到。这里有几个可能的原因和解决办法: 1. 检查环境变量的大小写:Next.js 和 Vercel 对环境变量的名字是区分大小写的,确保你在代码中引用的变量名和在 Vercel 设置中的名字完全一致。 2. 重新部署项目:有时候 Vercel 并不会立即应用新的环境变量,尝试重新部署你的项目,看看是否能解决问题。 3. 确保在正确的阶段使用变量:在 Next.js 中,某些钩子或者生命周期方法是在构建时运行的,而某些是在运行时。如果你的代码在构建时就试图读取环境变量,而这些变量是在运行时才有的,就会出问题。确保你在运行时读取这些变量。 4. 检查 Next.js 配置:虽然你提到的是 Vercel 的设置,但有时候项目的 next.config.js 文件也可能影响环境变量的行为。确保这里没有覆盖或者错误地配置了环境变量。 5. 调试输出:在代码中加入一些调试信息,输出一下环境变量,看看到底有没有获取到正确的值。这样可以确定问题是出在哪里。 下面是一个简单的例子,展示如何在 Next.js 中正确使用环境变量: // next.config.js module.exports = { // 其他配置... env: { // 如果你需要在构建时注入环境变量,可以在这里定义 // 注意:这里的变量会暴露在客户端,谨慎使用 }, }; // pages/api/example.js export default function handler(req, res) { // 这里是运行时,可以直接读取环境变量 const apiKey = process.env.YOUR_API_KEY; if (!apiKey) { console.error('API key is not defined'); return res.status(500).json({ error: 'API key is missing' }); } // 使用 apiKey 进行后续操作... } // pages/index.js import { useEffect } from 'react'; export default function Home() { useEffect(() => { // 在客户端,只能读取以 NEXT_PUBLIC_ 开头的环境变量 // 如果你需要在这里使用敏感信息,考虑通过 API 请求从服务器端获取 }, []); return Welcome to Next.js!; } 总结一下,确保环境变量的命名一致、重新部署项目、检查变量的使用时机,这些都是解决这个问题的关键步骤。希望这些建议对你有帮助。 回复 点赞 2026-03-22 21:28 迷人的玉研 Lv1 这问题很常见,本质上是 Next.js 环境变量的作用域问题。 服务端变量和客户端变量是两码事。你在 Vercel 后台加的变量是生效的,但只有加 NEXT_PUBLIC_ 前缀的才会暴露给前端。 简单说: 如果你的变量用在客户端组件里,必须加 NEXT_PUBLIC_ 前缀,没得商量。敏感密钥不能放前端,这是铁律。 如果你的变量只用在后端(比如 API routes、getServerSideProps、getStaticProps 里的服务端代码),直接用 process.env.变量名,不需要前缀,Vercel 后台加的变量直接就能读到。 所以正确的做法是:敏感密钥不要在客户端代码里直接用,通过 API route 代理一下,在服务端请求第三方接口。 还有个坑:你在 Vercel 加完环境变量后,需要重新部署一次才生效,不是自动生效的。 改一下就行:敏感逻辑搬到 API routes 或者 getServerSideProps 里处理,客户端只管调接口。 回复 点赞 1 2026-03-11 14:08 加载更多 相关推荐 2 回答 47 浏览 Next.js部署到Vercel后环境变量怎么不生效? 我在本地开发时用 process.env.NEXT_PUBLIC_API_URL 能正常读取环境变量,但部署到Vercel后就变成 undefined 了,明明在 Vercel 项目设置里加了同名的环... ___东焕 框架 2026-02-23 17:55:18 1 回答 5 浏览 Next.js 部署到 Vercel 后 CSS 样式丢失是怎么回事? 我在本地开发时样式完全正常,但一部署到 Vercel 上,某些页面的 CSS 就不生效了,特别是全局样式里的自定义类。我试过把 CSS 放在 globals.css 里引入,也检查了 _app.js ... 书生シ伊芃 框架 2026-03-22 22:06:22 1 回答 38 浏览 Next.js中间件里怎么获取请求的URL路径? 我在写Next.js的middleware时,想根据用户访问的路径做不同处理,但不知道怎么拿到当前请求的URL。试了req.url但好像不是标准格式,还带上了查询参数,搞得判断很麻烦。 比如我想拦截所... W″淑萍 框架 2026-03-01 09:38:20 2 回答 55 浏览 Next.js中间件里怎么获取请求的URL路径? 我在写Next.js的middleware时,想根据用户访问的路径做不同处理,但不知道怎么拿到当前请求的URL路径。试了request.url,结果是个完整URL,还要自己解析,有没有更直接的方法? ... 夏侯树辰 框架 2026-02-28 23:45:22 2 回答 39 浏览 Next.js中怎么全局捕获API调用错误?ErrorBoundary没生效 我在Next.js 13项目里用getServerSideProps调API,但遇到接口报错时页面直接白屏了。按照文档写了组件包裹的ErrorBoundary,但错误信息没被捕获到,控制台只看到"Er... 书生シ银银 框架 2026-02-13 12:33:23 1 回答 21 浏览 Next.js 国际化路由跳转后语言没更新怎么办? 我在用 Next.js 的 App Router 做多语言网站,按照官方文档配置了 i18n,切换语言时用 router.push('/en/about') 跳转,页面 URL 变了但内容还是原来语言... 欧阳艳兵 框架 2026-03-21 10:55:20 1 回答 20 浏览 Next.js里怎么动态设置页面的metadata? 我在用Next.js 13+的App Router,想根据接口返回的数据动态设置页面标题和描述,但试了直接在组件里调用函数好像不行。文档说要用generateMetadata,但我这样写报错了: ex... 开发者翌萌 框架 2026-03-19 10:04:20 1 回答 18 浏览 Next.js 的 Image 组件怎么设置固定宽高比? 我在用 Next.js 的 Image 组件,想让图片保持 16:9 的宽高比,但设置了 width 和 height 后,图片在不同屏幕下变形了。我试过用 CSS 控制,但好像没生效。 这是我的 C... 上官宝娥 框架 2026-03-10 16:42:22 1 回答 28 浏览 Next.js中getServerSideProps里怎么获取请求头信息? 我在用Next.js做SSR页面,想在getServerSideProps里读取自定义的请求头,比如X-Custom-Header,但不知道怎么拿到req对象。文档里好像提到了context参数,但我... Mr-秀云 框架 2026-03-10 10:46:18 1 回答 19 浏览 Next.js 静态生成时怎么处理动态路由的数据获取? 我在用 Next.js 做一个博客,文章页是动态路由 /posts/[id].js,想用 SSG 静态生成,但不知道怎么在 getStaticProps 里拿到具体的 id。文档说要配合 getSta... 奕冉~ 框架 2026-03-04 23:54:23
具体来说,Next.js 区分了客户端和服务器端的环境变量。如果你想要在服务器端使用的变量(比如 API 密钥),就不能加
NEXT_PUBLIC_前缀,因为加了这个前缀的变量会被暴露到客户端,这显然不适合存放敏感信息。你提到已经在 Vercel 项目设置里添加了环境变量,并且命名是一致的,但仍然读不到。这里有几个可能的原因和解决办法:
1. 检查环境变量的大小写:Next.js 和 Vercel 对环境变量的名字是区分大小写的,确保你在代码中引用的变量名和在 Vercel 设置中的名字完全一致。
2. 重新部署项目:有时候 Vercel 并不会立即应用新的环境变量,尝试重新部署你的项目,看看是否能解决问题。
3. 确保在正确的阶段使用变量:在 Next.js 中,某些钩子或者生命周期方法是在构建时运行的,而某些是在运行时。如果你的代码在构建时就试图读取环境变量,而这些变量是在运行时才有的,就会出问题。确保你在运行时读取这些变量。
4. 检查 Next.js 配置:虽然你提到的是 Vercel 的设置,但有时候项目的
next.config.js文件也可能影响环境变量的行为。确保这里没有覆盖或者错误地配置了环境变量。5. 调试输出:在代码中加入一些调试信息,输出一下环境变量,看看到底有没有获取到正确的值。这样可以确定问题是出在哪里。
下面是一个简单的例子,展示如何在 Next.js 中正确使用环境变量:
总结一下,确保环境变量的命名一致、重新部署项目、检查变量的使用时机,这些都是解决这个问题的关键步骤。希望这些建议对你有帮助。
服务端变量和客户端变量是两码事。你在 Vercel 后台加的变量是生效的,但只有加 NEXT_PUBLIC_ 前缀的才会暴露给前端。
简单说:
如果你的变量用在客户端组件里,必须加 NEXT_PUBLIC_ 前缀,没得商量。敏感密钥不能放前端,这是铁律。
如果你的变量只用在后端(比如 API routes、getServerSideProps、getStaticProps 里的服务端代码),直接用 process.env.变量名,不需要前缀,Vercel 后台加的变量直接就能读到。
所以正确的做法是:敏感密钥不要在客户端代码里直接用,通过 API route 代理一下,在服务端请求第三方接口。
还有个坑:你在 Vercel 加完环境变量后,需要重新部署一次才生效,不是自动生效的。
改一下就行:敏感逻辑搬到 API routes 或者 getServerSideProps 里处理,客户端只管调接口。