vscode不解析.env文件,变量生效依赖运行时加载;launch.json的envfile仅对调试生效,需用${workspacefolder}路径;终端需cross-env,代码中require('dotenv').config()须在最顶部且路径正确。

VSCode 本身不读取、不解析、不注入任何 .env 文件——所有“变量没生效”的问题,都出在运行时加载环节,而不是编辑器配置。
launch.json 的 envFile 字段只对调试生效
这是最常用且无需改代码的方式,但仅限于 VSCode 调试器启动的 Node.js 进程。
- 确保
.env文件放在项目根目录(与package.json同级),编码为 UTF-8 无 BOM(右下角查看,点“Save with Encoding” → “UTF-8”) - 在
.vscode/launch.json的某个配置中添加envFile字段,路径必须用${workspaceFolder}表达式,例如:"envFile": "${workspaceFolder}/.env" - 不要写成
./.env或.env(相对路径在某些版本中不稳定),也不要指望它自动合并.env.local或覆盖逻辑 - 修改
.env后必须重启调试会话,VSCode 不会热重载该文件
终端里运行 node 命令时 .env 不生效?别怪 VSCode
VSCode 内置终端是独立 shell 进程,它和编辑器解耦,不会自动 source 或解析 .env 文件。
- Windows cmd/PowerShell 不支持
NODE_ENV=development node index.js这种写法,会报错或静默忽略 - 正确做法是安装本地
cross-env:npm install --save-dev cross-env,然后在package.json的 scripts 中写:"dev": "cross-env NODE_ENV=development node index.js" - 如果要用 launch.json 启动带环境变量的终端命令,
runtimeExecutable设为"cross-env",runtimeArgs设为["NODE_ENV=development", "node", "index.js"];别把环境变量塞进args字段里——那是传给 Node.js 的参数,不是 shell 环境
require('dotenv').config() 必须在入口文件最顶部
这是代码侧唯一可靠的加载方式,但顺序和路径极易出错。
- ESM 下推荐写法:
import 'dotenv/config';,且必须在所有其他import之前(包括import { createServer } from 'http') - CommonJS 下:
require('dotenv').config();必须在const app = express();或数据库连接前执行,差一行就可能崩溃 - 路径错误很常见:
require('dotenv').config({ path: './config/.env' })中的路径是相对于当前 JS 文件,不是项目根目录;若入口是src/index.js,而.env在根目录,应写{ path: '../.env' } - 文件含 BOM 或不可见 Unicode 字符(比如零宽空格)会导致
dotenv静默失败,process.env全为空——用 VSCode 打开.env,切换到纯文本模式检查是否有异常字符
DotENV 插件只负责高亮,跟运行无关
装了插件后 .env 文件有颜色,不代表变量能被 Node.js 读到。
- 右下角语言模式必须是
Environment(点击 Plain Text 切换),否则插件不触发高亮 - 自定义文件名如
.env.staging需手动在settings.json中配置:"files.associations": { "*.staging": "environment" } - 插件完全不参与运行时加载,
process.env.API_URL依然 undefined 是正常现象——它只是帮你少写错一个等号
最容易被忽略的是:envFile 和 require('dotenv').config() 是两条独立路径,可以共存,也可以只用其一;但如果你同时用了,要注意变量优先级——envFile 加载的变量会覆盖 dotenv 解析的同名变量,而系统环境变量又会覆盖这两者。调试时看到的值,未必是你代码里真正拿到的值。











