目录
[🧠 1️⃣ 核心规则(一句话)](#🧠 1️⃣ 核心规则(一句话))
[🌐 2️⃣ NEXT_PUBLIC_ 的作用](#🌐 2️⃣ NEXT_PUBLIC_ 的作用)
[✔️ 可以在前端使用](#✔️ 可以在前端使用)
[⚠️ 注意:](#⚠️ 注意:)
[🔒 3️⃣ 不带 NEXT_PUBLIC_ 的变量(服务端专用)](#🔒 3️⃣ 不带 NEXT_PUBLIC_ 的变量(服务端专用))
[✔️ 只能在:](#✔️ 只能在:)
[❌ 前端不能用:](#❌ 前端不能用:)
[🚨 4️⃣ Next.js 的安全设计本质](#🚨 4️⃣ Next.js 的安全设计本质)
[📦 5️⃣ 实际运行机制(很重要)](#📦 5️⃣ 实际运行机制(很重要))
[✔️ 服务端阶段](#✔️ 服务端阶段)
[✔️ 构建阶段](#✔️ 构建阶段)
[⚠️ 6️⃣ 常见误区(非常重要)](#⚠️ 6️⃣ 常见误区(非常重要))
[❌ 误区1:以为 NEXT_PUBLIC 是加密的](#❌ 误区1:以为 NEXT_PUBLIC 是加密的)
[❌ 误区2:把敏感信息写 NEXT_PUBLIC](#❌ 误区2:把敏感信息写 NEXT_PUBLIC)
[❌ 误区3:以为服务端变量前端"读不到但安全"](#❌ 误区3:以为服务端变量前端“读不到但安全”)
[🧪 7️⃣ 推荐使用方式(实战)](#🧪 7️⃣ 推荐使用方式(实战))
[🔵 前端变量(必须 NEXT_PUBLIC)](#🔵 前端变量(必须 NEXT_PUBLIC))
[🔴 服务端变量(绝不能暴露)](#🔴 服务端变量(绝不能暴露))
[🚀 8️⃣ Web3 项目特别提醒(重点)](#🚀 8️⃣ Web3 项目特别提醒(重点))
[❌ 不要这样:](#❌ 不要这样:)
[✔️ 应该这样:](#✔️ 应该这样:)
[🧠 9️⃣ 一句话总结](#🧠 9️⃣ 一句话总结)
在 Next.js 里,环境变量是否带 NEXT_PUBLIC_,本质区别只有一个核心点:
👉 是否会暴露到浏览器端(客户端)
🧠 1️⃣ 核心规则(一句话)
| 前缀 | 运行位置 | 是否暴露给前端 |
|---|---|---|
NEXT_PUBLIC_ |
浏览器 + 服务端 | ✅ 会暴露 |
| 无前缀 | 仅服务端 | ❌ 不会暴露 |
🌐 2️⃣ NEXT_PUBLIC_ 的作用
NEXT_PUBLIC_API_URL=https://api.example.com
✔️ 可以在前端使用
console.log(process.env.NEXT_PUBLIC_API_URL)
👉 浏览器 JS 里也能看到
⚠️ 注意:
❗ 任何
NEXT_PUBLIC_都等于"公开变量"
比如:
-
API base URL
-
feature flag
-
公共配置
🔒 3️⃣ 不带 NEXT_PUBLIC_ 的变量(服务端专用)
DATABASE_URL=postgres://...
JWT_SECRET=xxxx
PRIVATE_KEY=xxxx
✔️ 只能在:
-
Server Components
-
Route Handlers(app/api)
-
getServerSideProps(旧模式)
console.log(process.env.DATABASE_URL)
❌ 前端不能用:
console.log(process.env.DATABASE_URL) // undefined
🚨 4️⃣ Next.js 的安全设计本质
Next.js 默认策略是:
👉 "所有变量默认私有,必须显式声明才暴露"
📦 5️⃣ 实际运行机制(很重要)
✔️ 服务端阶段
Node.js 读取 .env
✔️ 构建阶段
NEXT_PUBLIC_* 被"注入"进前端 bundle
👉 变成静态 JS 常量
⚠️ 6️⃣ 常见误区(非常重要)
❌ 误区1:以为 NEXT_PUBLIC 是加密的
不是。
它只是"允许前端访问",不是保护机制
❌ 误区2:把敏感信息写 NEXT_PUBLIC
比如:
NEXT_PUBLIC_JWT_SECRET=xxx ❌
NEXT_PUBLIC_PRIVATE_KEY=xxx ❌
👉 这等于直接公开给所有用户
❌ 误区3:以为服务端变量前端"读不到但安全"
错。
只要你不写 NEXT_PUBLIC,它才不会进 bundle
🧪 7️⃣ 推荐使用方式(实战)
🔵 前端变量(必须 NEXT_PUBLIC)
NEXT_PUBLIC_APP_ENV=production
NEXT_PUBLIC_API_URL=https://api.xxx.com
NEXT_PUBLIC_WALLETCONNECT_ID=xxx
🔴 服务端变量(绝不能暴露)
DATABASE_URL
JWT_SECRET
PRIVY_SECRET_KEY
PRIVATE_RPC_URL
🚀 8️⃣ Web3 项目特别提醒(重点)
如果你做:
-
Wallet 登录
-
Privy
-
RPC
-
API key
❌ 不要这样:
NEXT_PUBLIC_PRIVY_SECRET ❌
✔️ 应该这样:
PRIVY_SECRET_KEY ✔️ (server only)
🧠 9️⃣ 一句话总结
NEXT_PUBLIC_= "允许浏览器看到"不带前缀 = "只能后端用,浏览器永远看不到"