Next.js chia biến môi trường làm hai nhóm rất rõ:
- Không có tiền tố (
DATABASE_URL,STRIPE_SECRET_KEY): chỉ tồn tại ở phía server — Server Component, Route Handler, Server Action. Đọc ở client sẽ raundefined. - Có
NEXT_PUBLIC_(NEXT_PUBLIC_GA_ID): được thay thế thẳng vào mã nguồn lúc build và đi vào bundle JavaScript gửi cho trình duyệt.
ts
// Server Component - fine
const db = process.env.DATABASE_URL
// Client Component - inlined into the JS bundle at build time
const gaId = process.env.NEXT_PUBLIC_GA_IDRủi ro: ai đó thấy client đọc undefined rồi "sửa" bằng cách đổi tên thành NEXT_PUBLIC_STRIPE_SECRET_KEY. Lúc đó khoá bí mật nằm nguyên trong file JS công khai, mở DevTools là đọc được.
Hai điểm hay bị hỏi thêm: giá trị NEXT_PUBLIC_ bị đóng băng lúc build, đổi biến trên dashboard mà không build lại thì không có tác dụng; và vì nó nằm trong bundle nên đây là nơi chỉ để những giá trị vốn đã công khai (ID analytics, publishable key, base URL).