vscode 不自动读取 .env 文件,环境变量需手动注入:调试时通过 launch.json 的 envfile 字段加载,终端中需用 cross-env 或 require('dotenv').config(),且路径、编码、执行顺序均需正确。

VSCode 本身不读取 .env 文件,也不会自动把里面的变量注入到 Node.js 进程里——所有“变量没生效”的问题,根源都在这里。
launch.json 的 envFile 字段只对调试器生效
这是最常用、也最可控的方式:让 VSCode 调试器在启动时加载 .env 并注入环境变量,但仅限当前调试会话,不影响终端或 npm run 命令。
- .env 文件必须放在项目根目录(与
package.json同级),否则envFile路径容易写错 - 配置写法必须是:
"envFile": "${workspaceFolder}/.env",不能写成"./.env"或"/.env" - 它只读一个文件,不支持自动合并
.env.local或按 NODE_ENV 加载不同文件——要多文件就得手动处理或改用其他方案 - 如果调试时仍看到
process.env.MY_VAR是undefined,先检查launch.json是否在正确的 configuration 下配置了该字段,且type确实是"node"
终端里运行 node 命令时 .env 不生效的常见原因
VSCode 内置终端默认完全忽略 .env 文件,node index.js 直接执行时,process.env 里不会出现 .env 里的任何键值。
- Windows 的 cmd/PowerShell 不支持
NODE_ENV=development node index.js这种写法,会报错或静默失败 - macOS/Linux 的 bash/zsh 虽支持,但 VSCode 终端默认不加载 shell 配置(比如 ~/.zshrc),所以即使你本地装了
dotenv-cli,也可能找不到命令 - 推荐做法:在
package.json的scripts中用cross-env,例如:"dev": "cross-env NODE_ENV=development node index.js" - 别在
launch.json的args字段里硬塞NODE_ENV=xxx——args是传给 Node.js 的参数,不是 Shell 环境变量声明
require('dotenv').config() 必须放在入口文件最顶部
这是代码侧唯一可靠的方式,但它有严格顺序要求:必须在任何依赖环境变量的逻辑之前执行,否则就晚了。
- ESM 项目中,
import 'dotenv/config'也得写在所有其他import之前,否则模块初始化时变量还没加载 - 路径错误很隐蔽:比如
require('dotenv').config({ path: './config/.env' }),这里的./config/.env是相对于当前 JS 文件,不是项目根目录 - 文件编码出问题也会导致解析失败——用 VSCode 打开 .env,确认右下角显示的是
UTF-8,没有 BOM;如果有,另存为无 BOM 的 UTF-8 - 别指望插件(比如 DotENV)帮你自动加载——它只提供语法高亮和 IntelliSense,不执行任何
require或process.env注入
调试时变量存在但终端里读不到,不是 bug 是设计
VSCode 的调试器、内置终端、npm scripts 三者环境完全隔离,各自加载变量的机制不同,不能互相替代或假设同步。
- 你在
launch.json里配了envFile,只影响 F5 启动的调试进程;终端里console.log(process.env)依然为空 - 你在
package.json里用了cross-env,只影响npm run dev;调试器不会自动复用这个配置 - 如果你同时需要调试和终端命令都生效,最轻量的做法是:入口文件顶部加
require('dotenv').config(),并确保 .env 在根目录——这样无论怎么启动都有效 - 复杂点在于多环境管理:.env.development、.env.production 等文件需要手动切换路径或借助 dotenv-expand 等扩展,VSCode 自身不提供环境感知加载逻辑











