环境变量

2026年9月6日

环境变量是运行时才注入的配置:数据库地址、API Key、端口。开发和生产不应写死在同一份源码里。


系统里先看一眼

查:

# macOS / Linux / WSL
echo $PATH

# Windows cmd
echo %PATH%

# PowerShell
dir Env:*
bash

设(仅当前终端):

export XM=123          # Unix
set XM=123             # cmd
$env:XM='123'          # PowerShell
bash

部署脚本、CI 里经常这么临时塞值。


npm scripts 的坑

package.jsonscripts 在 Windows 上默认走 cmd,在 Unix 上走 sh。把 set FOO=bar && next dev 写进 scripts,在 Mac 上会挂。

cross-env 抹平:

{
  "scripts": {
    "dev": "cross-env DB_HOST=localhost next dev",
    "build": "cross-env DB_HOST=8.8.8.8 next build"
  }
}
json

变量一多,命令会变得难看。Next 项目更该用 .env 文件。


Next 的查找顺序

找到第一个就停。NODE_ENV 由框架注入:devdevelopmentbuild / startproduction

  1. 已经在 process.env 里的
  2. .env.$(NODE_ENV).local
  3. .env.localtest 环境不读)
  4. .env.$(NODE_ENV)
  5. .env

常见拆法:

# .env.development.local
DB_HOST=localhost
DB_USER=root

# .env.production.local
DB_HOST=8.8.8.8
DB_USER=app
bash

.local 不进 git。仓库里留 .env.example 列名字即可。

服务端组件里直接 process.env.DB_HOST不要把这类文件标 'use client' 再打印密码。


给浏览器的变量

只有 NEXT_PUBLIC_ 前缀会打进客户端包,构建期替换。密钥、数据库 URL 绝不要加这个前缀。

// 可以出现在浏览器
process.env.NEXT_PUBLIC_SITE_URL

// 只留服务器
process.env.DATABASE_URL
ts

.env 后要重启 next dev。Vercel 一类平台在控制台配同名变量,构建时注入,不必把生产密码放进仓库。

下一篇:按 Accept-Language 做路由前缀国际化。


参考文档