VSCode 从不自动加载 .env 文件,所有变量生效均源于手动注入;调试时仅通过 launch.json 的 envFile(需写为 "${workspaceFolder}/.env")临时注入,且不监听文件变更、不支持 .env.local 或 NODE_ENV 分环境加载。

VSCode 本身从不“自动加载” .env 文件——所以不存在“重置自动加载”这回事,你看到的变量生效,一定是某处手动注入的结果。
为什么 launch.json 的 envFile 配置看起来像“自动加载”
它只在调试时起作用,且仅限当前调试会话。一旦你关掉调试器,process.env 里那些变量就消失了。
-
envFile字段必须写成"${workspaceFolder}/.env",不能是"./.env"或裸文件名,否则路径解析失败 - 修改
.env后必须重启调试会话,VSCode 不监听文件变更 - 它不支持
.env.local自动合并,也不识别NODE_ENV=development然后去加载对应文件 - 如果调试时
process.env.MY_VAR还是undefined,先检查launch.json里的type是不是"node"(不是"pwa-node"),再确认该配置项在当前选中的configuration下
终端里所谓的“自动加载”其实是假象
VSCode 终端根本不会读 .env,也不会 source 它。你看到变量存在,大概率是因为:
- 你在
package.json的scripts中用了cross-env,比如"dev": "cross-env NODE_ENV=development node index.js" - 你在入口 JS 文件顶部写了
require('dotenv').config()或import 'dotenv/config',变量是在 Node 进程启动后才注入的 - 你改过
terminal.integrated.profiles.*,让 shell 启动时执行了source ~/.vscode-env这类命令 - 你误以为插件(如 DotENV)能自动注入——它只做语法高亮,不碰
process.env
想彻底“清空”终端里的环境变量,得从源头下手
别指望 VSCode 提供一个“重置 env 加载”的按钮。真正可控的做法是明确切断每个注入点:
- 删掉
launch.json里的envFile字段,或注释掉整条配置 - 检查
package.json的scripts,把所有cross-env命令换成原生node调用(比如改成"dev": "node index.js") - 在代码里搜索
dotenv,删掉或注释掉require('dotenv').config()或import 'dotenv/config'——这是最常被忽略的一环 - 打开
settings.json,确认没有terminal.integrated.env这类全局注入配置;如果有,删掉整个env对象 - 如果用过自定义 profile(比如
args: ["-c", "source ~/.vscode-env && exec zsh -i"]),直接删掉对应 profile 定义,并重启终端面板
最容易被忽略的点:工作区级 settings.json 优先于用户级
你以为改了全局设置就生效了?不一定。VSCode 会先读 .vscode/settings.json(项目根目录下),它里面的 terminal.integrated.env 或 python.terminal.useEnvFile 会覆盖你用户设置里的同名项。删之前,先看一眼项目里有没有这个文件。


















