dotenv插件和VSCode均不自动加载.env变量,真正生效需手动调用require('dotenv').config()或通过launch.json/envFile、cross-env等方式注入环境变量。

dotenv 插件本身不自动加载变量,VSCode 也不做任何注入——所有“.env 没生效”的问题,根源都在这里。
VSCode 的 .env 文件只是文本,不是运行时配置
装了 DotENV 插件,.env 文件有了高亮和语法提示,但 process.env.XXX 依然 undefined。这不是插件 bug,而是它只管显示,不管执行。VSCode 作为编辑器,从不读取、解析或注入 .env 到 Node.js 进程里。
真正起作用的只有两件事:
-
require('dotenv').config()是否在 JS 入口文件最顶部被调用 -
launch.json或终端命令是否把变量实际传给了 Node.js 进程
调试时让 launch.json 加载 .env 变量
这是最稳妥、无需改代码的方式,但仅对 VSCode 调试器生效,不影响终端或 npm start。
确保:
-
.env文件放在项目根目录(与package.json同级) -
launch.json中配置envFile字段,路径用${workspaceFolder}表达式 - 不要指望它自动合并
.env.local或.env.development—— 它只读一个文件
示例配置:
{
"type": "node",
"request": "launch",
"name": "Launch with .env",
"program": "${workspaceFolder}/index.js",
"envFile": "${workspaceFolder}/.env"
}
终端里跑 node 命令时,NODE_ENV=xxx 在 Windows 上报错
这是因为 cmd 和 PowerShell 不支持 POSIX 风格的 NODE_ENV=development node app.js 写法。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
正确做法是安装并使用 cross-env:
-
npm install --save-dev cross-env(必须本地安装,不能全局) - 在
package.jsonscripts 中写:"dev": "cross-env NODE_ENV=development node index.js" - 在
launch.json中用runtimeExecutable: "cross-env"+runtimeArgs: ["NODE_ENV=development", "node"]
别在 args 字段里硬塞 NODE_ENV=xxx —— args 是传给 Node.js 的参数,不是 Shell 命令,环境变量不会被识别。
require('dotenv').config() 必须放在入口文件最前面
顺序错了,process.env 就永远拿不到值。哪怕只差一行,也可能在 app.listen() 或数据库连接前就崩溃。
常见陷阱:
- 把它写在
import语句之后(ESM 下import 'dotenv/config'是等效替代,但也要在其他 import 之前) - 路径写错:
require('dotenv').config({ path: './config/.env' })里的路径是相对于当前 JS 文件,不是package.json - 文件编码含 BOM 或不可见字符,导致
dotenv解析失败(用 VSCode 右下角编码切换为 UTF-8 无 BOM)
验证方式很简单:console.log(process.env.PORT) 放在 config() 调用后立即执行,不是靠重启看服务是否起来。
.env 文件本身只是个约定俗成的文本容器,没人强制它生效——你得亲手把变量塞进每个进程里。

















